我有这个问题,我正在尝试创建一个使用箭头键移动的简单矩形(只是为了测试图形设备接口的功能)。
/** NOT IMPORTANT **/
// -------------------------------------------------- //
/* Globals (hey, its just a test program!) */
static int x = 0;
static int y = 0;
/** MAINLOOP **/
// All classes are just simple wrapper
// code in /* comments */ shows what the class methods internally do.
Graphics g; // HDC Wrapper
g.GetGraphics( winmodel.GetHandle() ); /* ::GetDC( hwnd ); */
HWND hwnd = winmodel.GetHandle();
// IMPORTANT PART //
//-------------------------------------------//
while(TRUE)
{
// PROBLEM HERE!!!
::InvalidateRect( hwnd, NULL, 0 ); // NOT WORKING??
::UpdateWindow( hwnd ); // NOT WORKING??
if( msg.Peek(NULL,0,0,PM_REMOVE) ) /* PeekMessage() */
{
msg.Translate(); /* ::TranslateMessage() */
msg.Dispatch(); /* ::DispatchMessage() */
}
g.Rectangle( x, y, x + 100, y + 100); /* GDI's ::Rectangle() Function */
fpsHandler.Tick(); /* while( ( GetTickCount() - start_time ) < 33 ); */
}
g.Release(); /* ::ReleaseDC( hwnd ); */
// NOT IMPORTANT //
// --------------------------------------------------------//
/** IN WNDPROC **/
// in WM_KEYDOWN
case VK_LEFT:
x--;
break;
case VK_RIGHT:
x++;
break;
case VK_UP:
y--;
break;
case VK_DOWN:
y++;
break;
现在我的问题是当矩形离开一个地方时,那个地方仍然是黑色的(也许它没有被重绘?),可以看出:
然而,当我最小化窗口并再次加载时,黑色部分消失,因此显然是重绘问题。但是,当我使用InvalidateRect
和UpdateWindow
时,为什么不重绘?我甚至试过::SendMessage( hwnd, WM_PAINT, NULL, NULL );
无济于事。有什么问题?
答案 0 :(得分:1)
看起来您正试图在其主循环中编写应用程序的主要功能。
这是一款主要用于全屏游戏的设计。更主流的方法是:
答案 1 :(得分:1)
在绘制新矩形之前,您需要擦除旧矩形(在绘制时填充背景颜色)。