对于DC的理解

  • 格式:docx
  • 大小:16.00 KB
  • 文档页数:2

VC中的DC 指设备环境函数(Device Context)
1.什么是DC
当使用GDI函数路MoveToEx/Line to, TextOut时,只是告诉系统要输出图形或者文字了。

但是用什么样的笔(HPEN),字是什么颜色(SetTextColor),画在哪张“纸”(HBITMAP)上都需要从一个系统定义的数据结构中去读取。

这个数据结构就被称为Device Context(DC)
即,GDI函数只是绘画的动作,而DC则保存了绘画所需的材料和工具。

2 设备环境和设备环境函数
设备环境是一个结构,它定义了一系列图形对象及其相关的属性,以及会影响输出结构的绘图方式。

这些图形对象包括: 画笔,笔刷,位图,调色板等。

设备环境函数DC用于对设备环境进行创建、删除或获取信息。

3.DC, HDC, CDC, CClientDC有什么本质区别
HDC就是最原始的DC句柄,很多API的第一个参数就是HDC类型。

比如:HDC hDC=::GetDC(m_hWnd);
::MoveToEx(hDc,0,0, NULL);
::LineTo(hDC,0,100);
::ReleaseDC(m_hWnd,hDC);
在MFC中,将API封装为一个类来操作,因此多出来一个CDC。

所以在MFC中,都是
CDC dc=GetDC();
dc.MoveTo(0,0);
dc.LineTo(0,0);
this->ReleaseDC(&dc);
但是这样的CDC 需要自己去释放DC,所有MFC中又多出来一个CClinetDC,因为CClintDC不需要单独去获取和释放一个DC,在定义一个CClintDC变量时就会自动调用GetDC和ReleaseDC
这样上述就可以简化为:
CClinetDCdc(this);
dc.MoveTo(0,0);
dc.LineTo(0,0);
补充:
(1)CWindowDC,CPaintDC与CClintDC一样都是CDC中派生出来的类,只是它们的绘制范围不一样。

CClintDC只能访问客户区,而
CWindowDC可以访问客户区和非客户区(标题栏,菜单栏等)(2)说到底,这些DC都是HDC的一些封装而已,你可以在CDC类中直接引用m_hDC, 就是最原始的HDC句柄了。

总结:(1)CDC是MFC的DC的一个封装类, CDC等设备上下分类,都含有一个类的成员变量:m_nHdc,即HDC类型的句柄
(2)HDC是DC的句柄,即API中的一个类似指针的数据类型;
(3)在MFC中所有类的前缀都是C开头的。

H开头的大都是句柄。

(4)MFC的类,是在windows API语句开发出来的有一定功能的小程序。

4. MFC
Cwnd:窗口,它是一个父类,比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;都是从窗口派生出来的。

注意CMenu 不是从窗口派生的。

CDocument文档,负责内存数据与磁盘的互动。

最重要的是OnOpenDocument. OnSaveDocument. Serialize。