调整大小后的Win32重绘

win32 redrawing after resizing

本文关键字:Win32 重绘 调整      更新时间:2023-10-16

我有下一个问题

我有基类"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了,如果你还没有这样做,我建议你拿一本佩佐德的经典著作《Windows编程》。