调整大小后重新绘制win32

Iva*_*ets 0 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;
Run Code Online (Sandbox Code Playgroud)

它绘制正常,但改变窗口大小

Dav*_*nan 7

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

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

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