VC用异或笔画动态拖选框(方框随着鼠标拖动而变化)


描述:我们平时想要选择一个区域东西的时候,会用鼠标拖动选择,那个时候会有一个随着鼠标动的方框,下面的代码就是实现这个的

先说下异或笔:
R2_NOTXORPEN是C++中一种绘画模式,它先把画笔颜色与屏幕颜色异或,(这里异或是数学计算,1与1为0,1与0为1,我们说颜色其实就是二进制数,)异或之后再取反最后得到一个颜色值显示在屏幕上。
举个例子,你使用R2_NOTXORPEN这种绘画模式,你用红色画笔在黑色背景上画一条直线,显示红色,但你再用这只笔在刚画的直线上重画一遍,就相当于把开始画的红线擦除掉了,划线的地方显示为背景色
void  Clesson4View::OnMouseMove( UINT  nFlags, CPoint point)
{   
  
      if  (m_bdraw)   
  {   
    
         CClientDC dc( this );
 
         CBrush *pBrush=CBrush::FromHandle(( HBRUSH )GetStockObject(NULL_BRUSH));   
         CBrush *PoldBrush=dc.SelectObject(pBrush); 
         int  oldmode=dc.SetROP2(R2_NOTXORPEN);
         //dc.Ellipse(CRect(m_beginpoint,m_movepoint));
         dc.Rectangle(CRect(m_beginpoint,m_movepoint));
         m_movepoint=point;
         //dc.Ellipse(CRect(m_beginpoint,m_movepoint));
         dc.Rectangle(CRect(m_beginpoint,m_movepoint));
         dc.SelectObject(PoldBrush);
         dc.SetROP2(oldmode);  
       //  m_movepoint=point;  
         //dc.Rectangle(CRect(m_beginpoint,m_movepoint));
         //dc.Ellipse(CRect(m_beginpoint,m_movepoint));
 
         ReleaseDC(&dc);            
  }   
   
   CView::OnMouseMove(nFlags, point);   
}  
 

void  Clesson4View::OnLButtonDown( UINT  nFlags, CPoint point)
{
     // TODO: 在此添加消息处理程序代码和/或调用默认值
     m_beginpoint=point;
     m_bdraw= true ;
     m_beginpoint = m_movepoint = point; 
 
     CView::OnLButtonDown(nFlags, point);
}
 
 
void  Clesson4View::OnLButtonUp( UINT  nFlags, CPoint point)
{
     m_bdraw= false ;
     CView::OnLButtonUp(nFlags, point);
}
可以在 MFC 应用程序框架中的 CView 类中重载 OnMouseMove 函数,在该函数中获取鼠标左键的状态,然后通过 CDC 的相关函数在视图上绘制一个尾效果。 具体步骤如下: 1. 在 CView 类中添加成员变量,用于记录鼠标左键是否按下以及鼠标上一次的位置: ```c++ class CMyView : public CView { protected: BOOL m_bLButtonDown; // 鼠标左键是否按下 CPoint m_ptPrev; // 鼠标上一次的位置 ... }; ``` 2. 在 CView 类的构造函数中初始化成员变量: ```c++ CMyView::CMyView() { m_bLButtonDown = FALSE; ... } ``` 3. 重载 OnLButtonDown、OnLButtonUp 和 OnMouseMove 函数,处理鼠标左键按下、松开和移动事件: ```c++ void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { m_bLButtonDown = TRUE; m_ptPrev = point; CView::OnLButtonDown(nFlags, point); } void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { m_bLButtonDown = FALSE; CView::OnLButtonUp(nFlags, point); } void CMyView::OnMouseMove(UINT nFlags, CPoint point) { if (m_bLButtonDown) { CDC* pDC = GetDC(); pDC->SetROP2(R2_NOTXORPEN); pDC->MoveTo(m_ptPrev); pDC->LineTo(point); m_ptPrev = point; ReleaseDC(pDC); } CView::OnMouseMove(nFlags, point); } ``` 在 OnMouseMove 函数中,如果鼠标左键按下,就获取设备上下文 DC,设置绘图模式为异或笔,绘制一条从鼠标上一次的位置到当前位置的线段,然后更新鼠标上一次的位置。注意,要在释放设备上下文 DC 之前调用 ReleaseDC。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值