目录
DC
GDI
CDC类
CPen类
CBrush类
文本、字体和CFont类
图元文件设备描述环境CMetaFileDC类
虚拟图形设备表现为一个叫做图形设备描述表的数据结构,描述了虚拟图形设备的属性;
windows是一种图形界面的操作系统,它把包括文本在内的所有数据都显示为屏幕上的图像。因此,图形的处理是Windows程序设计的重要问题。Windows是依靠图形设备接口(GDI)和设备描述环境(device context,DC)对图形进行支持的。
虚拟图形设备:由于计算机图形显示设备品种繁多,原理和结构差别巨大,要求程序设计人员拥有所有图形显示设备的知识和编程能力是不现实的,Windows为图形设备进行了软件的封装,形成了虚拟图形设备;
注意:虚拟设备图形转化为物理设备图形的任务是由系统去完成的;
Windows把用于改变DC属性的操作,即与绘图相关的操作都制作成函数,这些函数的集合就叫做图形设备接口(Graphical Device Interface,GDI);
GDI中的绘图工具:
Pen(画笔) 用来绘制线条的对象
Brush(画刷) 用来填充图形内颜色和图案的对象
Front(字体) 用来决定文字字符样式的对象
Bitmap(位图) 保存位图格式图像的对象
Pelette(调色板) 绘图时可以使用的颜色集
注意:应用程序如果需要向某个图形设备绘图,则应该先获得(创建)这个图形设备 的DC,然后再取得并使用合适的绘图工具对DC进行绘图工作;
在面向对象思想中,把DC和GDI函数封装到一起形成的类;
CDC类的一些常用的成员函数:
Arc() 画圆弧
BitBlt() 把一个DC中的位图复制到另一个DC中
Ellipse() 画椭圆
FillRect() 用参数指定的画刷来填充矩形
LineTo() 从当前位置画直线到参数指定的位置
MoveTo() 从当前位置把画笔移动到参数指定的位置
Rectangle() 画矩形
RoundRect() 画圆角矩形
SelectObject() 把参数所指定的绘图工具选入绘图环境
SelectStockObject() 把参数所指定的库存绘图工具选入绘图环境
SetTextColor() 设置文本颜色
StretchBlt() 把一个DC中的位图复制到另一个DC中,但可以改变位图的长宽比
TextOut() 绘制字符串
CDC的派生类:
CClientDC:窗口客户区的设备描述环境,但应用在WM_PAINT消息之外的消息处理函数中;
CMetaFileDC:图元文件的设备描述环境,在创建可以回访的图像时使用;
CPaintDC:窗口用户区的设备描述环境,在OnDraw()函数中来处理WM_PAINT消息;
CWindowDC:在整个窗口内(不只是用户区)绘图的设备描述环境;
CPaintDC是所有CDC类中最常用的一个类,它代表应用程序窗口的客户区,它只能使用在CView类的OnDraw()函数中;
OnDraw(CDC *pDC);
这个函数的参数pDC就是指向CPaintDC对象的指针,在OnDraw的函数中可以使用CDC类的成员函数对这个对象进行绘图操作;
注意:系统每次创建应用程序的窗口及窗口需要刷新时会残生WM_PAINT消息,系统接收到这个消息就会自动调用OnDraw()函数;
CObject -> CGdiObject -> CPen
构造函数:CPen(int style, int width, COLORREF color);
style:定义画笔的样式,该参数可取的值和所对应的样式:
PS_SOLID 实线画笔
PS_DASH 虚线画笔
PS_DOT 点线画笔
PS_DASHDOT 点划线画笔
PS_DASHDOTDOT 双点划线画笔
PS_NULL 笔画不可见的画笔
PS_INSIDEFRAME 在一个图形内画边线的画笔
width:用来设置画笔宽度,这个宽度的计量单位为像素;
color:用来设置画笔颜色,颜色用RGB值来描述;
COLORREF RGB(
BYTE bRed, //红色(0~255)
BYTE bGreen, //绿色(0~255)
BYTE bBlue //蓝色(0~255)
);
注意:在创建画笔之后,如果使用它,则需要在使用之前调用CDC的成员函数SelectObjext()用自定义的画笔替换原来的画笔。
CPen * SelectObject(CPen * pPen);
参数为欲载入画笔的指针,返回值为原来画笔的指针。为保存原画笔以便在新画笔使用后,恢复原画笔:
CPen newPen(PS_SOLID, width,color); //创建新画笔
CPen * oldPen = pDC -> SelectObject(&newPen); //加入新画笔,保存旧画笔
pDC ->SelectObject (oldPen); //旧画笔重新载入
画刷是CBrush类的对象,是对封闭图形内部用颜色或图案进行填充的工具;
构造函数:
CBrush(COLORREF color);
和
CBrush(int style, COLORREF color);
style:画刷的样式
HS_BDIAGONAL 以自左下角至右上角的45°斜线填充
HS_CROSS 以十字交叉线填充
HS_DIAGCROSS 以互相交叉的45°线填充
HS_FDIAGONAL 以自左上角至右下角的45°斜线填充
HS_HORIZONTAL 以水平填充
HS_VERTICAL 以垂直线填充
绘图模式:windows中,绘图的最终效果可以通过设定不同的绘图模式来修饰;
设置绘图模式CDC类的成员函数:SetROP(int nDrawMode);
nDrawMode:绘图模式,返回值为原来的绘图模式;
R2_BLACK 无论画笔颜色如何,只用黑色绘图;
R2_WHITE 无论画笔颜色如何,只用白色绘图;
R2_NOP 无论画笔颜色如何,只用无色绘图;
R2_NOT 用与背景色相反的颜色绘图;
R2_NOTCOPYPEN 用画笔颜色绘图;
R2_XORPEN 把画笔色与背景色进行异或(XOR)运算后的颜色绘图;
显示文本:
BOOL TextOut(int x, int y , const CString & str);
参数x:文本显示在应用程序窗口用户区的水平位置;
参数y:文本的垂直位置;
参数str:CString对象,要显示的字符串;
设置文本颜色:
Virtual COLORREF SetTextColor(COLORREF crColor);
参数crColor:文本颜色的RGB值,函数的返回值为原来的颜色;
获取当前文本颜色:
COLORREF GetTextColor()const;
设置背景颜色:
Virtual COLORREF SetBkColor(COLORREF crColor);
获取当前背景颜色:
COLORREF GetBkColor()const;
设置文本字符的间距:
int SetTextCharacterExtra(int nCharExtra);
参数nCharExtra:要设置文本字符的额外间隔,以像素为单位;
函数返回值为字符的原间距;
获取当前字符间距的函数:
int GetTextCharacterExtra()const;
设置文本的对齐方式:
UINT SetTextAlign(UNIT nFlags);
参数nFlags:
TA_LEFT 左对齐
TA_CENTER 中间对齐
TA_RIGHT 右对齐
TA_TOP 顶部对齐
TA_BOTTOM 底部对齐
TA_BASELINE 以基线对齐
为了准确显示文本,windows用一个TEXTMETRIC结构类型的数据来存储字体的信息;
获取当前字体的信息:
BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics)const;
在视图类OnDraw()函数中使用该函数获取字体信息:
TEXTMETRIC tm;
pDC -> GetTextMetrics(&tm);
创建字体对象的原型:
BOOL CreateFont( int cHeight, //字体的逻辑高度 int cWidth, //字体的逻辑宽度 int cEscapement, //指定移位向量相对X轴的偏转角度 int cOrientation, //指定字符基线相对X轴的偏转角度 int cWeight, //设置字体粗细程度 DWORD bItalic, //是否启用斜体 DWORD bUnderline, //是否启用下划线 DWORD bStrikeOut, //是否启用删除线 DWORD iCharSet, //指定字符集 DWORD iOutPrecision, //输出精度 DWORD iClipPrecision, //剪裁精度 DWORD iQuality, //输出质量 DWORD iPitchAndFamily, //字体族和调距 LPCSTR pszFaceName //字体名 );
使用预存的字体:
BOOL CreateFontIndirect(const LOGFONT *lpLogFont);
CDC的派生类:
窗口用户区设备描述环境CClientDC类:
CPaintDC和CClientDC的区别:
CPaintDC类的对象只能在视图类的OnDraw()函数中使用,而后者的对象可以除了OnDraw()函数之外的任何地方都可以;
图元文件:在应用程序中,有一些图形是需要经常重复显示的,这样的图形最好事先绘制好形成一个文件,并存储在内存中,当用到它的时直接打开就行了;
注意:制作图元文件需要一个特殊的设备描述环境CMetaFileDC类,他是由CDC类继承来的,因此包含CDC类的所有绘图方法;
先定义一个CMetaFileDC类的对象,在视图类的OnCreate()函数中创建图元文件,最后使用Close()函数结束绘制并保存该图元文件到类的数据成员中(该数据成员的类型应为HMETAFILE)
BOOL Create (LPCTSTR lpszFilename = NULL);
参数lpszFilename :图元文件的文件名;
显示图元文件:
BOOL PlayMetaFile(HMETAFILE hMF);
注意:当不用该图元文件时,要用函数DeleteMetaFile()将其删除;