標籤:
windows下建立一個基於GUI的視窗程序很簡單,使用MFC或者Win32 API都可以實現。本文簡單整理下windows API建立GUI應用程式的基本編碼架構。
比較常見的視窗包括:桌面視窗、應用程式視窗、對話方塊及控制項。從編程的角度而言,建立GUI應用程式需要提供入口函數WinMain的實現,其定義格式如下:
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
這裡不解釋其具體含義,感興趣的可參考《Windows程式設計》或者msdn上相關資料。
WinMain通常包含以下幾個過程:
1. 註冊視窗類別(window class);
2. 建立視窗(CreateWindow);
3. 訊息迴圈(視窗過程回調、訊息佇列)。
如果使用作業系統已經定義的視窗類別,可以省略第一步;如果不需要自訂視窗訊息處理機制,也可以省略第三步(有些資料直接調用對話方塊的預設實現,來給出最短的windows程式實現,基本上就是基於此原理)。
關於視窗類別的資料介紹,可以參考下我前段時間整理的“視窗類別(Window Class)概述”。
如果將上面三個步驟和c++程式設計語言對比下,第一步註冊視窗類別,就是為了給出新的類型的聲明和實現,這個類型內部包含了一些必要的屬性和方法,只不過作業系統提供的api在尋找該類型時使用的類型名字(字串);第二步建立視窗就是類執行個體化的過程,這裡需要指定要建立的類名稱(字串);第三步就是針對先前執行個體化類型變數的調用規約,需要按照作業系統提供的約定來使用(訊息處理及傳遞)。
下面是CreateWindowEx函數的聲明。
HWND WINAPI CreateWindowEx( _In_ DWORD dwExStyle, _In_opt_ LPCTSTR lpClassName, _In_opt_ LPCTSTR lpWindowName, _In_ DWORD dwStyle, _In_ int x, _In_ int y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam);
這裡面的所有參數基本就是一個視窗用於的可定製的屬性。不如視窗名稱、視窗樣式(Window Style,WS_XXX的原型)、視窗啟動的位置、菜單、父視窗等。
需要說明的是CreateWindowEx函數的傳回值,hwnd。在msdn中關於HWND類型的說明只有一句話,handle to a window,顧名思義視窗控制代碼,指向某個視窗的控制代碼。儘管vs中HWND的定義要不是void *,要不是int類型,但從實際使用來看,視窗控制代碼是全域的,屬於作業系統維護的,而且可以跨進程使用的,也許這也是 FindWindow函數的一種實現方法(另外一種說法是微軟為了保持和16位作業系統相容而提供的這種機制)。鑒於此,HWND可以看成是作業系統維護的內部結構,應用程式不應該試圖瞭解改結果的內部實現。
Windows下GUI編程——視窗