我还有下一个问题
我有基类“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;
绘图正常,但是当改变窗口大小时
你画错地方了。应在收到
WM_PAINT
消息后在窗口上绘图。 Windows 可以随时重绘,并且您的程序必须能够完全重绘自身。
您需要将所有绘图代码移至
WM_PAINT
的处理代码中。在 WM_MOUSEMOVE
处理程序中,您需要记下必须在何处绘制线条,然后调用 InvalidateRect
。这将安排一个绘制周期,并且当该绘制周期发生时可以重新绘制窗口。
这几乎是 Win32 101,如果您还没有这样做,我建议您获取 Petzold 的经典著作Programming Windows。
在调用
CS_HREDRAW | CS_VREDRAW
时将 WNDCLASSEX
传递给 style
RegisterClassEx
属性将强制窗口在大小发生变化时重新绘制。