绘制线条的时候需要两个点
在这里选取的两个点是,一个是鼠标按下(LBUTTONDOWN)和鼠标松开(LBUTTONUP)传递连个点的信息
第一种方法: 使用SDK全局函数
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 |
//首先获得窗口的设备描述表 HDC hdc; hdc =::GetDC(m_hWnd); //移动到线条的起点 MoveToEx(hdc, m_CPoint.x, m_CPoint.y, null); //画线 LineTo(hdc, point.x, point.y); //释放设备描述表 ::ReleaseDC(m_hWnd, hdc); |
因为CWnd类提供了成员函数GetDc和ReleaseDC,因此利用SDK函数实现画线功能时,这两个函数前面都要加上两个冒号,表明它们是全局SDK函数
第二种方法:利用MFC的CDC类实现画线功能
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 |
//定义一个指针类型的CDC,并获取对象的DC CDC *pDC = GetDC(); //移动到起始位置 pDC->MoveTo(m_CPoint); //画线 pDC->LineTo(point); //释放DC ReleaseDC(pDC); |
(3)利用MFC提供的CClientDC类来实现
C++ Code
1
2 3 4 |
CClientDC dc( this); dc.MoveTo(m_CPoint); dc.LineTo(point); |
在构造CClientDC对象时,需要一个CWnd类型的指针作为参数,利用CClientDC类绘图时,会自动调用RelaseDc函数释放设备资源。
当要在父类的窗口上
CClientDC dc(GetParent());
(4)利用MFC的CWindowDC类实现画线功能
此处略去
(5)在桌面窗口中画线
C++ Code
1
2 3 4 |
//用GetDesktopWindow成员函数获得Windows桌面窗口的句柄 CWindowDC dc(GetDesktopWindow()); dc.MoveTo(m_CPoint); dc.LineTo(point); |
(6)绘制彩色线条
如果想要绘制其他颜色的线条,首先需要创建一个特定颜色的画笔,然后将此画笔选入设备描述表中,接下来绘制的线条的颜色就由这个新画笔的颜色决定了
CPen( int
nPenStyle
, int
nWidth
, const LOGBRUSH*
pLogBrush
, int
nStyleCount
= 0, const DWORD*
lpStyle
= NULL );
throw( CResourceException );
MFC提供CPen来创建画笔对象,在程序中,当构造一个GDI对象后,该对象并不会立即生效,必须选入设备描述表,他才会在以后的绘制操作中生效,利用SelectObject函数可以实现把GDI对象选入设备描述表中,并且该函数会返回指向先前被选对象的指针。这主要是为了在完成当前绘制操作后,还原设备描述表用的
首先创建一个实线画笔,其宽度为1,颜色为红色,接着利用SelectObject函数将新画笔对象选入设备描述表,再利用画线函数绘制线条,然后再次调用SelectObject函数恢复设备描述表中的画笔对象。
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//创建一个画笔 CPen m_Pen(PS_SOLID, 10, RGB( 255, 0, 0)); //用SelectObject函数将新画笔对象选入设备描述表 CClientDC dc( this); CPen *pOldPen = dc.SelectObject(&m_Pen); //移动到起始位置 dc.MoveTo(m_CPoint); //画线 dc.LineTo(point); //恢复设备描述表中的画笔对象 dc.SelectObject(pOldPen); |