win32 api Windows窗口的創建


windows窗口的創建有以下幾個步驟:

1、創建注冊窗口類

2、創建窗口句柄

3、顯示更新窗口

4、消息循環

1、創建注冊窗口類

所謂創建窗口類就是定義一個WNDCLASS類對象,並將該對象進行初始化。之后就要用RegisterClass()函數對該窗口類對象進行注冊,以便使某個窗口與該窗口類相關聯。

關於WNDCLASS的定義如下:

 typedef struct {
    UINT style;
    WNDPROC lpfnWndProc;
    int cbClsExtra;
    int cbWndExtra;
    HINSTANCE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCTSTR lpszMenuName;
    LPCTSTR lpszClassName;
} WNDCLASS, *pWNDCLASS;

成員:
style

描述類風格。該成員可以是“Class Styles”的任意組合,styly可以取的值如下所示:

CS_VREDRAW 垂直重畫
CS_HREDRAW
水平重畫
CS_OWNDC
獨占設備描述表
CS_SAVEBITS
保存窗口覆蓋區
CS_DBCLKS
允許兩次連續按動
CS_BYTEALLGNCLIENT
鼠標用戶區域按字節對齊顯示
CS_BYTEALLGNWINDOW
鼠標用戶窗口按字節對齊顯示
CS_NOCLOSE
系統菜單中沒有CLOSE菜單項

lpfnWndProc
    指向窗口過程的函數指針。必須使用CallWindowProc函數調用窗口過程。
cbClsExtra
    
表示窗口類結構之后分配的額外的字節數。系統將該值初始化為0
cbWndExtra
    
表示窗口實例之后分配的額外的字節數。系統將該值初始化為0。如果使用資源文件里的CLASS指令創建對話框,並用WNDCLASS注冊該對話框時,cbWndExtra必須設置成DLGWNDOWEXTRA
hInstance
    
包含該類實例的句柄,該實例包含了窗口過程。一般直接賦上WinMain()hInstance參數值即可。
hIcon
    
類圖標的句柄。該成員必須為一個圖標資源的句柄。可以使用LoadIcon()函數加載圖標。如果hIconNULL,系統將提供默認圖標
hCursor
    
鼠標指針的句柄。改成員必須為一個指針資源的句柄。可以使用LoadCursor()去加載光標。如果hCursorNULL,應用程序必須在指針移入應用程序窗口時顯式設置指針類型。
hbrBackground
    背景畫刷的句柄。該成員或者是用於繪制背景的物理畫刷的句柄,或者是一個顏色值。顏色值必須為如下“標准系統顏色值”(1必須加到選定顏色中)

BLACK_BRUSH   
DKGRAY_BRUSH
GRAY_BRUSH
HOLLOW_BRUSH  
空畫刷(相當於NULL_BRUSH) 
LTGRAY_BRUSH
NULL_BRUSH    
等同於HOLLOW_BRUSH
WHITE_BRUSH   
BLACK_PEN
WHITE_PEN
NULL_PEN
SYSTEM_FONT  
默認情況下,系統使用系統字體去繪制菜單、控制對話框和文本等。
DEFAULT_PALETTE  
默認的調色板,這個調色板由系統調色板中的靜態顏色組成。

如果顏色值給定后,必須將該值轉換成如下HBRUSH類型:

COLOR_ACTIVEBORDER
    COLOR_ACTIVECAPTION
    COLOR_APPWORKSPACE
    COLOR_BACKGROUND
    COLOR_BTNFACE
    COLOR_BTNSHADOW
    COLOR_BTNTEXT
    COLOR_CAPTIONTEXT
    COLOR_GRAYTEXT
    COLOR_HIGHLIGHT
    COLOR_HIGHLIGHTTEXT
    COLOR_INACTIVEBORDER
    COLOR_INACTIVECAPTION
    COLOR_MENU
    COLOR_MENUTEXT
    COLOR_SCROLLBAR
    COLOR_WINDOW
    COLOR_WINDOWFRAME
    COLOR_WINDOWTEXT

當調用UnregisterClass時,系統自動刪除背景畫刷。應用程序不應刪除這些畫刷。
    
hbrBackgroundNULL時,應用程序必須在繪制客戶區域時繪制它自己的背景。為了確定背景是否一定要繪制,應用程序或者可以處理 WM_ERASEBKGND消息,或者測試PAINTSTRUCTfErase成員。PAINTSTRUCT是由BeginPaint函數填充的。

lpszMenuName
    
指向NULL結束的字符串,該字符串描述菜單的資源名,如同在資源文件里顯示的名字一樣。若使用一個整數標識菜單,可以使用MAKEINTRESOURCE宏。如果lpszMenuNameNULL,那么該窗口類的窗口將沒有默認菜單。
lpszClassName
    
指 向NULL結束的字符串,或者是一個原型(atom)。若該參數是一個原型,它必須是一個有先前調用RegisterClass或者RegisterClassEx函數產生的類原型。類原型必須作為lpszClassName的低字,高字必須為0.lpszClassName是一個 字符串,它描述了窗口類名。這個類名可以是由RegisterClass或者RegisterClassEx注冊的名字,或者是任何預定義的控件類名。
結構信息。

 

2、創建窗口句柄

HWND hWnd ;
 hWnd = CreateWindowEx(WS_EX_TOPMOST , 
     "CreateWindows" ,
     "測試" ,
     WS_POPUP ,
     0 , 
     0 ,
     1024 ,
     768 ,
     NULL ,
     NULL ,
     hInstance ,
     NULL) ;
 if(!hWnd)
 {
  return FALSE ;
 }

 

3、顯示更新窗口

ShowWindow(hWnd , nCmdShow) ;
 UpdateWindow(hWnd) ;

4、消息循環

MSG msg ;
 while(true)
 {
  if(PeekMessage(&msg , NULL , 0U , 0U , PM_REMOVE))
  {
   TranslateMessage(&msg) ;
   DispatchMessage(&msg) ;
  }
 }


免責聲明!

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



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