绘制线条
1、利用SDK全局函数实现画线功能
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);
注:为了进行画图操作,必须获得一个设备描述表DC;在完成绘图操作后,一定要释放设备描述表资源
2、利用MFC的CDC类实现画线功能
CDC* pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
CView::OnLButtonUp(nFlags, point);
注:MFC提供了一个设备描述表的封装类CDC,该类封装了所有与绘图相关的操作;并提供了一个数据成员m_hDC,
用来保存与CDC类相关的DC句柄
3、利用MFC的CClientDC类实现画线功能
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
注:MFC提供了CClientDC类来实现绘图操作,该类继承于CDC类;在构造时调用GetDC函数,在析构时调用Release
函数;在构造CClientDC对象时,需要一个CWnd类型的指针参数,传递this表示视类窗口,传递GetParent()表示
框架窗口
4、利用MFC的CWindowDC类实现画线功能
CWindowDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
注:CWindowDC类与CClient类基本相同,区别在于该类可以访问整个窗口区域,包括框架窗口的客户区和非客户区
5、在桌面窗口中画线
CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
注:CWnd::GetDesktopWindow成员函数可以获得Windows桌面窗口的句柄,从而获得一个与桌面窗口相关的设备描
述表,就可以在桌面窗口中绘图
6、绘制彩色线条
(1)设备描述表中有一个默认的黑色画笔
(2)MFC提供了CPen类用于创建画笔对象,该类封装了与画笔相关的操作
(3)当构建一个GDI对象后,该对象并不会立即生效,必须选入设备描述表,它才会在以后的绘制操作中生效
(4)一般情况下,在完成绘图操作之后,都要利用SelectObject函数把先前的GDI对象选入设备描述表,以便使其
恢复到先前的状态
(5)画笔的宽度要小于等于1时,虚线线型才有效
(6)实现代码
CPen pen(PS_SOLID,1,RGB(255,0,0));
CClientDC dc(this);
CPen* pOldPen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);
使用画刷绘图
1、简单画刷
(1)MFC提供了CBrush类,用于创建画刷对象,从而可以填充一块区域
(2)设备描述表对象的成员函数FillRect,用于利用指定的画刷填充一块指定的矩形区域
(3)实现代码
CBrush brush(RGB(255,0,0));
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
2、位图画刷
(1)CBrush类的CBrush(CBitmap* pBitmap)构造函数可以创建一个位图画刷对象
(2)CBitmap类是位图类,构建该类对象时,除了要调用构造函数,还要调用LoadBitmap初始化函数
(3)实现代码
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
3、透明画刷
(1)设备描述表中有一个默认的白色画刷
(2)GetStockObject函数用于获取一个白色或黑色的画刷句柄
(3)静态成员(静态成员变量和静态成员函数)属于类本身,在类加载的时候,即为它们分配了空间,所以可以通过
类名::变量名/函数名来访问;而实例成员属于对象的数据和方法,也就是应该首先产生类的对象,然后通过类的对
象去引用
(4)在静态成员函数中不能调用非静态成员,而只能访问静态成员变量
(5)无论采用什么样的操作,程序代码都是在内存中运行的,只有在内存中占有了一席之地,我们才能够访问它。如
果一个成员函数或成员变量还未在内存中产生,结果是无法访问它的
(6)实现代码
CClientDC dc(this);
CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush* pOldBrush=dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush);
四、绘制连续线条
1、鼠标移动消息WM_MOUSEMOVE,可用来绘制连续线条
2、实现代码
CClientDC dc(this);
if(m_bDraw)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin=point;
}
五、绘制扇形效果的线条
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen* pOldPen=dc.SelectObject(&pen);
if(m_bDraw)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.LineTo(m_ptOld);
m_ptOld=point;
}
dc.SelectObject(pOldPen);