我寫了一個win32應用程序。我實現了消息循環我自己是這樣的:Win32:我的應用程序凍結,而用戶調整窗口的大小
bool programcontinue = true;
while(programcontinue)
{
while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
IdleProcess();
}
有一個在我的應用程序中的可調整大小的窗口。通常,IdleProcess()每秒被調用幾次。當用戶抓住可調整大小的窗口的角落或邊緣時,IdleProcess()不會再被調用,直到用戶釋放鼠標按鈕。
這裏會發生什麼?
我試着用if來交換內部,但這並不改變行爲。似乎在調整大小開始時,該消息的處理程序在調整大小完成之前不會返回?
有沒有辦法改變這種情況,並在每秒調整大小几次的過程中調用IdleProcess()?
感謝 馬克
編輯:
我的意思是用,如果是更換內部而:
bool programcontinue = true;
while(programcontinue)
{
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) // <<<<
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
IdleProcess();
}
我的窗口過程有點漫長,但我得到了相同的行爲與一個小測試應用程序。這與VS Project Wizard創建的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;
}
你可以發佈你的WndProc(...)窗口程序,它將接收來自DispatchMessage()的消息,因爲你的關於改變while的註釋變成if是有點好奇 – 2010-06-23 14:34:06
done +「if」的解釋而不是「而「thingy。 – marc40000 2010-06-23 15:22:13
基於更新,顯然TranslateMessage或DispatchMessage不會立即返回。你的下一個任務是弄清楚哪一個,哪個消息觸發了這個。 – 2010-06-23 15:38:27