Escribo una aplicación win32. Implementé el bucle de mensajes yo mismo así:Win32: Mi aplicación se congela mientras el usuario cambia el tamaño de la ventana
bool programcontinue = true;
while(programcontinue)
{
while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
IdleProcess();
}
Hay una ventana de tamaño variable en mi aplicación. Normalmente, IdleProcess() se llama varias veces por segundo. Cuando el usuario agarra una esquina o un borde de la ventana de tamaño variable, IdleProcess() no recibe más llamadas hasta que el usuario suelta el botón del mouse.
¿Qué sucede aquí?
He intentado intercambiar el interior con un if, pero eso no cambia el comportamiento. Parece que cuando se inicia el cambio de tamaño, el manejador de ese mensaje no regresa hasta que se realiza el cambio de tamaño.
¿Hay alguna manera de cambiar esto y llamar a IdleProcess() durante el cambio de tamaño varias veces por segundo?
Gracias Marc
EDIT:
Lo que quiero decir mediante la sustitución del tiempo interno con si es:
bool programcontinue = true;
while(programcontinue)
{
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) // <<<<
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
IdleProcess();
}
Mi ventana Proc es un poco largo, pero me sale el mismo comportamiento con una pequeña aplicación de prueba. Esto es idéntico al wndproc que crea el Asistente de proyecto VS:
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;
}
podría publicar su procedimiento de ventana WndProc (...) que recibirá mensajes de DispatchMessage() ya que su comentario sobre cambiar el tiempo en un si es un poco curioso –
hecho + una explicación del "si" en lugar de " mientras que "cosita". – marc40000
Según la actualización, es obvio que TranslateMessage o DispatchMessage no regresan inmediatamente. Su próxima tarea es averiguar cuál, y qué mensaje está desencadenando esto. –