来自孙鑫《VC++深入详解》
客户区:即视类窗口
非客户区:包括标题栏、菜单栏、工具栏和状态栏。
在画图之前,需要获取线图的起始点与终点。即鼠标左键按下是起始点,左键弹起是终点。
以下代码中的m_ptOrigin均记录在OnLButtonDown函数中,m_ptOrigin = point ;
一:利用Platform SDK函数实现客户区画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
//首先获得窗口的设备描述表
HDC hdc;
hdc = ::GetDC( m_hWnd );
//移动到线条的起点
MoveToEx( hdc, m_ptOrigin.x, m_ptOrigin.y, NULL );
//画线
LineTo( hdc, point.x, point.y );
//释放设备描述表
::ReleaseDC( m_hWnd, hdc );
CView::OnLButtonUp(nFlags, point);
}
二:利用MFC的CDC类在客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
CDC *pDC = GetDC();
pDC->MoveTo( m_ptOrigin );
pDC->LineTo( point );
ReleaseDC( pDC );
CView::OnLButtonUp(nFlags, point);
}
三:利用MFC的CClientDC类在客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
四:利用MFC的CWindowDC类在客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
五:利用MFC的CClientDC类在非客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
注:视类窗口只有客户区(即视类窗口本身),而框架窗口既有客户区(即菜单栏以下部分),还有非客户区(标题栏、菜单栏、工具栏和状态栏)。视窗口的父窗口就是框架窗口即与CMainFrame类相关联的窗口
六:利用MFC的CWindowDC类在非客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc( GetParent() );
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
七:利用MFC的CWindowDC类在桌面区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}