- 环境:VS2010
添加消息响应
在MFC Class Wizard 中,选择CyourView类中添加消息相应,鼠标左键按下,鼠标左键抬起,鼠标移动3个消息相应
代码
消息响应
void CrectView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
Invalidate();
m_startRect = TRUE; //鼠标左键单击,设置可以开始绘制矩形框
m_startPoint = point; //记录开始点
m_OldPoint = point; //设置老点也为开始点
CClientDC dc(this);
InvalidateRect(NULL,true);
UpdateWindow();
CView::OnLButtonDown(nFlags, point);
}
void CrectView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_startRect = FALSE; //重置绘制矩形框标志
CClientDC dc(this);
OnPrepareDC(&dc);
dc.DPtoLP(&m_OldPoint);
dc.DPtoLP(&m_startPoint);
dc.SetROP2(R2_NOT); //消隐最后的一个矩形(其原理跟拖动时矩形框绘制原理相同)
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(CRect(m_startPoint,m_OldPoint));
//dc.Rectangle(CRect(m_startPoint,m_OldPoint));如果想把矩形留下来加上这句代码
CView::OnLButtonUp(nFlags, point);
}
void CrectView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this); //获取设备句柄
dc.SetROP2(R2_NOT); //关键
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);
}
变量
可在在MFC Class Wizard 中,选择CyourView类中添加3个变量,也可以直接在CyourView的头文件中直接添加如下代码
public:
CPoint m_startPoint; //矩形框开始点
CPoint m_OldPoint; //矩形框终点(但是它是上一次的点,所以这里用了Old标识)
bool m_startRect; //绘制矩形框标志