创建消息循环

【勇芳软件工作室】汉化HomePreviousNext

Windows自动为每个线程创建消息队列。如果线程创建一个或多个窗口,则必须提供消息循环;此消息循环从线程的消息队列中检索消息,并将它们分派到适当的窗口过程。

因为Windows将消息指向应用程序中的单个窗口,所以线程必须在开始其消息循环之前创建至少一个窗口。大多数基于Windows的应用程序都包含一个创建窗口的线程。典型的应用程序为其主窗口注册窗口类,创建并显示主窗口,然后在WinMain函数中启动其消息循环__ all。

您可以使用GetMessageDispatchMessage功能创建消息循环。如果您的应用程序必须从用户获取字符输入,请在循环中包含TranslateMessage函数。TranslateMessage将虚拟键消息转换为字符消息。以下示例显示了一个简单的基于Win32的应用程序的WinMain函数中的消息循环。

HINSTANCE hinst;

HWND hwndMain;

int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

LPSTR lpszCmdLine,int nCmdShow)

{

MSG msg;

WNDCLASS wc;

UNREFERENCED_PARAMETER(lpszCmdLine);

//注册主窗口的窗口类。

if(!hPrevInstance)

{

wc.style = 0;

wc.lpfnWndProc = (WNDPROC) WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon((HINSTANCE) NULL,

IDI_APPLICATION);

wc.hCursor = LoadCursor((HINSTANCE) NULL,

IDC_ARROW);

wc.hbrBackground = GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = "MainMenu";

wc.lpszClassName = "MainWndClass";

if(!RegisterClass(& wc))

return FALSE;

}

hinst = hInstance; //保存实例句柄

//创建主窗口。

hwndMain = CreateWindow("MainWndClass", "Sample",

WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL,

(HMENU) NULL, hinst, (LPVOID) NULL);

//如果主窗口无法创建,请终止

// 应用程序。

如果(!hwndMain)

return FALSE;

//显示窗口并绘制其内容。

ShowWindow(hwndMain, nCmdShow);

UpdateWindow(hwndMain);

//启动消息循环。

while(GetMessage(& msg,(HWND)NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//将退出代码返回到Windows。

return msg.wParam;

}

以下示例显示了使用加速器并显示无模式对话框的线程的消息循环。TranslateAcceleratorIsDialogMessage返回TRUE(表示已处理该邮件),TranslateMessageDispatchMessage未被调用。原因是TranslateAcceleratorIsDialogMessage执行所有必要的翻译和分发消息。

HWND hwndMain;

HWND hwndDlgModeless = NULL;

MSG msg;

HACCEL haccel;

//

//执行初始化并创建一个主窗口。

//

while(GetMessage(& msg,(HWND)NULL,0,0))

{

if (hwndDlgModeless == (HWND) NULL ||

!IsDialogMessage(hwndDlgModeless,& msg)& &

!TranslateAccelerator(hwndMain,haccel,

& MSG))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}