`
isiqi
  • 浏览: 16085721 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

MFC学习笔记之简单绘图一

阅读更多

绘制线条

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);

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics