win32调整大小后重绘
Posted
技术标签:
【中文标题】win32调整大小后重绘【英文标题】:win32 redrawing after resizing 【发布时间】:2014-06-26 13:47:24 【问题描述】:我还有下一个问题
我有基类“Shape”,它包含虚函数draw(HWND)
,我有子类“Line”,它包含相同的函数draw(hwnd)
。
当我在WM_MOUSEMOVE
中画线时,一切正常,但是当我最小化或更改窗口大小时,我的线消失了
我需要做什么?
我有一个指向基类的向量 向量 ff; 形状 *f;
case WM_LBUTTONDOWN:
IsDrawing = TRUE;
StartX = LOWORD(lParam);
StartY = HIWORD(lParam);
EndX = LOWORD(lParam);
EndY = HIWORD(lParam);
switch(iShape)
case LINE:
f=new Line();
break;
case RECTANGLE:
f=new MyRectangle();
break;
f->SetBrushWidth(5);
f->SetColor(RGB(255,0,0));
f->SetStartCoord(StartX,StartY);
f->SetEndCoord(EndX,EndY);
f->SetMode(1);
f->draw(hWnd);
break;
case WM_MOUSEMOVE:
if( IsDrawing == TRUE )
f->SetEndCoord(EndX,EndY);
f->SetMode(2);
f->draw(hWnd);
EndX = LOWORD(lParam);
EndY = HIWORD(lParam);
f->SetEndCoord(EndX,EndY);
f->SetMode(2);
f->draw(hWnd);
break;
case WM_LBUTTONUP:
EndX = LOWORD(lParam);
EndY = HIWORD(lParam);
f->SetEndCoord(EndX,EndY);
f->SetMode(3);
f->draw(hWnd);
ff.push_back(f);
IsDrawing = FALSE;
break;
画得不错,但是当改变窗口大小时
【问题讨论】:
【参考方案1】:你画错地方了。应在窗口上绘制以响应接收到WM_PAINT
消息。 Windows 可以随时重绘,您的程序必须能够完全重绘自己。
您需要将所有绘图代码移动到WM_PAINT
的处理代码中。在WM_MOUSEMOVE
处理程序中,您需要记下必须在何处绘制线,然后调用InvalidateRect
。这将安排一个绘制周期,并且在该绘制周期发生时可以重新绘制窗口。
这几乎是 Win32 101,如果您还没有这样做,我建议您获取一份 Petzold 的经典著作,Programming Windows。
【讨论】:
【参考方案2】:根据您的问题,听起来您只画了一次线。每次重绘窗口时都需要绘制线条。每当需要重新验证时(例如调整大小时),都会重新绘制窗口。
如果您使用 GDI,请查看 OnPaint,这是您应该将所有绘图放置在其中的函数,因为在重绘窗口时会重绘。
【讨论】:
-1 Windows API 中没有OnPaint
。将其称为“您应该将所有绘图放在其中的功能”非常具有误导性。
GDI/+ 使用 OnPaint 函数绘制到窗口。 java2s.com/Code/Cpp.net/2D/HelloGDIOnPaint.htm
这是 C++/CLI,针对 WinForms。它既不是 Windows API,也不是 GDI,也不是本机代码。以上是关于win32调整大小后重绘的主要内容,如果未能解决你的问题,请参考以下文章