C++ 调整大小后重新绘制win32
我还有下一个问题 我有基类“Shape”,它包含虚拟函数C++ 调整大小后重新绘制win32,c++,winapi,C++,Winapi,我还有下一个问题 我有基类“Shape”,它包含虚拟函数draw(HWND),我有子类“Line”,它包含相同的函数draw(HWND) 当我在WM_MOUSEMOVE中画线时,一切正常,但当我最小化或更改窗口大小时,我的线消失了 我需要做什么 我有一个指向基类的向量 向量ff; 形状*f case WM_LBUTTONDOWN: { IsDrawing = TRUE; StartX = LOWORD(lParam); StartY = HIWORD(lParam);
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;
绘图正常,但当您根据问题更改窗口大小时,听起来好像您只画了一次线。每次重新绘制窗口时,都需要进行线条绘制。每当窗口需要重新验证时(例如调整大小时),都会重新绘制该窗口
如果您使用的是GDI,请在Paint上查找,这是一个函数,您应该在其中放置所有图形,因为当窗口重新绘制时,它将被重新绘制。您在错误的位置绘制。应在收到
WM_PAINT
消息后在窗口上绘制。可以随时重新绘制窗口,并且您的程序必须能够完全重新绘制自身
您需要将所有绘图代码移动到WM\u PAINT
的处理代码中。在WM\u MOUSEMOVE
处理程序中,您需要记下必须在何处绘制线,然后调用invalidate
。这将计划一个绘制周期,并且在该绘制周期发生时可以重新绘制窗口
这相当于Win32 101,我建议,如果您还没有这样做,您可以获得Petzold经典著作的副本。-1 Windows API中没有
OnPaint
。将其称为“应该放置所有图形的函数”是非常误导的。GDI/+使用OnPaint函数绘制窗口。这是C++/CLI,以WinForms为目标。它既不是Windows API,也不是GDI,也不是本机代码。