MFC 动态的画线 画当前的线是清除上一次画的线

所谓的动态画线,画矩形,画椭圆的本质就是在于消隐问题的解决以及对Windows消息循环机制的理解,消隐问题:
因为MFC中有一个函数SetROP2,通过将该函数的参数设置为R2—NOT(当前绘制的像素值设为屏幕像素值的反色,“屏幕”二字是指你所绘制的图形所占据的那一部分屏幕区域,即直线所占的屏幕区域就是直线所在的那一段线的区域),利用这一点通过在同一区域重复画两次便可以将该区域的形状消隐。

 

首先:建立一个单文档程序,名称为Demo

然后:在视图类的声明文件里面加入数据成员
class  CDemoView :  public  CView
{
//········
protected :
     
     int  m_Dragging;
     HCURSOR  m_HCross;
     CPoint m_PointOld;
     CPoint m_PointOrigin;
//········
};
接着:在视图类的构造函数里面
CDemoView::CDemoView()
{
     // TODO: add construction code here
     m_Dragging=0;
     m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS); //载入标准的十字光标
}
接着:为视图类添加鼠标左键,鼠标移动,鼠标左键释放消息
void  CDemoView::OnLButtonDown( UINT  nFlags, CPoint point) 
{
     // TODO: Add your message handler code here and/or call default
     ::SetCursor(m_HCross); //这一句能防止左键单击的时候,保持鼠标样式不变
     m_PointOrigin=point;
     m_PointOld=point;
     SetCapture(); //捕获鼠标,充分控制鼠标
     m_Dragging=1;
     RECT Rect;
     GetClientRect(&Rect); //取得窗口当前显示坐标
     ClientToScreen(&Rect); //转换为屏幕坐标
     ::ClipCursor(&Rect); //限定光标在指定矩形了吗
     CView::OnLButtonDown(nFlags, point);
}
  
void  CDemoView::OnMouseMove( UINT  nFlags, CPoint point) 
{
     // TODO: Add your message handler code here and/or call default
     ::SetCursor(m_HCross);
     if  (m_Dragging)
     {
         CClientDC ClientDC( this );
         ClientDC.SetROP2(R2_NOT); //逆转当前屏幕颜色来画线的绘图方式
         ClientDC.MoveTo(m_PointOrigin); //
         ClientDC.LineTo(m_PointOld);    //擦去上一次的线
         ClientDC.MoveTo(m_PointOrigin);
         ClientDC.LineTo(point); //绘制这一次的临时线
         m_PointOld=point;
     }
     CView::OnMouseMove(nFlags, point);
}
  
void  CDemoView::OnLButtonUp( UINT  nFlags, CPoint point) 
{
     // TODO: Add your message handler code here and/or call default
     if  (m_Dragging)
     {
         m_Dragging=0;
         ::ReleaseCapture(); //结束捕获鼠标
         ::ClipCursor(NULL); //解锁鼠标
         CClientDC ClientDC( this );
         ClientDC.SetROP2(R2_NOT);
         ClientDC.MoveTo(m_PointOrigin);
         ClientDC.LineTo(m_PointOld); //擦去上一次的临时线
         ClientDC.SetROP2(R2_COPYPEN); //缺省绘图模式,像素为画笔颜色
         ClientDC.MoveTo(m_PointOrigin);
         ClientDC.LineTo(point); //绘制固定线
     }
     CView::OnLButtonUp(nFlags, point);
}

转载于:https://www.cnblogs.com/vipwtl/p/7795679.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值