win32下創建窗口


win32下創建窗口

一、創建所使用函數解析

1.1 入口函數WinMain
   1.2 窗口處理函數
     當窗口處理消息事件時,系統調用該函數
      LRESULT CALLBACK WindowProc(
   HWND hwnd,      // 窗口的句柄
   UINT uMsg,      // 消息的ID號
   WPARAM wParam,  // 消息所對應的參數
   LPARAM lParam   // 消息所對應的參數
  );
   1.3 注冊窗口類型
      typedef struct _WNDCLASS {
    UINT    style;  //窗口類的風格:不是窗口類型的風格
    WNDPROC lpfnWndProc; //窗口處理函數
    int     cbClsExtra; //窗口類附加數據大小
    int     cbWndExtra; //窗口附加數據大小
    HANDLE  hInstance; //當前應用程序的實例句柄
    HICON   hIcon; //窗口圖標
    HCURSOR hCursor; //窗口的鼠標
    HBRUSH  hbrBackground; //窗口的背景畫刷
    LPCTSTR lpszMenuName; //菜單
    LPCTSTR lpszClassName; //類型名稱:不是窗口標題的名稱,只是注冊的名稱
    } WNDCLASS;
   
    注冊函數 RegisterClass
   1.4 創建窗口
       HWND CreateWindow(
    LPCTSTR lpClassName,  //窗口類型名稱
    LPCTSTR lpWindowName, //窗口名稱
    DWORD dwStyle,        //窗口類型
    int x,                //窗口的左上角X坐邊
    int y,                //窗口的左上角X坐邊
    int nWidth,           //窗口的寬度
    int nHeight,          //窗口的高度
    HWND hWndParent,      //父窗口句柄
    HMENU hMenu,          //窗口菜單句柄
     HANDLE hInstance,     //應用程序的實例句柄
     LPVOID lpParam        //創建的參數,一般為NULL
    );

   1.5 顯示窗口
     ShowWindow 顯示窗口
          BOOL ShowWindow(
     HWND hWnd,     //顯示的窗口句柄
      int nCmdShow   //顯示的方式
     );
     UpdateWindow 刷新窗口
   1.6 消息處理
     GetMessage 獲取消息
     DispatchMessage 派發消息
   
   1.7 程序退出
     窗口銷毀時,退出程序。在WndProc中實現。
        WM_DESTROY: 當窗口銷毀時,會調用WndProc
          傳遞給使用者。
        PostQuitMessage:發送一個退出消息。

二、代碼示例

 

  1 #include <windows.h>
  2 
  3 HINSTANCE g_hInst = NULL;
  4 
  5 //2 窗口處理函數
  6 LRESULT CALLBACK WndProc( HWND hWnd, 
  7                           UINT nMsg, 
  8                           WPARAM wParam,
  9                           LPARAM lParam )
 10 {
 11     //判斷消息ID
 12     switch( nMsg )
 13     {
 14     case WM_DESTROY: //窗口銷毀的消息
 15         PostQuitMessage( 0 ); //發送退出消息
 16         return 0;
 17     }
 18     //調用缺省的消息處理程序
 19     return DefWindowProc( hWnd, nMsg, 
 20         wParam, lParam );                   
 21 }
 22 
 23 //3 注冊窗口類型
 24 BOOL MyRegister( LPSTR pszClassName )
 25 {
 26     WNDCLASS wc = {0};
 27     ATOM  nAtom = 0;
 28     //構造注冊窗口的參數
 29     wc.style         = CS_VREDRAW|CS_HREDRAW;
 30     wc.lpfnWndProc   = WndProc;
 31     wc.cbClsExtra    = 0;
 32     wc.cbWndExtra    = 0;
 33     wc.hInstance     = g_hInst;
 34     wc.hIcon         = NULL;
 35     wc.hCursor       = NULL;
 36     wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE);
 37     wc.lpszMenuName  = NULL;
 38     wc.lpszClassName = pszClassName;
 39     //注冊窗口
 40     nAtom = RegisterClass( &wc );
 41     if( 0 == nAtom )
 42     {
 43         MessageBox( NULL, "Register Failed",
 44           "Error", MB_OK|MB_ICONWARNING );
 45         return FALSE;
 46     }
 47     else
 48     {
 49         MessageBox( NULL, "Register Successed",
 50           "Successed", MB_OK );
 51     }
 52     return TRUE;
 53 }
 54 
 55 //4 窗口創建
 56 HWND MyCreate( LPSTR pszClassName )
 57 {
 58     HWND hWnd = NULL;
 59     //創建窗口
 60     hWnd = CreateWindow( pszClassName, 
 61             "HelloWnd", WS_OVERLAPPEDWINDOW,
 62             100, 100, 300, 500, NULL, NULL,
 63             g_hInst,    NULL );
 64     if( NULL == hWnd )
 65     {
 66         MessageBox( NULL, "CreateWnd Failed", 
 67           "Error", MB_OK );
 68         return NULL;
 69     }
 70   MessageBox( NULL, "CreateWnd Successed", 
 71           "Successed", MB_OK );
 72     return hWnd;
 73 }
 74 
 75 //5 顯示窗口
 76 void DisplayWnd( HWND hWnd )
 77 {
 78     //顯示
 79     ShowWindow( hWnd, SW_SHOW );
 80     //刷新
 81     UpdateWindow( hWnd );
 82 }
 83 //6 消息處理
 84 void Message( )
 85 {
 86     MSG msg = { 0 };
 87     //消息循環處理,獲取消息
 88     while( GetMessage( &msg, NULL, 0, 0 ) )
 89     {
 90         //派發消息
 91         DispatchMessage( &msg );
 92     }
 93 }
 94 //1 入口函數
 95 int WINAPI WinMain( HINSTANCE hInst,
 96                     HINSTANCE hPrevInst,
 97                     LPSTR pszCmdLine,
 98                     int   nShowCmd )
 99 {
100     HWND hWnd = NULL;
101     g_hInst = hInst;
102     //注冊窗口類型
103     MyRegister( "MyWnd" );
104     //創建注冊類型的窗口
105     hWnd = MyCreate( "MyWnd" );
106     //顯示窗口
107     DisplayWnd( hWnd );
108     //消息處理
109     Message( );
110     return 0;
111 }

 

 

 


免責聲明!

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



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