【问题标题】:Questions About Drawing without WM_PAINT Message关于没有 WM_PAINT 消息的绘图的问题
【发布时间】:2013-02-24 01:44:04
【问题描述】:

在 MSDN 中,我读到了这个

当不使用 WM_PAINT 消息进行绘图时,应用程序通常 不会使窗口无效。相反,它以这样的方式绘制 它可以轻松恢复窗口并删除绘图。

这是什么意思?因为我写了一个GIS程序,我想实现“放大”功能, 鼠标左键向下移动鼠标画一个矩形,画的是一个矩形但是矩形覆盖了地图,首先我认为是因为矩形不透明,然后我使用 AlphaBlend() 来绘制一个透明的矩形,它是相同。 我该怎么办?

LRESULT OnMouseMove(UINT nflags, CPoint point)
{
    if (m_bZoomInMode)
    {
        m_curScreenPoint.x = point.x;
        m_curScreenPoint.y = point.y;
        HDC hdc = GetDC();
        SelectObject(hdc, (HBRUSH)NULL_BRUSH);
        Rectangle(hdc, m_startScreenPoint.x, m_startScreenPoint.y, point.x, point.y);
        ReleaseDC(hdc);
        return 0;
    }
}

【问题讨论】:

  • MSDN中的评论与你的问题无关。
  • 绘制选择矩形的技巧是将绘图笔设置为 XOR 模式SetROP2(hDC, R2_XORPEN); 并使用空心画笔。第一次绘制将绘制一个反转原始屏幕像素的直线矩形,第二次在同一矩形上绘制将恢复原始像素。参考这个例子:programmersheaven.com/mb/windows/104684/104684/…
  • 如果您在项目中使用 MFC,您可以简单地使用 CRectTracker 类。

标签: windows drawing message gdi


【解决方案1】:

要绘制矩形,您可以绘制 4 条线。或者使用透明画笔——即使用画笔样式BS_HOLLOW

另一个要解决的问题是,当用户移动鼠标时,缩放矩形会移动,您需要重新绘制下方的内容。请按如下方式执行:

  1. 调用InvalidateRect 传递一个矩形以获取缩放矩形的先前位置。
  2. 调用 UpdateRect 强制绘制循环并绘制上一个缩放矩形下方的内容。
  3. 绘制新的缩放矩形。

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 2011-05-08
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多