Windows программа ---- переместить прямоугольник - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь переместить прямоугольник, но я озадачен. Я просто создал прямоугольник, но после того, как я переместил его на 2 шага, в результате получилось две копии. Раньше я писал похожий код, но на этот раз что-то пошло не так.
точно так же
начало:
b
двигаться на два шага:
b
b
b

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 HDC         hdc ;
 static int  x_left,y_top,x_right,y_bottom;
 PAINTSTRUCT ps ;
 switch (message)
 {
 case WM_CREATE:
     hdc = GetDC (hwnd) ;
     x_left=100;
     x_right=300;
     y_top=50;
     y_bottom=200;
     Rectangle(hdc,x_left,y_top,x_right,y_bottom);
     ReleaseDC (hwnd, hdc);
     return 0;

 case WM_KEYDOWN:
     switch(wParam){
     case VK_DOWN:
         y_top+=160;
         y_bottom+=160;
         break;
     default:break;
     }
     InvalidateRect(hwnd,NULL, FALSE);
     break;

 case WM_PAINT:
     hdc=BeginPaint(hwnd,&ps);
     Rectangle(hdc,x_left,y_top,x_right,y_bottom);
     EndPaint(hwnd,&ps);
     return 0;

 case WM_DESTROY :
      PostQuitMessage (0) ;
      return 0 ;
 }
 return DefWindowProc (hwnd, message, wParam, lParam) ;
}

1 Ответ

0 голосов
/ 17 апреля 2020

Замените строку InvalidateRect на:

InvalidateRect(hwnd,NULL, TRUE);

Ваш WM_PAINT явно не рисует фон. Когда вы вызываете InvalidateRect, вы не говорите функции рисовать фон цветом окна. Er go, чертеж (прямоугольник), который уже был там, остается нарисованным.

Кроме того, не рисуйте в WM_CREATE. Окно еще не видно. В момент появления WM_PAINT сработает. Вы можете рисовать с помощью GetDC / ReleaseD C в обработчике WM_KEYDOWN, если вы sh, но последовательность InvalidateRect / WM_PAINT не будет заметно медленнее, и код будет таким же чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...