Windows窗口創建流程:
1、創建入口函數WinMain()
2、註冊窗口類
3、實現回調函數功能
4、顯示窗口
5、更新窗口
6、消息循環
回調函數爲WinProc,具體定義如下:
LRESULT CALLBACK WinProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
函數解析爲:
1、每個窗口會有一個稱爲窗口過程的回調函數(WndProc),它帶有四個參數,分別爲:
窗口句柄(Window Handle) HWND,
消息ID(Message ID) UINT,
和兩個消息參數(wParam, lParam)WPARAM、LPARAM,
WndProc的第一個參數hWnd就是當前接收消息的窗口句柄,第二個參數就是被傳送過來的消息,第三、第四個參數都是附加在消息上的數據,這和MSG結構體是一樣的。
2、LRESULT結構體爲:
LRESULT CALLBACK WinProc( //WinProc名稱可自由定義
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
LRESULT爲窗口程序(WinProc)指針。
//創建入口函數
int WINAPI WinMain(
HINSTANCE hInstance, //應用程序當前實例的句柄。
HINSTANCE hPrevInstance, //應用程序的先前實例的句柄。對於同一個程序打開兩次,出現兩個窗口第一次打開的窗口就是先前實例的窗口。對於一個32位程序,該參數總爲NULL。
LPSTR lpCmdLine, //指向應用程序命令行的字符串的指針,不包括執行文件名。
int ShowCmd //指明窗口如何顯示,具有不同參數
)
{
HWND hWnd=0;
MSG nMsg={0};
/*
MSG:消息結構體
typedef struct tagMSG {
HWND hwnd; //消息所屬的窗口
UINT message; //消息的標識符, 爲WM_XXX宏
WPARAM wParam; //wParam和lParam,用於指定消息的附加信息
LPARAM lParam;
DWORD time; //消息投遞到消息隊列中的時間
POINT pt; //鼠標的當前位置
} MSG;
*/
//註冊窗口類
WNDCLASS cs={0};
/*
WNDCLASS:窗口信息結構體
typedef struct _WNDCLASS {
UINT style;// 窗口類型
WNDPROC lpfnWndProc;//窗口處理函數
int cbClsExtra;//窗口擴展
int cbWndExtra;//窗口實例擴展
HINSTANCE hInstance;//實例句柄
HICON hIcon;//窗口的最小化圖標
HCURSOR hCursor;//窗口鼠標光標
HBRUSH hbrBackground;//窗口背景色
LPCTSTR lpszMenuName;//窗口菜單
LPCTSTR lpszClassName;// 窗口類名
} WNDCLASS, *LPWNDCLASS;
*/
cs.cbClsExtra=0;
cs.cbWndExtra=0;
cs.hbrBackground=(HBRUSH)(COLOR_WINDOW+2);
cs.hCursor=NULL;
cs.hIcon=NULL;
cs.hInstance=hInstance;
cs.lpfnWndProc=(WNDPROC)WinProc;
cs.lpszClassName="Main";
cs.lpszMenuName=NULL;
cs.style=CS_VREDRAW|CS_HREDRAW;
RegisterClass(&cs);//實現註冊窗口
//創建窗口
hWnd=CreateWindow("Main","Windows",WS_OVERLAPPEDWINDOW,200,200,500,500,NULL,NULL,hInstance,NULL);
/*
CreateWindow函數參數解析:
HWND WINAPI CreateWindow(
_In_opt_ LPCTSTR lpClassName, // 窗口類名稱
_In_opt_ LPCTSTR lpWindowName, // 窗口標題
_In_ DWORD dwStyle, // 窗口風格,或稱窗口格式
_In_ int x, // 初始 x 座標
_In_ int y, // 初始 y 座標
_In_ int nWidth, // 初始 x 方向尺寸
_In_ int nHeight, // 初始 y 方向尺寸
_In_opt_ HWND hWndParent, // 父窗口句柄
_In_opt_ HMENU hMenu, // 窗口菜單句柄
_In_opt_ HINSTANCE hInstance, // 程序實例句柄
_In_opt_ LPVOID lpParam // 創建參數
);
*/
//顯示窗口
ShowWindow(hWnd,SW_SHOW);
//更新窗口
UpdateWindow(hWnd);
//消息循環
while(GetMessage(&nMsg,0,NULL,NULL))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
return 0;
}