我写了一个win32应用程序。我自己实现了消息循环,如下所示:
bool programcontinue = true;
while(programcontinue)
{
while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
IdleProcess();
}
我的应用程序中有一个可调整大小的窗口。通常,IdleProcess()每秒被调用几次。当用户捕获可调整大小的窗口的拐角或边缘时,在用户释放鼠标按钮之前,不会再调用IdleProcess()。
发生什么事了?
我尝试用if交换内部,但这并没有改变行为。似乎在调整大小开始时,直到调整大小完成后,该消息的处理程序才会返回?
有没有办法改变它,并在每秒调整几次大小期间调用IdleProcess()?
谢谢
马克
编辑:
我用if替换内部while的意思是:
bool programcontinue = true;
while(programcontinue)
{
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) // <<<<
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
IdleProcess();
}
我的窗口Proc有点长,但是使用小型测试应用程序,我会得到相同的行为。这与VS Project向导创建的wndproc相同:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
最佳答案
Windows上发生了许多模式操作。 Win32 Modal操作是指通过启动其自己的事件处理循环直到模式结束而将应用程序置于“模式”的函数。常见的应用程序模式包括拖放操作,移动/大小操作,只要弹出对话框需要输入,应用程序就可以继续。
因此,正在发生的事情是:您的消息循环未在运行。
您的窗口收到传递给DefWindowProc的WM_LBUTTONDOWN消息。 DefWindowProc确定用户正在尝试以交互方式调整窗口大小或移动窗口,并输入了调整大小/移动模式的功能。此功能位于消息处理循环中,以监视鼠标消息,以便可以拦截鼠标消息以提供交互式的大小调整体验,并且仅在大小调整操作完成后才会退出-通常是由用户释放按住的按钮或通过按Escape键。
您会收到通知-DefWindowProc在进入和退出模态事件处理循环时会发送WM_ENTERSIZEMOVE和WM_EXITSIZEMOVE消息。
要继续生成“空闲”消息,通常在调用模态函数之前或在收到DefWindowProc正在输入模态函数的消息时,创建一个计时器(SetTimer)-模态循环将继续分派(dispatch)WM_TIMER消息...并调用来自计时器消息处理程序的idle proc。模态函数返回时销毁计时器。