调整大小后重新绘制win32

时间:2014-06-26 13:47:25

标签: c++ winapi

我有下一个问题

我有基类" 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;

绘图确定,但更改窗口大小时

2 个答案:

答案 0 :(得分:7)

你画错了地方。应该在响应收到WM_PAINT消息时在窗口上绘图。 Windows可以随时重新绘制,您的程序必须能够完全重绘。

您需要将所有绘图代码移动到WM_PAINT的处理代码中。在WM_MOUSEMOVE处理程序中,您需要记下必须绘制线的位置,然后调用InvalidateRect。这将安排一个油漆循环,并且当油漆循环发生时,窗口可以重新粉刷。

这几乎是Win32 101,我建议如果你还没有这样做,你就会得到一份Petzold的经典书籍Programming Windows

答案 1 :(得分:0)

根据您的问题,听起来您只是画了一次。每次重绘窗口时都需要绘制线条。只要需要重新验证(例如调整大小时),窗口就会重新绘制。

如果您正在使用GDI,请查看OnPaint,这是您应该放置所有绘图的功能,因为重绘窗口时它将被重绘。

相关问题