win32调整大小后重绘

Posted

技术标签:

【中文标题】win32调整大小后重绘【英文标题】:win32 redrawing after resizing 【发布时间】:2014-06-26 13:47:24 【问题描述】:

我还有下一个问题

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

画得不错,但是当改变窗口大小时

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

如果您使用 GDI,请查看 OnPaint,这是您应该将所有绘图放置在其中的函数,因为在重绘窗口时会重绘。

【讨论】:

-1 Windows API 中没有OnPaint。将其称为“您应该将所有绘图放在其中的功能”非常具有误导性。 GDI/+ 使用 OnPaint 函数绘制到窗口。 java2s.com/Code/Cpp.net/2D/HelloGDIOnPaint.htm 这是 C++/CLI,针对 WinForms。它既不是 Windows API,也不是 GDI,也不是本机代码。

以上是关于win32调整大小后重绘的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Win32 中读取鼠标的外观(指针、调整大小等)

在不调整大小或重绘的情况下扩展 UIView

Win32 C++ 调整窗口大小在 RDP 中留下工件

win32创建EDIT窗口,并把大小调整为父窗口工作区大小

如何强制 jQuery UI 对话框再次重绘或触发某些东西来强制调整大小

html5画布在调整大小时重绘