VC - MFC鼠标拖动效果编程

要实现的功能实际上很简单,一般人都用到见惯不惯了,但是实现起来还是有点意思的。

问题详细描述:(三步)
单击鼠标左键时记录下单击点;
鼠标拖动时,显示的矩形框能够动态的跟随显示;
释放鼠标左键时擦出矩形框。

这样分析其实问题就简单一些了,只需要对鼠标的三个事件进行相应就可以了。
代码主要在三处地方修改了:

第一处:VIEW类中设置私有变量(VIEW类.h文件中)

private:
BOOL m_startRect;   //绘制矩形框标志
CPoint m_startPoint; //矩形框开始点
CPoint m_OldPoint;   //矩形框终点(但是它是上一次的点,所以这里用了Old标识)

第二处:VIEW类构造函数中初始化私有变量(VIEW类.cpp文件中)

CMouseDragView::CMouseDragView()
{
//初始化私有变量
m_startRect = FALSE;
m_startPoint = 0;
m_OldPoint = 0;
}

第三处:定义消息响应函数(VIEW类.cpp文件中)

//单击鼠标左键
void CMouseDragView::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
m_startRect = TRUE;   //鼠标左键单击,设置可以开始绘制矩形框
m_startPoint = point; //记录开始点
m_OldPoint = point;   //设置老点也为开始点

CView::OnLButtonDown(nFlags, point);
}

//拖动鼠标
void CMouseDragView::OnMouseMove(UINT nFlags, CPoint point) 
{
CClientDC dc(this);   //获取设备句柄

//SetRop2 Specifies the new drawing mode.(MSDN)
//R2_NOT   Pixel is the inverse of the screen color.(MSDN)
//即:该函数用来定义绘制的颜色,而该参数则将颜色设置为原屏幕颜色的反色
//这样,如果连续绘制两次的话,就可以恢复原来屏幕的颜色了(如下)
//但是,这里的连续两次绘制却不是在一次消息响应中完成的
//而是在第一次拖动响应的绘制可以显示(也就是看到的),第二次拖动绘制实现擦出(也就看不到了)
dc.SetROP2(R2_NOT);   //此为关键!!!如果设置为R2_XORPEN 则为画笔的反色
dc.SelectStockObject(NULL_BRUSH); //不使用画刷
if (TRUE == m_startRect)   //根据是否有单击判断是否可以画矩形
{
   dc.Rectangle(CRect(m_startPoint,m_OldPoint)); 
   dc.Rectangle(CRect(m_startPoint,point));
   m_OldPoint = point;
}

CView::OnMouseMove(nFlags, point);
}

//释放鼠标左键
void CMouseDragView::OnLButtonUp(UINT nFlags, CPoint point) 
{
m_startRect = FALSE; //重置绘制矩形框标志

//消隐最后的一个矩形(其原理跟拖动时矩形框绘制原理相同)
CClientDC dc(this);
dc.SetROP2(R2_NOT); 
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(CRect(m_startPoint,m_OldPoint));

CView::OnLButtonUp(nFlags, point);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值