c++ win32重绘后,

vngu2lb8  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(192)

我有下一个问题
我有基类“Shape”,它包含虚拟函数draw(HWND),我有子类“Line”,它包含相同的函数draw(hwnd)
当我在WM_MOUSEMOVE中画线时,一切正常,但当我最小化或更改窗口大小时,我的线消失了
我需要做什么?
我有一个指向基类vector ff; Shape *f;

  1. case WM_LBUTTONDOWN:
  2. {
  3. IsDrawing = TRUE;
  4. StartX = LOWORD(lParam);
  5. StartY = HIWORD(lParam);
  6. EndX = LOWORD(lParam);
  7. EndY = HIWORD(lParam);
  8. switch(iShape)
  9. {
  10. case LINE:
  11. f=new Line();
  12. break;
  13. case RECTANGLE:
  14. f=new MyRectangle();
  15. break;
  16. }
  17. f->SetBrushWidth(5);
  18. f->SetColor(RGB(255,0,0));
  19. f->SetStartCoord(StartX,StartY);
  20. f->SetEndCoord(EndX,EndY);
  21. f->SetMode(1);
  22. f->draw(hWnd);
  23. break;
  24. }
  25. case WM_MOUSEMOVE:
  26. if( IsDrawing == TRUE )
  27. {
  28. f->SetEndCoord(EndX,EndY);
  29. f->SetMode(2);
  30. f->draw(hWnd);
  31. EndX = LOWORD(lParam);
  32. EndY = HIWORD(lParam);
  33. f->SetEndCoord(EndX,EndY);
  34. f->SetMode(2);
  35. f->draw(hWnd);
  36. }
  37. break;
  38. case WM_LBUTTONUP:
  39. EndX = LOWORD(lParam);
  40. EndY = HIWORD(lParam);
  41. f->SetEndCoord(EndX,EndY);
  42. f->SetMode(3);
  43. f->draw(hWnd);
  44. ff.push_back(f);
  45. IsDrawing = FALSE;
  46. break;

字符串
它是绘图确定,但当改变窗口大小

cnh2zyt3

cnh2zyt31#

你在错误的地方绘图。在窗口上绘图应该是在收到WM_PAINT消息后才进行的。窗口可以在任何时候重新绘制,并且你的程序必须能够完全重新绘制自己。
您需要将所有的绘图代码移动到WM_PAINT的处理代码中。在WM_MOUSEMOVE处理程序中,您需要记下必须绘制线条的位置,然后调用InvalidateRect。这将安排一个绘制周期,当绘制周期发生时,可以重新绘制窗口。
这几乎是Win32 101,我建议,如果你还没有这样做,你得到一个Petzold的经典托姆,Programming Windows的副本。

相关问题