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 }