关于鼠标的捕获与画橡皮线

//code MouseCapture
/*
关于鼠标的捕获与画橡皮线
*/

1.利用鼠标的移动画橡皮线

一般来说利用鼠标的移动划线, 会画一片黑色

图示
代码:


//目的是随着鼠标的移动画虚线,但是画过的线一直存在所以一片漆黑
void CMainWindow::InvertLine(CDC* pDC, CPoint ptFrom, CPoint ptTo)
{
    CPen pen(PS_DASH, 0, RGB(0, 0, 0));
    HGDIOBJ oldPen =pDC->SelectObject(pen);
    pDC->MoveTo(ptFrom);
    pDC->LineTo(ptTo);
    pDC->SelectObject(oldPen);
}
//移动鼠标划线

void CMainWindow::OnMouseMove(UINT nFlags, CPoint point)
{
    CClientDC dc(this);
    //CPoint ptTmp(point);
    if (m_bTracking)
    {
        //避免画的虚线被覆盖变成实线
        dc.SetBkMode(TRANSPARENT);
        //用来擦掉上一条画的线
        InvertLine(&dc, m_ptFrom, m_ptTo);
        //画当前的线
        InvertLine(&dc, m_ptFrom, point);
        m_ptTo = point;
        
    }
}

利用SetROP2函数可以有效擦除已画的线

//原型:
//Sets the current drawing mode. 
int SetROP2(
   int nDrawMode 
);


图片

效果:
图片

代码:
利用颜色反转来划线,之前的旧线

void CMainWindow::InvertLine(CDC* pDC, CPoint ptFrom, CPoint ptTo)
{
    int nOldMode = pDC->SetROP2(R2_NOT);
    CPen pen(PS_DASH, 0, RGB(0, 0, 0));
    HGDIOBJ oldPen =pDC->SelectObject(pen);
    pDC->MoveTo(ptFrom);
    pDC->LineTo(ptTo);
    pDC->SelectObject(oldPen);
    pDC->SetROP2(nOldMode);
}

2.利用鼠标的捕获***SetCapture***与***ReleaseCapture***

与***GetCapture***

void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point)
{
    //避免鼠标移出客户区无法捕获
    if(m_bCaptureEnabled)
        SetCapture();

    m_bTracking = TRUE;
    m_ptFrom = point;
    m_ptTo = point;
   

}

无法捕获的效果
图片


void CMainWindow::OnLButtonUp(UINT nFlags,CPoint point)
{
    

  
    if (m_bTracking)
    {
        m_bTracking = FALSE;
        //getcapture 返回捕获鼠标的对象
        if(GetCapture()==this)
        //释放捕获
            ::ReleaseCapture();
    }
	CClientDC dc(this);

	InvertLine(&dc, m_ptFrom, point);

	CPen RedPen(PS_SOLID, 16, RGB(255, 0, 0));
	HGDIOBJ OldPen = dc.SelectObject(RedPen);

	dc.MoveTo(m_ptFrom);
	dc.LineTo(point);
    dc.SelectObject(OldPen);
}

3.NCMessage的处理-要传递给父类默认处理函数处理
/*
       m_bCaptureEnabled = m_bCaptureEnabled ? FALSE : TRUE;用于频繁改变FALSE/TRUE的写法
*/
void CMainWindow::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
    if (nHitTest == HTCAPTION)
    {
       m_bCaptureEnabled = m_bCaptureEnabled ? FALSE : TRUE;
       SetWindowText( m_bCaptureEnabled ? _T("Mouse Capture Demo(capture Enabled)"):_T("Mouse Capture Demo(capture Disabled)"));
    }
    //传递给父类默认处理函数处理
    CFrameWnd::OnNcLButtonDown(nHitTest, point);   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值