VC MFC 编程实例11.pdf

上传人:asd****56 文档编号:70344528 上传时间:2023-01-19 格式:PDF 页数:10 大小:22.13KB
返回 下载 相关 举报
VC MFC 编程实例11.pdf_第1页
第1页 / 共10页
VC MFC 编程实例11.pdf_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《VC MFC 编程实例11.pdf》由会员分享,可在线阅读,更多相关《VC MFC 编程实例11.pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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.添加位图到应用程序的资源中 有两种把位图装入到工程中的方法.第一

26、种,用 De v e l o p e r St u d i o 的位图编辑器创建一个 下载 位图.注意分配给位图的 ID.2.从应用程序的资源中装入位图 第11章 绘 图 205 位图;第二种,用 De v e l o p e r St u d i o 的In s e r t/In s e r t Re s o u r c e 菜单命令下的 I m p o r t 命令装入一个 要把位图装入应用程序中进行绘制,用下面的方法,可以用自己的位图 ID替代IDB_WZD.CBi t m a p b i t m a p;b i t m a p.Lo a d Bi t m a p(IDB_WZD);3.

27、从一个.b m p 文件中装入位图 在运行时用 Lo a d Im a g e()装入一个位图.CBi t m a p b i t m a p;HBITMAP h b i t m a p =(HBITMAP):Lo a d Im a g e(NULL,/h a n dl e o f t h e i n s t a n c e t h a t c o n t a i n s /t h e i m a g e Wz d 2.b m p,/n a m e o r i d e n ti f i e r o f i m a g e IMAGE_BITMAP,/t y p e o f i m a g e/

28、c a n a l s o b e IMAGE_CURSOR or 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 ro m f i l e /a t t a c h t h i s b i t m a p o b j e c t t o o u r b i t m a p c l a s s b i t m a p.At t a c h(h b it m a p);4.绘制一个位图 绘制一个位图可以用下面的方法,注意用 Bi t Bl t()需要两个设备环境,而不是一个

29、.CDC d c Co m p;d c Co m p.Cr e a t e Co m p a t i b l e DC(p DC);d c Co m p.Se l e c t Ob j e c t(&b i t m ap);/g e t s i z e o f b i t m a p f o r Bi t Bl t()BITMAP b m In f o;b i t m a p.Ge t Ob j e c t(s i ze o f(b m In f o),&b m In f o);/u s e Bi t Bl t()t o d r a w b i t m a p p DC-Bi t Bl t(0

30、,0,b m In fo.b m Wi d t h,b m In f o.b m He i g h t,&d c Co m p,0,0,SRCCOPY);说明 位图和图标间的主要的区别,在于可以用透明色创建一个图标.每次使用一个透明色的 图标时,绘制图标处的背景将显示出来.可以用Lo a d Im a g e()以及LR_LOADFROM-FILE 标志和LR_LOADTRANSPARENT标志的或操作假造这一效果,Lo a d Im a g e()用应 用程序背景色替换位图中的一种颜色(如按钮色);Lo a d Im a g e()根据位图左上角像素颜 色,选择要替换的颜色.一些早期版本的

31、Wi n d o w s NT不允许使用带 L R _ L O A D F R O M F I L E标志的Lo a d Im a g e().如果系统没有升级,可以用下个例子中的方法装入一个位图,在那个例子中不是使用 应用程序资源,而是使用 C F i l e 类直接从磁盘装入位图文件,然而要确保从文件的 1 2字 节文件头后开始读取文件.206 CD说明 第二部分 用户界面实例 下载 有关Bi t Bl t(p a g e 5 ),位图和设备环境的详细内容参见第 4章.在CD上执行该工程时,有两个位图绘制在视图中.11.5 例57 从文件中创建一个位图 目标 从一个.b m p 文件中装入

32、一个位图,并潜在地修改它.策略 从应用程序资源中,把一个原始位图文件装入内存中.创建一个位图,并调用 Wi n d o w s A P I的Cre a t e DIBi t m a p().然而,在位图传送到 Cr e a t e DIBi t m a p()之前,还可以修改该位图的 调色板,并把该功能封装到 CBi t m a p 派生类的成员函数中.步骤 1.创建一个新的位图类 用C l a s s Wi z a r d 从C B i t m a p 派生一个新类,用文本编辑器添加一个 Lo a d Bi t m a p Ex()成员函 数到该类中.2.从位图文件创建一个位图对象 1)在L

