InvalidateRect не перерисовывает окно - PullRequest
0 голосов
/ 21 января 2020

Я получил многоугольник, который рисуется при каждом нажатии кнопки.

Я хотел перекрасить многоугольник при повторном нажатии кнопки, но когда я нажимаю на него, он просто закрашивает другой многоугольник, не стирая другой:

//header
#define CREATETRIANGLE 1

//WM_COMMAND
    case 2:
      PAINTPROCEDURE = CREATETRIANGLE;
      InvalidateRect(hwnd, NULL, TRUE);
      break;

//WM_PAINT
case WM_PAINT:
  switch(PAINTPROCEDURE){
    case 0:{
      hdc = BeginPaint(hwnd, &ps);
      EndPaint(hwnd,&ps);
      }
    break;
    case 1:
      RedrawWindow(hwnd, &rect, NULL, RDW_NOCHILDREN); //I tried this function, but it did nothing
      TriangleDC = BeginPaint(hwnd, &tps);
        SelectPen(TriangleDC, CreatePen(PS_SOLID, 2, RGB(256,256,256)));
        SelectBrush(TriangleDC, CreateSolidBrush(RGB(0,192,192)));
       {
       POINT vertices[] = {{baseX,baseY}, {(baseX-(triangle.sideB)),baseY}, {baseX,(baseY-triangle.sideC)}};
       Polygon(TriangleDC, vertices, 3);
       }
      EndPaint(hwnd,&ps);
      PAINTPROCEDURE = 0;
                break;

Я также пытался получить многоугольник вышел из области видимости, но он тоже ничего не сделал.

1 Ответ

0 голосов
/ 22 января 2020

он просто рисует другой многоугольник, не стирая другой

Когда вы вызываете BeginPaint, система обычно вызывает WM_ERASEBKGND перед возвратом. Затем обработчику WM_ERASEBKGND предоставляется возможность «стереть» окно. Обработчик по умолчанию (из DefWndPro c) заполнит область с помощью bru sh из WNDCLASS для этого окна.

Похоже, стирание не происходит, что может означать: (1) вы предоставили обработчик WM_ERASEBKGND, который фактически не стирает экран, или (2) hbrBackground в WNDCLASS установлен неправильно или имеет значение null bru sh.

В любом из этих случаев, что Если произойдет, то поле fErase PAINTSTRUCT, полученное из BeginPaint, будет установлено в значение, отличное от 0, что говорит о том, что вы [обработчик WM_PAINT] все равно должны сначала стереть окно.

Теперь иногда люди играют в игры со своим собственным обработчиком WM_ERASEBKGND, когда пытаются оптимизировать рисование (или во множественной попытке уменьшить мерцание). Это может привести к тому, что флаг fErase будет равен 0, даже если вам нужно сначала стереть.

Мой совет - позволить DefWndPro c обрабатывать WM_ERASEBKGND и убедиться, что вы установили правильное значение для hbrBackground в WNDCLASS. Как только это сработает, вы можете поэкспериментировать с другими подходами.

...