下面用标题中的三种绘图函数,实现在对话框界面上点击一个位置不松开鼠标,拖动到另一个位置抬起鼠标实现画线的功能。
::GetDC
这个是个全局函数,调用起来比较繁琐,但是正是因为这样,才会理解后面的包装函数都自动做了那些事情。
鼠标按下的事件响应函数:
该函数只保存起点位置
void CMFCApplication1Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_OriginPoint = point;
CDialogEx::OnLButtonDown(nFlags, point);
}
鼠标抬起的事件响应函数:
该函数实现完整的画线功能
void CMFCApplication1Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
HDC hdc;
hdc = ::GetDC(m_hWnd);
MoveToEx(hdc, m_OriginPoint.x, m_OriginPoint.y, nullptr);
LineTo(hdc, point.x, point.y);
::ReleaseDC(m_hWnd, hdc);
CDialogEx::OnLButtonUp(nFlags, point);
}
CClientDC 重点
该类派生自CDC类,并在构造时自动调用GetDC,析构时调用ReleaseDC,代码简洁了很多(只修改鼠标抬起响应事件即可)
它只能在窗口的客户区(即窗口中除了边框、标题栏、菜单栏以及状态栏外的中间部分)中进行绘图,坐标点(0,0)通常指的是客户区的左上角。
void CMFCApplication1Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.MoveTo(m_OriginPoint);
dc.LineTo(point);
CDialogEx::OnLButtonUp(nFlags, point);
}
在父窗口中绘图
只需要获取父窗口的句柄即可
void CMFCApplication1Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(GetParent());
dc.MoveTo(m_OriginPoint);
dc.LineTo(point);
CDialogEx::OnLButtonUp(nFlags, point);
}
GetWindowDC
该类可以认为和CClientDC没有任何区别。CClientDC也可以通过传入对应的句柄来达到同样的效果。
CWindowDC类也是CDC类的派生类。其成员函数可以在窗口的客户区和非客户区(即窗口的边框、标题栏、菜单栏以及状态栏)中绘图,坐标点(0,0)是指整个屏幕的左上角。