【问题标题】:How to draw a rectangle around the current cursor's position in MFC如何在MFC中围绕当前光标的位置绘制一个矩形
【发布时间】:2018-06-13 17:51:35
【问题描述】:

我试图在 MFC 中围绕当前光标的位置绘制一个矩形。当我移动鼠标时它可以工作,但是当我停止移动鼠标时矩形消失了。

void CView1::OnMouseMove(UINT nFlags, CPoint point)
{
    if (!m_mouse_tracking)
    {
        TRACKMOUSEEVENT tme;
        tme.cbSize = sizeof(TRACKMOUSEEVENT);
        tme.dwFlags = TME_HOVER;
        tme.hwndTrack = this->m_hWnd;
        tme.dwHoverTime = HOVER_DEFAULT;

        if (::_TrackMouseEvent(&tme))
        {
            m_mouse_tracking = true;

            // Draw the 1st rect
            draw_rect_(m_pDC);
        }
    }
    else
    {
        // Draw new rect and erase old rect
        RedrawWindow(NULL, NULL, RDW_INVALIDATE);
        draw_rect_(m_pDC);
    }
}

void CView1::OnMouseHover(UINT nFlags, CPoint point)
{
    m_mouse_tracking = false;

    draw_rect_(m_pDC);
}

我的源代码有问题吗?请帮我。

【问题讨论】:

  • 您调用RedrawWindow 使客户区无效,这将导致重绘一段时间 draw_rect_() 返回。这可能不是你所期望的。试试RDW_UPDATENOW,但实际上你应该在WM_PAINT 中完成所有绘画,而在其他任何地方你只使客户区无效。
  • m_pDC 是内存 DC 吗?有内存位图吗?如果不是MCVE,请提供有关变量和函数的更多信息。
  • 如果矩形足够小,改变光标本身不是一个好主意吗?

标签: c++ mfc gdi


【解决方案1】:

您需要在CView1::OnPaint 方法中进行绘画。

另外,您可以使用CDC::SetROP2 方法使用R2_NOTXORPEN 而不是使整个窗口无效,this link 有一个示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多