【问题标题】:win32 redrawing after resizingwin32调整大小后重绘
【发布时间】: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;

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

【问题讨论】:

    标签: c++ winapi


    【解决方案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,也不是本机代码。
      猜你喜欢
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多