Windows消息循环理解及窗体创建步骤
首先理解一句話:“Windows”向應(yīng)用程序發(fā)送了一條消息。這里是指Windows調(diào)用了該程序內(nèi)部的一個(gè)函數(shù)。
當(dāng)UpdateWindow被調(diào)用后,新建的窗口在屏幕便完全可見了。此時(shí),Windows會(huì)為其維護(hù)一個(gè)消息隊(duì)列。當(dāng)事件發(fā)生時(shí),Windows會(huì)自動(dòng)將這些事件轉(zhuǎn)化為消息,并將其放置在應(yīng)用程序的消息隊(duì)列中。
應(yīng)用程序通過消息循環(huán)來獲取消息:
while (GetMessage(&msg, NULL, 0, 0)) //從消息隊(duì)列中獲取消息并放在msg結(jié)構(gòu)中 {TranslateMessage(&msg); //將虛擬鍵消息轉(zhuǎn)換為字符消息 DispatchMessage(&msg); //調(diào)度一個(gè)消息給窗口程序 }在消息循環(huán)中,應(yīng)用程序?qū)@取到的消息返還給Windows,接下來,Windows會(huì)將這條消息發(fā)送給合適的窗口過程即WndProc來處理:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message){case WM_CREATE:...return 0;... ...case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);//不進(jìn)行處理的消息傳給此函數(shù) }綜上,窗口過程是由Windows來調(diào)用的,即當(dāng)從消息隊(duì)列中取出消息并遞交給Windows后,Windows把消息內(nèi)容作為參數(shù),回調(diào)給其發(fā)送消息的窗口的窗口過程。
注:應(yīng)用程序如果希望調(diào)用自身的窗口過程,則可通過函數(shù)SendMessage來實(shí)現(xiàn)。
/************窗體創(chuàng)建步驟****************/
實(shí)現(xiàn)窗口創(chuàng)建的六步驟:
第一步:創(chuàng)建入口函數(shù)WinMain
第二步:注冊(cè)窗口類
第三部:實(shí)現(xiàn)回調(diào)函數(shù)的功能
第四步:顯示窗口
第五步:更新窗口
第六步:消息循環(huán)
#include?"stdafx.h"
//回調(diào)函數(shù)(消息響應(yīng)過程)
LRESULT?CALLBACK?WinProc(HWND?hWnd,UINT?uMsg,WPARAM?wParam,LPARAM?lParam?)
{
switch(uMsg)
{
case?WM_CREATE:
{
MessageBox(NULL,"即將創(chuàng)建一個(gè)窗口!","Infor",MB_OK);
}
break;
case?WM_DESTROY:
{
PostQuitMessage(0);
}
break;
}
return?DefWindowProc(hWnd,uMsg,wParam,lParam);
}
//創(chuàng)建入口函數(shù)
int?APIENTRY?WinMain(
?HINSTANCE?hInstance,??
?HINSTANCE?hPrevInstance,
?LPSTR?lpCmdLine,
?int?ShowCmd
?)
{
HWND?hWnd=0;
MSG?nMsg={0};
//注冊(cè)窗口類
WNDCLASS?cs={0};
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);//實(shí)現(xiàn)注冊(cè)窗口
//創(chuàng)建窗口
hWnd=CreateWindow("Main","Windows",WS_OVERLAPPEDWINDOW,200,200,500,500,NULL,NULL,hInstance,NULL);
//顯示窗口
ShowWindow(hWnd,SW_SHOW);
//更新窗口
UpdateWindow(hWnd);
//消息循環(huán)
while(GetMessage(&nMsg,0,NULL,NULL))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
return?0;
}
?
總結(jié)
以上是生活随笔為你收集整理的Windows消息循环理解及窗体创建步骤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java8 注解: @Functiona
- 下一篇: Spring注解 @Qualifier