33、o a dBi t m a p Ex()开始处获取一个设备环境.为了避免在 Lo a d Bi t m a p Ex()的调用参数 中要求一个设备环境,将从桌面获取一个设备环境.CDC d c Sc r e e n;d c Sc r e e n.At t a c h(:Ge t DC(NULL);2)然后,从应用程序的资源中把位图装入内存中.HRSRC h Rs r c =Fi n d Re s o u r c e(Af x Ge t Re s o u r c e Ha n d l e(),MAKEINTRESOURCE(n ID),RT_BITMAP);HGLOBAL h g l b =Lo

34、 a d Re s o u r c e(Af x Ge t Re s o u r c e Ha n d l e(),h Rs r c);LPBITMAPINFOHEADER l p Bi t m a p =(LPBITMAPINFOHEADER)Lo c k Re s o u r c e(h g l b);现在,l p B i t m a p 变量指向堆中包含位图资源的一段内存.顺便提一下,这是把任何应用 程序资源装入内存的方法.不同的 RT_BITMAP代表计划装入的资源类型.现在,需要创建传递到 Cr e a t e DIBi t m a p()的位图数据的指针.3)创建三个传递到 Cr

35、e a t e DIBi t m a p()的位图结构的指针变量./g e t p o i n t e r s i n t o b i t m a p s t r u c t u r e s /(h e a d e r,c o l o r t a b l e a n d p ic t u r e b i t s)LPBITMAPINFO p Bi t m a p In f o =(LPBITMAPINFO)l p Bi t m a p;LPBITMAPINFOHEADER p Bi t m a p In f o He a d e r =(LPBITMAPINFOHEADER)l p Bi t

36、m a p;/d e t e r m i n e n u mb e r o f c o l o r s i n b i t m a p s p a l e t t e n o w b e c a u s e /b i t m a p p i x e l i s r i g h t a f te r i t 下载 第11章 绘 图 207 i n t n Nu m b e r Of Co l o r s=0;i f (l p Bi t m a p-b i Cl r Us e d)n Nu m b e r Of Co l o r s =l p Bi t m a p-b i Cl r Us e d;

37、e l s e i f (p Bi t m a p In f o He a d e r-b i Bi t Co u n t =8)n Nu m b e r Of Col o r s =(1b i Si z e+(n Nu m b e r Of Co l o r s*s i z e o f(RGBQUAD);注意 如果指定像素颜色的位数是24位,则位图文件没有颜色表,因为每个像素项本身 包含RGB颜色的全部定义.4)因为现在知道位图文件头以后的大小,可以保存它为以后使用,这些数值在创建一个 位图对象时是不需要的.m _Wi d t h =l p Bi t m a p-b i Wi d t h;m

38、 _He i g h t =l p Bi t m a p-b i He i g h t;但是,不能只传递一个位图颜色表的指针给 Cr e a t e DIBi t m a p().首先,必须用位图的颜色 表创建一个应用程序调色板;然后,把该应用程序调色板选到一个设备环境中,再把该设备 环境传递给 Cr e a t e DIBi t m a p().5)要创建一个应用程序调色板,把位图的颜色表填入一个逻辑调色板,然后用 CPa l e t t e 类 创建应用程序调色板./c r e a t e a l o g i c a l p a l e t t e f r o m t h e c o l

