我有下一个问题
我有基类" 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;
绘图确定,但更改窗口大小时
答案 0 :(得分:7)
你画错了地方。应该在响应收到WM_PAINT
消息时在窗口上绘图。 Windows可以随时重新绘制,您的程序必须能够完全重绘。
您需要将所有绘图代码移动到WM_PAINT
的处理代码中。在WM_MOUSEMOVE
处理程序中,您需要记下必须绘制线的位置,然后调用InvalidateRect
。这将安排一个油漆循环,并且当油漆循环发生时,窗口可以重新粉刷。
这几乎是Win32 101,我建议如果你还没有这样做,你就会得到一份Petzold的经典书籍Programming Windows。
答案 1 :(得分:0)
根据您的问题,听起来您只是画了一次。每次重绘窗口时都需要绘制线条。只要需要重新验证(例如调整大小时),窗口就会重新绘制。
如果您正在使用GDI,请查看OnPaint,这是您应该放置所有绘图的功能,因为重绘窗口时它将被重绘。