win32 调整大小后重绘

问题描述 投票:0回答:2

我还有下一个问题

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

绘图正常,但是当改变窗口大小时

c++ winapi
2个回答
8
投票

你画错地方了。应在收到

WM_PAINT
消息后在窗口上绘图。 Windows 可以随时重绘,并且您的程序必须能够完全重绘自身。

您需要将所有绘图代码移至

WM_PAINT
的处理代码中。在
WM_MOUSEMOVE
处理程序中,您需要记下必须在何处绘制线条,然后调用
InvalidateRect
。这将安排一个绘制周期,并且当该绘制周期发生时可以重新绘制窗口。

这几乎是 Win32 101,如果您还没有这样做,我建议您获取 Petzold 的经典著作Programming Windows


0
投票

在调用

CS_HREDRAW | CS_VREDRAW
时将
WNDCLASSEX
传递给
style
RegisterClassEx
属性将强制窗口在大小发生变化时重新绘制。

© www.soinside.com 2019 - 2024. All rights reserved.