1、Windows程式開發流程:
Windows 程式分為「程式代碼」和「UI資源」兩大部分,通過RC編譯器整合為一個完整的EXE 檔案,
所謂UI 資源是指功能選單、對話框外貌、程式圖示、游標形狀等等東西,
這些UI 資源的實際內容(二進制代碼)系借助各種工具產生,并以各種擴展名存在,如.ico、.bmp、.cur 等等,程式員必須在一個所謂的資源描述檔(.rc)中描述它們,
RC 編譯器(RC.EXE)讀取RC 檔的描述后將所有UI資源檔集中制作出一個.RES 檔,再與程式代碼結合在一起,這才是一個完整的Windows可執行檔案,
2、Windows程式與作業系統之間的關系
Windows 程式的進行系依靠外部發生的事件來驅動,換句話說,程式不斷等待(利用一個while 回路),等待任何可能的輸入,然后做判斷,然后再做適當的處理,上述的「輸入」是由作業系統捕捉到之后,以訊息形式(一種資料結構)進入程式之中,
3、Windows視窗生命周期如下:
1.程式初始化程序中呼叫CreateWindow,為程式建立了一個視窗,作為程式的螢屏舞臺,CreateWindow產生視窗之后會送出 wM_CREATE直接給視窗函式,后者于是可以在此時做些初始化操作(例如配置記憶體、打開檔案、讀初始資料……),
2在程式活著的程序中,不斷以 GetMessage從訊息佇列中抓取訊息,如果這個訊息是WM_oUIT,GetMessage會傳回0而結束while回圈,進而結束整個程式,
3.DispatchMessage通過Windows USER模塊的協助與監督,把訊息分派至視窗函式,訊息將在該處被判別并處理,
4.程式不斷進行第2步和第3步的操作,
5.當使用者按下系統選單中的Close命令項時,系統送出WM_CLOSE,通常程式的視窗函式不攔截此訊息,于是 DefWindowProc處理它,
6.DefWindowProc收到 WM_CLOSE后,呼叫 DestroyWindow把視窗清除,Destroy Window本身又會送出WM_DESTROY,
7.程式對WM_DESTROY的標準反應是呼叫PostQuitMessage,
8.PostQuitMessage沒什么其它操作,就只送出 WM_QUIT 訊息,準備讓訊息回圈中的GetMessage取得,如步驟2,結束訊息回圈,
3.Windows表單原理
Windows的三大核心系統:負責視窗物件產生和訊息分發的USER模塊,負責影像顯示繪制的GDI模塊,負責記憶體、行程、IO管理的KERNEL模塊,
試想象一下如何在一個像素陣列上產生視窗物件,其實就是使用GDI繪制視窗,不停的以一定的頻率重繪顯示在螢屏上,這就是圖形界面,如果由在DOS或Windows DOS模擬器下撰寫圖形界面的經驗這個比較好理解,所以說其實USER模塊中的視窗產生是依靠GDI模塊的(包括選單、滾動條等都是使用GDI來繪制的),
那么,下面我們就從USER模塊和GDI模塊來說說Windows 的表單原理,
如果接觸過Win32 SDK編程的知道一個標準Windows表單的產生程序:
- 設計視窗類、
- 注冊視窗類、
- 創建視窗、
- 顯示視窗、
- 啟動訊息回圈泵回圈獲取訊息分發到表單程序函式處理,
貼上一個標準Windows表單的產生代碼:
#include <windows.h> LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("視窗類名稱"); HWND hwnd; MSG msg; WNDCLASSEX wndclassex = {0}; //設計視窗類 wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = WndProc; wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; wndclassex.hInstance = hInstance; wndclassex.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclassex.hCursor = LoadCursor (NULL, IDC_ARROW); wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclassex.lpszMenuName = NULL; wndclassex.lpszClassName = szAppName; wndclassex.hIconSm = wndclassex.hIcon; //注冊視窗類 if (!RegisterClassEx (&wndclassex)) { MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR); return 0; } //產生視窗 hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, szAppName, TEXT ("視窗名稱"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); //顯示視窗 ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); //啟動訊息回圈泵回圈獲取訊息分配到表單程序函式處理 while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } //表單程序函式 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (message) { case WM_CREATE: return (0); case WM_PAINT: hdc = BeginPaint (hwnd, &ps); EndPaint (hwnd, &ps); return (0); case WM_DESTROY: PostQuitMessage (0); return (0); } return DefWindowProc (hwnd, message, wParam, lParam); }
需要明白的是,所有Windows的表單及控制元件歸根結底都是使用CreateWindow或CreateWindowEx來創建的,他們都需要標準Windows表單的產生程序,
普通的表單好理解,主要需要弄清楚是對話框及控制元件的產生和訊息分派處理流程,
對話框及其子控制元件的管理依靠Windows內建的對話框管理器,對話框管理器的作業包括:
1.根據我們在資源設計器中設計的對話框及子控制元件產生的.rc檔案來自動生成對話框和子控制元件(如果有手動撰寫.rc檔案的經歷的話,知道撰寫RC檔案其實就是指定視窗和子控制元件大小、型別、樣式等引數,對話框管理器將這些引數傳入CreateWindow函式產生表單)
2.模態對話框直接顯示表單,非模態對話框訊息指明WS_VISIBLE屬性的話,需要呼叫ShowWindow來顯示表單,
3.維護一個訊息回圈泵,對于模態對話框來說這個訊息泵的訊息不經過父視窗,所以表現為模態;對于非模態對話框這個訊息泵訊息經過主視窗,必須由主視窗傳給非模態對話框,表現為非模態,
4.維護一個內建的表單程序函式,對于對話框來說會處理對話框的關閉打開及子視窗的焦點、tab等,對于子控制元件也是一樣,每個子控制元件會有自己型別的表單程序函式,表單程序函式處理子控制元件的獲得或失去焦點、按下或彈起、創建等表現樣式和行為,
對于對話框來說,他會開放一個對話框程序函式,讓部分訊息先通過對話框管理函式處理,如果對話框程序函式不處理才交給默認的內建程序函式處理,對于子控制元件來說,他們并沒有開放程序函式,而是由內建表單函式將要處理的訊息發給父視窗處理,
那么對話框管理器完成了標準Windows表單的產生中后半部分作業,至于設計視窗類和注冊視窗類這是由Windows自己預先做好了的,如常見的“button”、“listbox”、“edit”類等等,
那么既然所有的表單(包括對話框和控制元件)產生程序一樣,那么我們就可以將對話框管理器的部分作業替換掉:
1.不使用對話框讀取.rc模板的方式,直接將引數傳遞給CreateWindow函式來創建對話框和控制元件,這就是常見的動態創建控制元件原理,
2.設定控制元件自繪制如BS_OWNDRAW屬性,開放控制元件的WM_DRAWITEM訊息給父視窗,由父視窗來繪制按鈕樣式,這就是常見的控制元件重繪原理,
3.替換內建的表單函式,將訊息傳到自定義的表單程序函式處理,這就是常見的控制元件子類化原理,
需要Windows作業系統和開發工具的小伙伴,可以加群免費領取噢~

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/236878.html
標籤:C++
上一篇:C++ 時間 & 日期
下一篇:Vscode下載與配置(C語言)
