一、GUI应用程序的概述
1、现代操作系统支持GUI界面
(1)、现代操作系统提供原生SDK支持GUI程序开发
(2)、GUI程序开发是现代操作系统上的主流技术
(3)、不同操作系统上的GUI开发原理相同
(4)、不同操作系统上的GUI SDK不同
2、GUI应用程序开发原理
(1)、GUI应用程序在运行时会创建一个消息队列
(2)、系统内核将用户的操作翻译成对应的程序消息
(3)、程序运行过程中需要实时处理队列中的消息
(4)、当队列中没有消息时,程序将处于停滞状态
(5)、不同的操作系统支持相同的GUI开发原理
3、GUI程序开发的本质
1、GUI程序开发
(1)、在代码中用程序创建窗口及窗口元素
(2)、在消息处理函数中根据程序消息作出不同的相应
(3)、经典GUI开发模式(可视化界面开发+消息映射)
4、GUI程序开发实例
(1)、多数操作系统以c 函数的方式提供GUI SDK
(2)、以Windows操作系统为例
程序分析:
#include <windows.h> #define STYLE_NAME L"MainForm" #define BUTTON_ID 919 //主窗口定义 BOOL DefineMainWindow(HINSTANCE hInstance); //主窗口创建 HWND CreateMainWindow(HINSTANCE hInstance, wchar_t* title); //主窗口内部元素创建函数 HWND CreateButton(HWND parent, int id, wchar_t* text); //主窗口显示函数 HWND DisplayMainWindow(HWND hWnd, int nCmdShow); //主窗口消息处理函数 LRESULT CALLBACK WndProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam); static HWND MainWindow = NULL; //主窗口句柄 BOOL WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG Msg = { 0 }; //1.自定义主窗口样式 if (!DefineMainWindow(hInstance)){ return FALSE; } //2.创建主窗口 MainWindow = CreateMainWindow(hInstance, STYLE_NAME); if (MainWindow) { //3.创建主窗口中的控件元素 CreateButton(MainWindow, BUTTON_ID, L"My Button"); //4.在屏幕上显示主窗口 DisplayMainWindow(MainWindow, nCmdShow); } else { return FALSE; } //5.进入消息循环 while (GetMessage(&Msg,NULL,0,0)) { //6.翻释并转换系统消息 TranslateMessage(&Msg); //7.分发消息到对应的消息处理函数 DispatchMessage(&Msg); } return Msg.wParam; } BOOL DefineMainWindow(HINSTANCE hInstance) { static WNDCLASS WndClass = { 0 };//系统结构类型,用于描述窗口样式 WndClass.style = 0; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW); //定义窗口背景色 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //定义鼠标样式 WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //定义窗口左上角图标 WndClass.hInstance = hInstance; //定义窗口样式属于当前应用程序 WndClass.lpfnWndProc =(WNDPROC)WndProc; //窗口消息处理函数 WndClass.lpszClassName = STYLE_NAME; //窗口样式名 WndClass.lpszMenuName = NULL; //将定义好的窗口样式注册到系统上 return RegisterClass(&WndClass); } HWND CreateMainWindow(HINSTANCE hInstance, wchar_t* title) { HWND hWnd = NULL; hWnd = CreateWindow(STYLE_NAME, //通过定义好的窗口样式创建主窗口 title, //主窗口标题 WS_OVERLAPPEDWINDOW,//创建后主窗口的显示风格 CW_USEDEFAULT, //主窗口左上角x坐标 CW_USEDEFAULT, //主窗口左上角y坐标 CW_USEDEFAULT, //主窗口宽度 CW_USEDEFAULT, //主窗口高度 NULL, //父窗口 NULL, //主窗口菜单 hInstance, //主窗口属于当前应用程序 NULL); return hWnd; } HWND DisplayMainWindow(HWND hWnd, int nCmdShow) { ShowWindow(hWnd, nCmdShow); //显示窗口 UpdateWindow(hWnd); //刷新窗口 return hWnd; } HWND CreateButton(HWND parent, int id, wchar_t* text) { HINSTANCE hInstance = (HINSTANCE)GetWindowLong(parent, GWL_HINSTANCE); HWND hWnd = NULL; hWnd = CreateWindow(L"button", //通过系统预定义的窗口样式创建元素 text, //窗口元素标题 WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,//创建后窗口元素的显示风格 50, //窗口元素在主窗口左上角x坐标 50, //窗口元素在主窗口左上角y坐标 200, //窗口元素宽度 60, //窗口元素高度 parent, //父窗口 (HMENU)id, //窗口元素ID值 hInstance, //窗口元素属于当前应用程序 NULL); return hWnd; } LRESULT CALLBACK WndProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; default: //调用系统提供的默认消息处理函数 return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
二、小结
(1)、现代操作系统提供原生的SDK支持GUI程序开发
(2)、不同操作系统上的GUI SDK不同
(3)、不同操作系统上的GUI开发原理相同
(4)、GUI程序开发包括
A、在代码中用程序创建窗口及窗口元素
B、在消息处理函数中根据程序消息作出不同响应