VC MFC 编程实例11.pdf
《VC MFC 编程实例11.pdf》由会员分享,可在线阅读,更多相关《VC MFC 编程实例11.pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 本文由s d h e x u 贡献 p d f 1。下载 下载 第11章 绘 图 位图和图标允许给应用程序添加色彩和风格.因为所有的 Wi n d o w s 界面在本质上都是相 同的,实际上,商标和启动窗口是用来区别不同应用程序外观的唯一方法.显然,绘图对于 创建自己的控件,以及在 C A D应用程序中显示图形也是重要的.可以用本章中的例子给他们 的应用程序增添一些独特的风格.例53 绘制图形 讨论一些MFC绘图工具.例54 绘制文本 讨论怎样绘制文本.例55 从任意位置装入一个图标并绘制 例57 从文件中创建一个位图 讨论从磁盘装入一个图标的方法.讨论从磁盘装入一个位图的方法.例56 从
2、任意位置装入一个位图和绘制一个位图 板以及根据需要替换位图颜色的能力.例58 创建一个自绘位图 用我们可得的MFC绘图工具在内存中创建一个位图.采用位图装入过程控制位图,以包括创建一个位图调色 11.1 例53 绘制图形 目标 绘制一个如图11-1中看到的图形.图11-1 用MFC可以绘制这些图形 策略 应用MFC的CDC类的不同绘图工具.步骤 在Wi n d o w s 应用程序中绘图用一个设备环境完成,该设备环境定义用户在哪里绘图,用 什么工具绘图以及采用什么绘图模式;设备环境取消了重复的参数调用,因而有助于简化 Wi n d o w s 绘图工具.参见第 4章有关该主题的详细内容.下载
3、1.创建一个设备环境 第11章 绘 图 199 1)如果处理一个 WM_PAINT消息或其他类似的消息,则可以提供一个设备环境,如果没 有提供,则必须自己创建一个;如果要绘制一个屏幕,可以用下面的代码创建一个设备环境,这里的p Wn d 是CWn d 类的实例的指针.该类的实例应该拥有需要绘制的窗口.CDC*p DC=p Wn d-Ge t DC();2)如果创建一个自己的设备环境,用完后必须销毁它;否则,会发生另一种内存泄漏,称为资源泄漏.销毁一个设备环境,用:p Wn d-Re l e a s e DC(p DC);注意 调用这些函数的类应控制需要绘制的窗口;如果没有这样的窗口类实例存在,
4、可 以使用Af x Ge t Ma i n Wn d()-Ge t DC()或:Ge t DC(NULL),它将返回一个用桌面窗口特征 初始化的设备环境.后面的函数返回一个设备环境句柄,在此处使用该返回的设备环 境句柄,必须把它封装到CDC类的实例中.设备环境具有一些预定义的绘图特征,其中之一是绘制线条的宽度和颜色,这一特征实 际上包含在该设备环境指向的对象中.该对象叫做画笔(P e n ),它默认为绘制一个像素宽的黑 色线条;如果需要别的特征,则需要创建自己的画笔对象.2.创建一个画笔 1)根据画线所需的特征创建 CPe n 类的一个实例.CPe n p e n(PS_SOLID,/s o
5、l i d l i n e a l s o /PS_DASH,PS_DOT,PS_DASHDOT,/PS_DASHDOTDOT,PS_INSIDEFRAME a n d /PS_NULL/w i d t h i n p i x e l s /c o l or 2,RGB(128,128,128);2)让设备环境指向该新画笔对象,但还要保存一个旧画笔的指针,以便以后能恢复它.Cp e n *p Pe n=p DC-Se l e c t Ob j e c t(&p e n);/s a v e o l d p e n 另一个在设备环境中预定义的特征是填充色(用来绘制封闭图形内部的颜色),它p a g
6、 e 1与一个绘 制封闭图形的函数一起使用;默认的颜色是白色,但通过告知设备环境使用一个新的画刷对 象,可以改变填充颜色.3.创建一个画刷 1)用需要的颜色创建 CBr us h 类的一个实例.CBr u s h(RGB(128,128,128);/c l o l o r 2)让设备环境指向该新画刷对象,但还要保存旧对象的指针,以便以后能恢复它.CBr u s h *p Br u s h=p DC-Se l e c t Ob j e c t(&b r u s h);/s a v e o l d b r u s h 注意 上面两步代表了创建CPe n 和CBr u s h 类实例的最基本的方法,
7、有关其他方法参见 第4章和MFC文档.4.用CDC类成员函数绘制图形 1)用该设备环境画一条直线,用:p DC-Mo v e To(5,5);p DC-Li n e To(25,25);200 第二部分 用户界面实例 下载 一条线的起始和结束坐标分成两个函数调用,以便绘制多条相邻的线条时,具有最小量 的参数进出栈.这里的数字,以及本例中的其余数字,都用逻辑单位;当绘制屏幕时,逻辑 单位等于屏幕像素.注意 本例和本章中的其他例子使用实例调用参数;当然,也可以使用自己的函数.2)绘制一个矩形,用:p DC-Re c t a n g l e(CRe c t(5,55,50,85);3)绘制弧,用:p
8、 DC-Ar c(CRe c t(5,115,50,145),CPo i n t(5,115),CPo i n t(50,115);/a r e a e n c o m p a s s i n g t h e a r c /s t a r t i n g p o i n t o f t h e a r c /e n d p o i n t 4)绘制圆角矩形,用:p DC-Ro u n d Re c t(CRe c t(5,185,50,215),CPo i n t(15,15);/d i s t a n c e f r o m c o r n e r t o d r a w a r c 5)绘
9、制椭圆或圆,用:p DC-El l i p s e(CRe c t(250,5,305,25);6)绘制饼图,用:p DC-Pi e(CRe c t(250,55,305,85),CPo i n t(250,55),CPo i n t(305,55);/a re a e n c o m p a s s i n g c h a r t /s t a r t i n g p o i n t /e n d p o i n t 7)绘制一个外观与控件,弹出式和重叠窗口等同的窗口框架,用:p DC-Dr a w Ed g e(CRe c t(250,115,305,145),EDGE_BUMP,/a l
10、 s o EDGE_ETCHED,EDGE_RAISED,EDGE_SUNKEN BF_RECT);/a l s o BF_LEFT,BF_BOTTOM,BF_RIGHT,BF_TOP 8)绘制一系列相临的线,用:POINT p t 8;p t 0.x=495;p t 0.y=5;p t 1.x=510;p t 1.y=10;p t 2.x=515;p t 2.y=12;p t 3.x=495;p t 3.y=15;p t 4.x=550;p t 4.y=25;p DC-Po l y l i n e(p t,5);9)绘制一个具有多条相临边的封闭图形,用:p t 0.x=495;p t 0.y
11、=55;p t 1.x=550;p t 1.y=55;p t 2.x=530;p t 2.y=65;p t 3.x=550;p t 3.y=85;下载 p t 4.x=520;p t 4.y=70;p t 5.x=495;p t 5.y=85;p t 6.x=510;p t 6.y=65;p t 7.x=495;p t 7.y=55;p DC-Po l y g o n(p t,8);第11章 绘 图 201 说明 一个设备环境只是一段内存,初始化计划进行绘制的设备的所有特征.使用一个设备 环境可以提高性能,因为不用传输 1 0或1 5个参数到 C D C:L i n e To(),p a g
12、e 2而只需传输两个.线条的起始位置,颜色,厚度,绘制的合法位置,绘制的设备类型已经在环境中定义.有4种类型的设备环境,除了屏幕环境以外,还有一个内存设备环境,一个打印机设备 环境和一个信息的设备环境.信息设备环境比其他三种类型更简洁,并只用来获取一 个设备的信息而不是用来绘图.在本章的后面部分将使用一个内存设备环境,在内存 中创建一个位图图像.一个打印机设备环境用来满足需要,虽然,它可能在创建的时 候与你期望的需要不同.绘制图形远不止本例所介绍的内容,参见第 4章和MFC文档,以获取更详细的内容.CD说明 在C D上执行该工程时,可以看到视图充满了一些可以用 M F C和Wi n d o w
13、s API绘制的基本 图形.11.2 例54 绘制文本 目标 在视图中绘制文本(见图11-2).策略 图11-2 绘制文本的两个例子 用CDC类的CDC:Te x t Ou t()和CDC:Dr a w Te x t()成员函数绘制文本,有关其他文本绘制函 数参见11.2.4节说明部分.步骤 如果不存在设备环境,则用前面例子中介绍的技术创建一个.一种常见的方法如下:CDC*p DC=p Wn d-Ge t DC();/w h e r e p Wn d i s a p o i n t e r t o a n /MFC w i n d ow c l a s s 1.使用Te x t Ou t()1
14、)绘制一个文本串,用:202 第二部分 用户界面实例 下载 CSt r i n g s t r(Th i s i s d r a w n t e x t);p DC-Te x t Ou t(x,y,/d e v i c e l o c a ti o n (e x:s c r e e n p i x e l s)s t r,/t e x t a s e i t h e r a s t r i n g p o i n t e r o r /a CSt r i n g v a r i a b l e s t r.g e t Le n g t h();/t e x t l e n g t h x 和y
15、 变量定义文本位置的左上角,如果要 x 和y 指示别的位置,如文本的中心位置,可以 用CDC:Se t Te x t Al i g n()改变x 和y 的含义.2)使x 和y 代表文本中央位置,在调用 Te x t Ou t()之前调用下面的函数:p DC-Se t Te x t Al i g n(TA_CENTER);/(a l s o TA_RIGHT)也可以用下面的函数,改变 y 对齐方式:p DC-Se t Te x t Al i g n(TA_BOTTOM);/(a l s o TA_BASELINE)3)用不同的标准字形绘制文本,在绘制前使用下面的函数调用(参见MFC文档有关其他库
16、 存字体):p DC-Se l e c t St o c k Ob j e c t(ANSI_VAR_FONT);4)创建绘制文本的字体,可以用:CFo n t f o n t;f o n t.Cr e a t e Fo n t(-22,/p o i n t s i z e 0,0,0,FW_NORMAL,/w e i g h t,a l s o FW_BOLD 0,/i f 1=i t a l i c 0,/i f 1=u n d e r l i n e 0,/i f 1=st r i k e t h r o u g h 0,0,0,0,0,Co u r i e r);/t y p e f
17、a c e CFo n t *p Fo n t =(CFo n t*)p DC-Se l e c t Ob j e c t(&f o n t);或者,如果只想选取一种基于点数和字形的字体,用 Cr e a t e Po i n t Fo n t().Cr e at e Fo n t()不是真正地创建一种字体,相反它扫描系统当前安装的字体,寻找一种与用 户调用参数中指定的标准最匹配的字体,并使用这种字体.5)改变窗口的默认字体,可以用:p w n d-Se t Fo n t(p Fo n t);/t h e f o n t 默认字体被自动地选进从那个窗口创建的任一设备环境中.6)改变文本的颜色,
18、用:p DC-Se t Te x t Co l o r(RGB(100,100,100);7)改变文本的背景色,用:p DC-Se t Bk Co l o r(RGB(200,200,200);除非背景模式设为不透明,否则背景色被忽略.不透明意味着在绘制文本前,先绘p a g e 3制背 景矩形;透明模式意味着文本被绘制在当前背景之上.8)打开不透明背景模式,用:p DC-Se t Bk Mo d e(OPAQUE);9)打开透明背景模式,用:p DC-Se t Bk Mo d e(TRANSPARENT);下载 第11章 绘 图 203 C D C:Te x t Ou t()是 最 简 单
19、的 绘 图 函 数,如 果 希 望 系 统 做 其 他 工 作,可 以 用 C D C:D r a w Te x t().D r a w Te x t()允许在一个指定的矩形区域内绘制多行文本,也允许在该矩 形内指定文本对齐方式.2.使用Dr aw Te x t()用Dr a w Te x t()绘制文本,用:p DC-Dr a w Te x t(s t r,r e c t,DT_CENTER);/a CSt r i n g v a l u e /a b o u n d i ng r e c t a n g l e /a n a l i g n m e n t s t y l e-t e x
20、t w i l l b e c e n t e r e d 说明 其他文本绘制函数包括:E x t Te x t Ou t(),该函数裁剪给定矩形外的绘制文本.Ta b b e d Te x t Ou t(),使用用户提供给该函数的跳格键位置表,扩大插入文本中的跳格距),用来绘制无效文本,该文本看起来被蚀刻一样.离.Dr a w St a t e(CD说明 在CD上执行该工程时,可以看到视图中有两行绘制文本.11.3 例55 从任意位置装入一个图标并绘制 目标 从资源文件或直接从一个图标文件中装入一个图标,在应用程序中绘制.策略 用三种不同的方法装入一个图标.第一种方法,使用一个称为 Lo a
21、 d Ic o n()的应用程序类 的成员函数,它从应用程序的资源中装入一个图标;第二种方法,用 Lo a d Im a g e()直接从一个磁盘文件中装入一个图标;第三种方法,用 Ex t r a c t Ic o n()从另一个应用程序的可执行文件中抽出一个图标.步骤 1.从应用程序的资源中装入一个图标 装入一个在应用程序资源中定义的图标,用:HICON h i c o n;h i c o n=Af x Ge t Ap p()-Lo a d Ic o n(IDR_MAINFRAME);Wi n d o w API 函数 Wi n d o w s API 函数 2.直接从一个.i c o 磁
22、盘文件中装入一个图标 从一个.i c o 文件装入一个图标,使用下面的方法.本例从 Wz d.i c o 装入一个图标.h i c o n =(HICON)Lo a d Im a g e(NULL,/h a n d l e o f t h e i n s t a n c e t h a t c o n t a in s 204 第二部分 用户界面实例 下载 Wz d.i c o,IMAGE_ICON,/t h e i m a g e /n a m e o r i d e n t i f i e r o f i m a g e /t y p e o f i m a g e/c a n a ls
23、o b e IMAGE_CURSOR o r IMAGE_ICON 0,0,/d e s i r e d w i d t h a n d h e i g h t LR_LOADFROMFILE);/l o a d f l a g s 3.从一个DLL或.e x e 文件中装入一个图标 从另一个应用程序的可执行文件中抽取一个图标,可以用下面的方法.本例中抽取在 Wz d.e x e 中发现的第二个图标.HINSTANCE h i n s t=Af x Ge t In s t a n c e Ha n d l e();h i c o n=Ex t r a c t Ic o n(h i n s t,
24、De b ug w z d.e x e,1);要确定一个可执行文件或 D L L文件有多少个图标,用 a -1索引调用 Ex t r a c tIc o n(),图标数 量返回到h Ic o n 中.4.绘制一个图标 用下面的方法可以把一个图标绘制到任何窗口.这里的(0,0)是图标的左上角坐标.p DC-Dr a w Ic o n(0,0,h i c o n);5.销毁一个图标 必须手工销毁任何一个装入的或者用 Lo a d Im a g e()装入或Exp a g e 4t r a c t Ic o n()抽取的图标,以避 免资源内存泄漏.De s t r o y Ic o n(h i c
25、o n);说明 在应用程序终止前,用 Lo a d Ic o n()装入的图标实际上一直保留着,以后装入同样的图 标资源,只要返回当前驻留的图标对象的句柄.CD说明 在CD上执行该工程时,可以看到一个图标被绘制在视图中.11.4 例56 从任意位置装入一个位图和绘制一个位图 目标 从资源文件或任意位图文件中装入一个位图.策略 首先,用 C B i t m a p 类装入一个在应用程序资源中定义的位图;然后,用 Wi n d o w s API函数 Lo a d Im a g e()从一个.b m p 文件中装入一个位图.步骤 1.添加位图到应用程序的资源中 有两种把位图装入到工程中的方法.第一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC MFC 编程实例11 编程 实例 11
限制150内