目录

DC

GDI

CDC类

CPen类

CBrush类

文本、字体和CFont类

图元文件设备描述环境CMetaFileDC类


DC

虚拟图形设备表现为一个叫做图形设备描述表的数据结构,描述了虚拟图形设备的属性;

windows是一种图形界面的操作系统,它把包括文本在内的所有数据都显示为屏幕上的图像。因此,图形的处理是Windows程序设计的重要问题。Windows是依靠图形设备接口(GDI)和设备描述环境(device context,DC)对图形进行支持的。

虚拟图形设备:由于计算机图形显示设备品种繁多,原理和结构差别巨大,要求程序设计人员拥有所有图形显示设备的知识和编程能力是不现实的,Windows为图形设备进行了软件的封装,形成了虚拟图形设备;

注意:虚拟设备图形转化为物理设备图形的任务是由系统去完成的;

GDI

Windows把用于改变DC属性的操作,即与绘图相关的操作都制作成函数,这些函数的集合就叫做图形设备接口(Graphical Device Interface,GDI);

GDI中的绘图工具:

Pen(画笔) 用来绘制线条的对象

Brush(画刷) 用来填充图形内颜色和图案的对象

Front(字体) 用来决定文字字符样式的对象

Bitmap(位图) 保存位图格式图像的对象

Pelette(调色板) 绘图时可以使用的颜色集

注意:应用程序如果需要向某个图形设备绘图,则应该先获得(创建)这个图形设备 的DC,然后再取得并使用合适的绘图工具对DC进行绘图工作;

CDC类

在面向对象思想中,把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()函数;

CPen类

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类的对象,是对封闭图形内部用颜色或图案进行填充的工具;

构造函数:

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)运算后的颜色绘图;

文本、字体和CFont类

显示文本:

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类

图元文件:在应用程序中,有一些图形是需要经常重复显示的,这样的图形最好事先绘制好形成一个文件,并存储在内存中,当用到它的时直接打开就行了;

注意:制作图元文件需要一个特殊的设备描述环境CMetaFileDC类,他是由CDC类继承来的,因此包含CDC类的所有绘图方法;

先定义一个CMetaFileDC类的对象,在视图类的OnCreate()函数中创建图元文件,最后使用Close()函数结束绘制并保存该图元文件到类的数据成员中(该数据成员的类型应为HMETAFILE)

BOOL Create (LPCTSTR lpszFilename = NULL);

参数lpszFilename :图元文件的文件名;

显示图元文件:

BOOL PlayMetaFile(HMETAFILE hMF);

注意:当不用该图元文件时,要用函数DeleteMetaFile()将其删除;

MFC GDI图形的那些事相关推荐

  1. MFC+GDI+绘制出雷达余晖效果

    MFC+GDI+绘制出雷达余晖效果 1.首先要画出静态的坐标轴,用双缓冲方法在onpain消息中绘制.绘制方法都比较简单.声明一个内存DC,绘制一个圆形,再把坐标轴画上去. void CDlg_Rad ...

  2. win32框架,GDI图形编程写一个HelloWorld游戏_c语言

    1.如图,实现功能: Hello World!字符串跟随鼠标移动 鼠标左击Hello World!颜色为红色 鼠标右击Hello World!颜色为蓝色 鼠标滚轮滚动改变Hello World!颜色的 ...

  3. MFC GDI+ 绘图

    MFC GDI+ 绘图 -------------------------- void CGDIplusTestView::OnDraw(CDC* /*pDC*/) { CGDIplusTestDoc ...

  4. C#学习笔记:GDI图形高级编程(1)——如何将图形画到控件上

    之前学习OpenGL是用C语言写的程序,开发个界面,既繁琐又不美观,还一大堆BUG.现在学了C#,可以很轻易地进行界面开发,我就寻思着,怎么样把OpenGL搬到C#中.查了很多资料,得出了这样一个结论 ...

  5. .NET3.5 GDI+ 图形操作1

    前言: 本文章抄袭自本人刚刚买的<ASP.NET 3.5从入门到精通>这本书,此书介绍在 http://www.china-pub.com/44991  ,本文章95%与此书的内容完全一样 ...

  6. WPF中GDI+图形图像的绘制:(五)绘制图像——蒙板效果

    这里要实现的效果指的是对图片像素点区域进行颜色叠加,首先要做的是得到图片非透明部分的区域,效果如图: 实现步骤:1.在主窗体添加控制控件: <Label Grid.Row="4&quo ...

  7. 游戏编程入门(3):绘制基本 GDI 图形

    接上文 游戏编程入门(2):创建游戏引擎和使用该引擎制作小游戏 本篇内容包括: 使用Windows图形设备接口绘制图形的基础知识 设备环境是什么以及它为什么对GDI图形如此重要 如何在Windows中 ...

  8. WPF中GDI+图形图像的绘制:(一)绘制文本——动态设置字体、大小、颜色

    GDI+(Graphics Device Interface Plus图形设备接口加)是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息.GDI+不但在功能上比GDI 要强大很多 ...

  9. MFC GDI绘图基础

    一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Wind ...

最新文章

  1. Zabbix 3.2.6 通过Discovery批量监控Oracle表空间
  2. MIPS中的异常处理和系统调用【转】
  3. MySQL表最大能达到多少?
  4. spring零碎知识点(二)
  5. 高并发系统处理之——限流
  6. 二进制文件被拒_苹果商店上架,二进制文件被拒绝
  7. linux内核分析与移植,内核分析移植
  8. eclipse java工程目录_转载:Eclipse下的java工程目录
  9. 使用jquery当页面打开时,将修改样式的点击事件绑定到Dom
  10. 【iOS-Cocos2d游戏开发之七】添加/删除系统组件,并解决View设置透明会影响View中的其他组件的问题!...
  11. 微步在线安全事件分析:全球数亿主机被FireBall攻陷
  12. 爬取腾讯课堂的课程评论
  13. 深信服下一代防火墙(NGAF)学习笔记
  14. 如何申请一个微信订阅号
  15. 图像匹配—NCC算法,即归一化互相关匹配
  16. Python有参函数和无参函数实例
  17. eplan长时间不用打开后显示没有可激活合适的加密狗
  18. Java 数字转字符串并指定位数,位数不足,自动补零
  19. 计算机初学者的干货(写的非常好本人推荐)
  20. Win 7/Win 8/Win 10/Windows Server 下安装和使用OpenSSH客户端

热门文章

  1. 闺蜜带对象一起在群里群名_吉珠人最新微信群名曝光!这都是什么魔鬼群聊,最后一个让我笑出哭声!...
  2. 华为机考攻略(python)--字符串操作【9题】(第六题leetcode1839所有元音按顺序排布的最长子字符串)
  3. 王者英雄胜率用计算机怎么算,王者荣耀英雄胜率怎么算
  4. AutoMod(项目技术线回忆)
  5. php单元格,PHP中的单元格怎么利用PhpSpreadsheet进行设置
  6. 618战报的谜面,与荣耀解码的谜底
  7. python+vue2+nodejs 搜索引擎课设 SCAU数信学院本科生通知检索(附代码)
  8. 数学集合:N Z Q R C
  9. Spring idea中spring配置文件自动检查配置应用程序上下文的操作
  10. ZEBRA打印机打印图片的实现