Windows下GUI編程——窗口


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可以看成是操作系統維護的內部結構,應用程序不應該試圖了解改結果的內部實現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM