1. GUI程序开发概述编程
(1)现代操做系统提供原生SDK支持GUI程序开发windows
(2)GUI程序开发是现代操做系统上的主流技术函数
(3)不一样操做系统上的GUI开发原理相同ui
(4)不一样操做系统上的GUI SDK不一样spa
2. GUI程序开发原理操作系统
(1)GUI程序在运行时会建立一个消息队列翻译
(2)系统内核将用户操做翻译成对应的程序消息code
(3)程序在运行过程当中须要实时处理队列中的消息orm
(4)当队列中没有消息时,程序将处于停滞状态blog
(5)不一样操做系统支持相同的GUI开发原理
3. GUI程序开发的本质
(1)在代码中用程序建立窗口及窗口元素
(2)在消息处理函数中根据程序消息作出不一样的响应
经典GUI程序开发模式
4. GUI程序开发实例
(1)多数操做系统以C函数的方式提供GUI SDK
(2)以Windows操做系统为例
函数名 |
功能 |
RegisterClass |
向系统注册GUI窗口样式 |
CreateWindow |
建立窗口或窗口元素 |
ShowWindow |
在屏幕上显示建立好的窗口 |
UpdateWindow |
刷新屏幕上的窗口 |
GetMessage |
获取程序消息队列中的消息 |
TranslateMessage |
翻译系统消息 |
DispatchMessage |
将消息发送到窗口处理函数 |
【编程实验】GUI程序开发初体验
#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; }
5. 小结
(1)现代操做系统提供原生SDK支持GUI程序开发
(2)不一样操做系统上的GUI SDK不一样
(3)不一样操做系统上的GUI开发原理相同
(4)GUI程序开发包括:
①在代码中用程序建立窗口及窗口元素
②在消息处理函数中根据程序消息作出不一样响应