赞
踩
- private:
- BOOL m_startRect; //绘制矩形框标志
- CPoint m_startPoint; //矩形框开始点
- CPoint m_OldPoint; //矩形框终点(但是它是上一次的点,所以这里用了Old标识)
- CMouseDragView::CMouseDragView()
- {
- //初始化私有变量
- m_startRect = FALSE;
- m_startPoint = 0;
- m_OldPoint = 0;
- }
- //单击鼠标左键
- 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);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。