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