Windows API視窗程式設計 - 空白視窗

1136863240發表於2019-07-28

流程介紹

建立一個視窗一共需要6步:
- 註冊類
- 建立視窗獲取控制程式碼
- 進入回撥
- 顯示視窗
- 更新視窗
- 獲取訊息

程式碼解釋

在註冊類之前我們先要建立基本的程式碼框架,也就是編寫WinMain函式,這是Windows視窗程式的入口函式名,相當於控制檯下的main函式,WinMain的定義為:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
引數列表解釋:
- hInstance:當前執行的例項控制程式碼
- hPrevInstance:上一個例項的控制程式碼,不過這個控制程式碼基本沒用了
- szCmdLine:傳遞給應用程式的命令列引數
- iCmdShow:指定程式的視窗的顯示方法
註冊類用的是RegisterClass函式,RegisterClass只有一個引數用於接收WNDCLASSW型變數。 WNDCLASSW是作為一個結構體tagWNDCLASSW的別名,tagWNDCLASSW的結構如下:enter image description here

而我們的引數使用如下: enter image description here

視窗型別為CS_HREDRAW,該型別的意思是:移動或者調整視窗的高度(垂直方向)時,重繪整個視窗。 回撥函式後的兩個擴充套件一般都是填0的。
Icon使用預設應用程式圖示資源,Cursor使用箭頭游標。
背景色為白色,當然也可以改成黑色或是灰色。
無選單欄。
類名我們定義為MainWindow,當然定其他的名字也可以,但最好避免定義如button之類的系統內定的字串,字串不區分大小寫,這點我專門測試過。建立一個按鈕,類名寫“BuTton”都可以,但目前我們不需要太關心這個,只是順便提一下。
寫完了WNDCLASS的配置後,就可以用RegisterClass(&wndclass);來註冊類了。

註冊類後,我們就可以通過CreateWindow來獲取視窗控制程式碼,CreateWindow函式的定義如下:enter image description here

enter image description here

而我們的呼叫如下:enter image description here

在呼叫之前,我們獲取了螢幕的寬高,以便計算讓視窗位於螢幕的中間,當然也可以用CW_USEDEFAULT,在dwStyle中傳入WS_OVERLAPPEDWINDOW後可以用CW_USEDEFAULT來使視窗位於螢幕中間。
建立視窗後程式就會進入WndProc回撥函式,該回撥函式的定義如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
名稱不一定非要是WndProc不可,換成其他的也可以,甚至是ABCProc,但必須要與註冊類時使用的回撥函式名稱一樣,否則將會回撥失敗。
接下來就是回撥函式的實現:enter image description here

其中hwnd是視窗控制程式碼。
message是傳回來的視窗訊息。
後面兩個都是額外的引數,使用方面沒什麼兩樣,主要區別在於wParam偏向資料本身,而lParam偏向結構體,不理解就當一樣的東西用好了,問題不太大。
在截圖上我們處理了一個叫WM_DESTROY的視窗訊息,在用Windows API建立視窗後,如果關閉視窗,就會發出這個訊息,但如果不做處理那只是視窗被關閉了,程式依然會留在記憶體中,所以我們在接收到訊息後就呼叫PostQuitMessage(0);來退出程式。
而其他的訊息則交給預設的處理方法DefWindowProc。

最後

現在我們已經寫完了能建立一個600 * 400的視窗的程式了,但別急著編譯執行,先檢查一下語法是否正確,括號是否寫全,我在截圖中沒有顯示出來的括號有沒有補上去,請檢查一下。
檢查完了嗎?那麼請編譯執行吧,用G++也可以,用Visual Studio也可以,編譯執行後就會出現一個空白視窗了,截圖如下:enter image description here

現在空白視窗我們就建立完畢了。

相關文章