Как перекрасить окно, когда я меняю координаты формы? - PullRequest
0 голосов
/ 03 марта 2012

код

У меня есть эта проблема, я пытаюсь создать простой прямоугольник, который перемещается с помощью клавиш со стрелками (просто чтобы проверить возможности интерфейса графического устройства).

/** 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;

Проблема

Теперь моя проблема в том, что когда прямоугольник покидает место, это место остается черным (может быть, оно не перерисовано?), Как можно видеть:

Not Redrawing?

Однако черная часть исчезает, когда я минимизирую окно и загружаю его снова, поэтому, очевидно, возникает проблема с перерисовкой. Но почему он не перерисовывается, когда я использовал InvalidateRect и UpdateWindow? Я даже пытался ::SendMessage( hwnd, WM_PAINT, NULL, NULL ); безрезультатно. В чем проблема?

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Вам нужно стереть старый прямоугольник (т.е. нарисовать его заполненным цветом фона) перед рисованием нового.

1 голос
/ 03 марта 2012

Похоже, вы пытаетесь закодировать основной функционал вашего приложения в его основном цикле.

Этот дизайн в основном используется в полноэкранных играх. Более распространенный подход:

  • Общий цикл событий (обработка по умолчанию для каждого события)
  • Wndproc для вашего окна
  • в этом wndproc вы обрабатываете события, включая событие рисования. Не забудьте покрасить все окно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...