Hi all!
The question is the opposite as usual: why
is the window redrawing constantly when resized/moved?
I know this is the behavior most of us want, but I don't (for performance reasons).
And a related question: I'm not sure that my redrawing (WM_PAINT) stuff is good at all.
The program should redraw, only if I want it to. (So no constant updates)
The old version worked as expected: it didn't redraw, while the left button were pressed during resize/move.
The updates woks as expected otherwise.
Old message loop:
while( !EscapeGame )
{
if( PeekMessage(&msg,NULL,0,0,PM_REMOVE) )
{
if( msg.message==WM_QUIT )
EscapeGame = true;
else
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
continue;
}
Display();//if I comment this out, and use WM_PAINT/UpdateWindow in windProc, the problem is the same
WaitMessage();
}
New message loop:
while( GetMessage( &msg, NULL, 0, 0 ) )
{
if (msg.message==WM_QUIT)
{
break;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
WindProc:
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_ACTIVATE:
if( !GameOver && GameStarted )
{ int minimized = HIWORD(wParam);
if ( minimized && win_state.Active )
{
PauseTimeStart = timeGetTime();
win_state.Active = false;
}
else if( !minimized && !win_state.Active )
{
TimeStart += (timeGetTime() - PauseTimeStart);
TimerFunc();
win_state.Active = true;
}
}
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_CLOSE:
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_GETMINMAXINFO:
{
PMINMAXINFO minmax;
minmax = (PMINMAXINFO)lParam;
minmax->ptMinTrackSize.x = 400;
minmax->ptMinTrackSize.y = 300;
}
//InvalidateRect(win_state.hWnd, NULL, FALSE);
//UpdateWindow(win_state.hWnd);
return 0;
case WM_TIMER:
//the old version didn't redraw, even when the timer expired
// timer values are about 0.5 seconds (quite slow)
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_SIZE:
if( wParam != SIZE_MINIMIZED )
{
SCRN_WDTH = LOWORD(lParam);
SCRN_HGHT = HIWORD(lParam)-MENUBAR_HEIGHT;
ResizeWindow(SCRN_WDTH, SCRN_HGHT);
//InvalidateRect(win_state.hWnd, NULL, FALSE);
//UpdateWindow(win_state.hWnd);//redraws, even when commented
}
return 0;
case WM_LBUTTONDOWN:
Lft_Btn = true;
SetCapture(win_state.hWnd);
if( Rgt_Btn )
Lft_Rgt_Dwn = true;
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_MBUTTONDOWN:
Mdl_Btn = true;
SetCapture(win_state.hWnd);
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_RBUTTONDOWN:
Rgt_Btn = true;
if( Lft_Btn )
Lft_Rgt_Dwn = true;
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_LBUTTONUP:
Lft_Btn = false;
if( !Mdl_Btn )
ReleaseCapture();
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_MBUTTONUP:
Mdl_Btn = false;
if( !Lft_Btn )
ReleaseCapture();
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_RBUTTONUP:
Rgt_Btn = false;
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_MOUSEMOVE:
MouseX = (int)(short)LOWORD(lParam);
MouseY = (int)(short)HIWORD(lParam);
MouseDX = MouseX - MousePrevX;
MouseDY = MouseY - MousePrevY;
MousePrevX = MouseX;
MousePrevY = MouseY;
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_MOUSE_ROLL:
CurrentChar = wParam;
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_CHAR:
CurrentChar = wParam;
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_KEYDOWN:
CurrentChar = wParam;
...
InvalidateRect(win_state.hWnd, NULL, FALSE);
UpdateWindow(win_state.hWnd);
return 0;
case WM_PAINT: // WM_PAINT, and UpdateWindow is only used with the new version of the message loop
Display();
ValidateRect(win_state.hWnd, NULL);
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
Note, that this means the window is updated on almost every events, but I will make it to redraw only when I want it to.
Or is it something with the validate/invalidate pairs?
How can I get back to the "default" redraw behavior?
Thanks for answers in advance!
[Edited by - szecs on March 16, 2010 5:15:25 AM]