Win32: My Application congela enquanto o usuário redimensiona a janela

Eu escrevo um aplicativo win32. Eu implementei o loop de mensagens assim:

     bool programcontinue = true;
     while(programcontinue)
     {
              while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
              {
                       TranslateMessage(&Msg);
                       DispatchMessage(&Msg);
              }

              IdleProcess();
     }

Há uma janela redimensionável no meu aplicativo. Normalmente, IdleProcess () é chamado várias vezes por segundo. Quando o usuário pega um canto ou uma borda da janela redimensionável, IdleProcess () não é mais chamado até que o usuário solte o botão do mouse.

o que acontece aqui?

Tentei trocar o interior por um if, mas isso não muda o comportamento. Parece que quando o redimensionamento é iniciado, o manipulador dessa mensagem não retorna até que o redimensionamento seja concluído?

Existe uma maneira de mudar isso e chamar IdleProcess () durante o redimensionamento algumas vezes por segundo?

Obrigado Marc

EDITAR:

O que quero dizer com substituir o interior while por if é:

 bool programcontinue = true;
 while(programcontinue)
 {
          if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))  // <<<<
          {
                   TranslateMessage(&Msg);
                   DispatchMessage(&Msg);
          }

          IdleProcess();
 }

Minha janela Proc é um pouco longa, mas recebo o mesmo comportamento com um pequeno aplicativo de teste. Isso é idêntico ao wndproc criado pelo VS Project Wizard:

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;
}