Win32: mi aplicación se congela mientras el usuario cambia el tamaño de la ventana

Escribo una aplicación win32. Implementé el bucle de mensajes de esta manera:

     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. Por lo general, se llama a IdleProcess () varias veces por segundo. Cuando el usuario toma una esquina o un borde de la ventana redimensionable, IdleProcess () ya no recibe llamadas hasta que el usuario suelta el botón del mouse.

¿Qué pasa aquí?

Intenté intercambiar el interior con un if, pero eso no cambia el comportamiento. Parece que cuando comienza el cambio de tamaño, el controlador para 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 algunas veces por segundo?

Gracias Marc

EDITAR:

Lo que quiero decir con reemplazar el while interno con if 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 larga, pero obtengo 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;
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta