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程序開發包括:
①在代碼中用程序建立窗口及窗口元素
②在消息處理函數中根據程序消息作出不一樣響應