39、o r t a b l e i n t h i s b i t m a p i f (nNu m Of Co l o r s)LOGPALETTE*p Lo g Pa l =(LOGPALETTE*)n e w BYTE s i z e o f(LOGPALETTE)+(n Nu m b e r Of Co l o r s *s i z e o f(PALETTEENTRY);p Lo g Pa l-p a l Ve r s i o n =0 x 300;p Lo g Pa l-p a l Nu m En t r i e s =n Nu m b e r Of Co l o r s;f o r

40、(i n t i =0;i b m i Co l o r s i.r g b Re d=192&p Bi t m a p In f o-b m i Co l o r s i.r g b Gr e e n=192&p Bi t m a p In f o-b m i Co l o r s i.r g b Bl u e=192)p Bi t m a p In f o-b m i Co l o r s i.r g b Re d=Ge t RVa l u e(:Ge t Sy s Co l o r(COLOR_BTNFACE);p Bi t m a p In f o-b m i Co l o r s i

41、.r g b Gr e e n=Ge t GVa l u e(:Ge t Sy s Co l o r(COLOR_BTNFACE);p Bi t m a p In f o-b m i Co l o r s i.r g b Bl u e=Ge t BVa l u e(:Ge t Sy s Co l o rp a g e 6(COLOR_BTNFACE);p Lo g Pa l-p a l Pa l En t r y i.p e Re d =p Bi t m a p In f o-b m i Co l o r si.r g b Re d;p Lo g Pa l-p a l Pa l En t r

42、y i.p e Gr e e n =208 第二部分 用户界面实例 下载 p Bi t m a p In f o-b m i Co l o r s i.r g b Gr e e n;p Lo g Pa l-p a l Pa l En t r y i.p e Bl u e =p Bi t m a p In f o-b m i Co l o r s i.r g b Bl u e;p Lo g Pa l-p a l Pa l En t r y i.p e Fl a g s =0;m _p Pa l e t t e=n e w CPa l e t t e;m _p Pa l e t t e-Cr e

43、a t e Pa l e t t e(p Lo g Pa l);d e l e t e p Lo gPa l;d c Sc r e e n.Se l e c t Pa l e t t e(m _p Pa l e t t e,TRUE);d c Sc r e e n.Re a l i z e Pa l e t t e();当创建一个逻辑调色板时,还有机会修改位图中的颜色.特别指出,这里发现的任何灰 颜色,都可用按钮表面的颜色替换,因此当位图绘制在一个按钮表面背景色上时,位图看起 来是透明的.6)现在可以把 3个指向位图结构的指针与实现的调色板一起传递到:Cr e a t e DIBi t m a

44、 p()以 创建一个位图对象.HBITMAP b i t m a p =:Cr e a t e DIBi t m a p(d c Sc r e e n.m _h DC,p Bi t m a p In f o He a d e r,CBM_INIT,p Bi t m a p Pi c t u r e Da t a,p Bi t m a p In f o,DIB_RGB_COLORS);7)创建一个位图对象以后,可以把该位图对象捆绑到位图类对象.At t a c h(b i t m a p);8)有关该位图类的完备清单参见本节的清单 位图类.3.使用新的位图类 要绘制该位图,首先把它的调色板选到设

45、备环境中,然后用 Bi t Bl t()或St r e t c h Blt()把它绘 制到屏幕上./l o a d b i t m a p w i t h o u r n e w f u n c t i o n m _b i t m a p.Lo a d Bi t m a p Ex(IDB_WZD,TRUE);/s e l e c t o u r p a l e t t e i n t o t h e d e v i c e c o n t e x t CPa l e t t e *p Ol d Pa l =p DC-Se l e c t Pa l e t t e(m _b i t m a p

46、.Ge t Pa l e t t e(),FALSE);p DC-Re a l i z e Pa l e t t e();/g et d e v i c e c o n t e x t t o s e l e c t b i t m a p i n t o CDC d c Co m p;d c Co m p.Cr e a t e Co m p a t i b l eDC(p DC);d c Co m p.Se l e c t Ob j e c t(&m _b i t m a p);/d r a w b i t m a p p DC-Bi t Bl t(0,0,m _b i t m a p.m

47、_Wi d t h,m _b i t m a p.m _He i g h t,&d c Co m p,0,0,SRCCOPY);/r e s e l e c t o l d pa l e t t e p DC-Se l e c t Pa l e t t e(p Ol d Pa l,FALSE);说明 位图中的每个点只是指向颜色表的一个指针,一个位图有它自己的颜色表.然而,当 下载 第11章 绘 图 209 一个位图被绘制到屏幕上时,它必须与系统上的其他位图和其他颜色表进行竞争,这 可能导致每次只能显示有限数量的单色.在需要的时候,这些颜色表转换为调色板,并被选入系统调色板.:Cr e a t

48、e DIBi t m a p()把一个位图内的点指针指向该新调色板.有 关该主题的详细讨论参见第 4章.从磁盘而不是通过应用程序资源直接装入该文件时,确保文件指针跳过包含文件 头的 1 2 个字节,然后用 C F i l e 类把文件读到 C S h a r e M e m 文件中,该文件被传递到:Cr e a t e DIBi t m a p().CD说明 在C D上执行该工程时,可以看到视图被一个位图所填充,该位图使用在位图中定义的原 始颜色,显示出非扩散颜色.清单位图类#i f n d e f WZDBITMAP_H#d e f i n e WZDBITMAP_H c l a s s C

49、Wz d Bi t m a p :p u b l i c CBit m a p p u b l i c:DECLARE_DYNAMIC(CWz d Bi t m a p)/Co n s t r u c t o r s CWz d Bi t m a p();vo i d Lo a d Bi t m a p Ex(UINT n ID,BOOL b Ic o n Bk g r d);CPa l e t t e *Ge t Pa l e t t e()r e t u r n m _p Pa l e t t e;/Im p l e m e n t a t i o n p u b l i c:v i r

50、t u a l CWz d Bi t m a p();/At t r i b ut e s i n t m _Wi d t h;i n t m _He i g h t;/Op e r a t i o n s p r i v a t e:CPa l e t t e *m _p Pa l e t t e;#e n d i f /Wz d Bi t m a p.c p p :i m p l e m e n t a t i o n o f t h e CWz d Bi t m a p c l a s s /#i n c l u d e s t d a f x.h#i n c l u d e Wz d

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