

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、vc内部培训资料第9章 修改框架程序的显示效果 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: 第9章 修改框架程序的显示效果 本章将叙述如何修改mfc appwizard自动生成的应用程序的外观,在学习本章内容之前,读者有必要回头复习一下其次章中讲过的创建一个窗口的过程。 9.1修改windows应用程序外观样式 我们可以通过不同的方法来修改应用程序的背景、标题、光标、图标以及框架是否具有最大、最小对话框等信息。我们知道由于视图类掩盖在框架窗口上,因此,我们通常在mainframe中修改图标、标题及是否具有最大、最小框的属性;而背景及光标等信息就需要在
2、view类中修改。 9.1.1 在框架类中修改程序外观 本节内容所讲的实例都包含在光盘例子代码ex09_00中。新建一个mfc序,工程名为ex09_00或用户自定义。 1. 在cmainframe:precreatewindow中修改。 在窗口产生之前,会调用它的成员函数precreatewindow于一栋大楼修建之前,在它的设计图纸上修改它的式样,修改方法有以下几种: 直接修改createstruct结构,代码如下: if( !cframewnd:precreatewindow(cs) ) return false; / the createstruct cs 去掉窗口的最大化按钮 允许添加
3、自己的标题 cs.lpszname=visual c+教学; return true; 其中style是结构createstruct的数据成员,分别表示框架窗口的样式和style的 visual c+教学,结果如图9-00所示。 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: 图9-00 去掉了最大化按钮及添加新标题 重新设计、填写wndclass,代码如清单9-00所示: 清单9-00 cmainframe:precreatewindow函数代码 1 bool cmainframe:precreatewindow(createstruct cs) 2
4、3 4 5 6 7 8 if( !cframewnd:precreatewindow(cs) ) return false; / the createstruct cs wndclass wndclass; wndclass.style=cs_hredraw; wndclass.hicon=loadicon(:afxgetinstancehandle(), wndclass.lpszmenuname=null; wndclass.lpszclassname=hello; registerclass(wndclass); cs.lpszclass=hello; return true; 9 10
5、 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 第722行代码定义了一个新的窗体类wndclass并设计该类;, 第1619行部分代码中自定义了一个logbrush结构类型的画刷lgbr,其中lbstyle、 lbcolor和lbhatch是该结构体的三个数据成员,分别表示所定义的画刷的样式等属性,设 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: 置该画刷的属性为实心的黄色,新设计的窗口类的背景就采纳这个画刷。 其中idi_icon1是我们在资源面板中新添加的一个图标资源的id。 代码中的大部分内容在其次章都
6、接触过,可能最终一句cs.lpszclass=hello;有的读者也许不理解该句代码的用意。我们知道,在cmainframe:precreatewindow中,应用程序依据该函数传来的cs进行框架的显示,这个cs结构中的数据成员lpszclass包含框架生成 时采纳的窗口类的名称,假如我们不添加最终一句代码将我们的窗口类赋给lpszclass数据成员,那么它还会采纳原来系统默认的窗口类。 运行程序,读者会发觉,框架的图标变了,但是背景和光标没有变,如图9-01那是由于视图类掩盖在框架类上了,应将此段代码拷入函数中,就可以看到效果了。 图9-01 1 2 3 4 5 6 7 8 9 12 13
7、14 利用getclassinfo函数,所示: 清单函数代码 if( !cframewnd:precreatewindow(cs) ) wndclass.lpszclassname=hello; :registerclass(wndclass); cs.lpszclass=hello; return true; 10 15 第7行首先定义一个窗口类对象wndclass,然后在第8行调用getclassinfo函数将取得的当前使用的窗口类信息赋给对象wndclass,最终,通过911行修改wndclass,再由12、13行代码重新注册及加载修改后的窗口对象来实现,程序运行结果同图9-01一样。
8、函数getclassinfo用于取得某一窗口类的信息,原形如下: 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: bool getclassinfo( hinstance hinstance, lpctstr lpclassname, lpwndclass lpwndclass); 第一个参数hinstance,表示创建窗口类的当前运行的应用程序实例。 其次个参数lpclassname,要猎取的窗口类的类名。 第三个参数lpwndclass,指向wndclass结构类型的对象,函数调用后猎取的窗口类的信息存放到该参数中。 2. 在cmainframe:
9、oncreate中修改。 利用setwindowlong函数,如下: int cmainframe:oncreate(lpcreatestruct lpcreatestruct) setwindowlong(m_hwnd,gwl_style, return 0; 其中, getwindowlong函数用于取得指定窗口的信息,long getwindowlong( hwnd hwnd, int nindex); 第一个参数hwnd,表示要猎取信息的窗口句柄,. 其次个参数nindex,要猎取的信息索引, gwl_exstyle 猎取窗口的扩展风格 gwl_style 猎取窗口的样式 gwl_wn
10、dproc 猎取窗口过程的回调函数 函数setwindowlong,该函数原形如下: long setwindowlong( hwnd hwnd, long dwnewlong); 第一个参数hwnd,或窗口类所在的窗口. 其次个参数nindex,此参数可取下列值: gwl_exstyle gwl_style 设置新的窗口样式 gwl_id 安排一个新的窗口标识 第三个参数 getwindowlong猎取当前窗口的信息,然后去掉最大化,给窗口设置新的属性。 函数,如下: setclasslong(m_hwnd,gcl_hicon, (long)afxgetapp()-loadicon(idi_
11、icon1); return 0; 其中,函数setclasslong用于重置当前窗口所包含的窗口类的wndclass结构中的指定数据成员的属性,函数原形如下: dword setclasslong( hwnd hwnd, int nindex, long dwnewlong); 第一个参数hwnd,表示要设置新属性的窗口句柄,或窗口类所在的窗口. 其次个参数nindex,要设置的属性的索引,此参数可取下列值: 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: gcl_hbrbackground gcl_hcursor 设置新的背景画刷 设置新的光标 gc
12、l_hicon 设置新的图标 gcl_style 设置新的窗口样式 第三个参数dwnewlong,表示要设置的新的属性值。 9.1.2 在视图类中修改程序外观 1. 在ex09_00view:precreatewindow中修改 重新设计、填写wndclass,代码如下: bool cex09_00view:precreatewindow(createstruct cs) / the createstruct cs /定义并设计新的窗口类wndclass wndclass wndclass; wndclass.style=cs_hredraw; wndclass.cbclsextra=0; w
13、ndclass.cbwndextra=0; / logbrush lgbr; lgbr.lbcolor=rgb(255,255,0); / return cview:precreatewindow(cs); 该段代码放在框架窗口类中时,光标及背景并没有转变,将代码移到视图类中,就会看到如图9-02所示的效果。 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: 图9-02 修改了显示的光标及背景 利用afxregisterwndclass函数,代码如下: bool cex09_00view:precreatewindow(createstruct cs) 运
14、行程序结果如图9-03所示。 return cview:precreatewindow(cs); 图9-03 修改成十字光标和黑色背景 2. 在中修改。 函数,如下: if (cview:oncreate(lpcreatestruct) = -1) return -1; / todo: add your specialized creation code here setclasslong(m_hwnd,gcl_hcursor, (long)loadcursor(null,idc_uparrow); return 0; 运行结果如图9-04所示。 修改框架程序的显示效果 vc+培训教程草稿(2
15、000年撰写) 张孝祥、袁龙友著 网址: 图9-04 改回正常的光标 9.2 制作动画图标 本 实例将使应用程序框架上的图标不断的变化,用到的图标是事先拷贝到文件夹ex09_01res下面的,ex09_01,详细操作步骤如下: 步骤1:新建一个mfc或用户自定义。 步骤2:在资源面板中导入五个图标。 五个图标的名称分别为face01.ico、face03.ico、face04.ico、face05.ico (包含在ex09_01res文件夹下)resource view页面,右击icon文件夹,在弹出的快捷方式菜单中选择弹出如图9-05所示的import resource导入资源对话框,打开e
16、x09_01res 五个图标的id均采纳默认的、idi_icon2、idi_icon3、idi_icon4、idi_icon5。 步骤3: 在框架窗口类中添加成员变量m_hicon5。 我们知道,因此,在cmainframe类中添加hicon类型的成员变量,用来加载并保存图标资源。 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: 图9-05 导入图标资源 步骤4:在框架窗口类的oncreate /加载图标资源 /转变框架的图标 setclasslong(m_hwnd,gcl_hicon,(long)m_hicon0); 然而三种方法的原理是相同的,然后调
17、用函数将框架的图标替换成第一个我们自己加载的图标,最终,设置计时 :在cmainframe类中添加ontimer函数,代码如下: / todo: add your message handler code here and/or call default static int iindex=0; iindex=+iindex%5; setclasslong(m_hwnd,gcl_hicon,(long)m_hiconiindex); cframewnd:ontimer(nidevent); 其中,定义了一个静态整型变量iindex,用来标识图标数组变量的下标,静态变量在 修改框架程序的显示效果
18、 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: 函数执行完毕时,内存空间不释放,并且变量的值仍旧保留。其次句代码iindex=+iindex%5;的作用是将iindex掌握在0到4范围内,由于m_hicon数组变量的下标为0到4。最终调用函数setclasslong,在计时器触发时转变图标的显示。 9.3 将图片作为窗体背景 上一节中,我们介绍了如何修改mfc appwizard生成的应用程序框架,包括窗口背景等属性,但是,上一节中修改后的窗口背景最对也只是转变了颜色,本节将向读者介绍如何将一幅图片作为窗口显示的背景。 通常状况下,将一幅位图选做窗口背景都经过以下几个步骤:
19、1. 创建一个兼容设备描述表 2. 创建及装入位图资源 3. 将位图选入兼容设备描述表 4. 将兼容设备描述表上的内容拷贝到当前设备描述表上 读者也许不能够很好的理解以上所说的几个步骤,不要紧,解释以上几个步骤,完整例程请参见光盘中例子代码ex09_02, 步骤1:新建一个mfc单文档应用程序,工程名为 步骤2:在资源面板中添加一幅位图资源。 图9-06 插入资源对话框 res文件夹里,命名为bitmap.bmp,然后打开工作台的resource view页面,选择菜单insert|resource,弹出如图9-06所示插入资源insert resource对话框,在该对话框上选中bitmap
20、,然后单击对话框右边的import按钮。 单击import按钮后,弹出如图9-07所示的导入资源对话框,打开ex09_02res文件夹,选中该文件夹下的bitmap.bmp文件,单击import按钮将该位图导入到工程中。 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: 图9-07 导入bitmap.bmp 将位图导入到工程中时,会弹出如图9-08正确的导入到工程中了,但是由于位图的颜色大于256visual c+的位图编辑器中,并且不能编辑该位图,由于我们并不想修改这个位图就应当至少是256位颜色以下的位图。 图9-08 消息提示框 id号idb_bit
21、map1。 步骤3:在函数中贴图。 1. dc: cdc类的成员函数createcompatibledc用于创建兼容某一设备描述表的一个dc,函数原形如下: bool createcompatibledc( cdc* pdc ); 该函数只有一个参数pdc,指向要兼容的设备描述表,假如该参数为null,那么创建的兼容dc是兼容系统显示屏幕的。本例中兼容的dc就是cex09_02view:ondraw函数中由系统传来的pdc。 2. 创建及装入位图资源: cbitmap bmp; bmp.loadbitmap(idb_bitmap1); 代码中首先创建一个cbitmap类的对象bmp,然后调用c
22、bitmap类的成员函数 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: loadbitmap,将位图资源载入对象bmp中。 3. 将位图选入兼容dc 4. dccompatible.selectobject(bmp); 将兼容dc上的内容拷入当前dc上 crect rect; getclientrect(rect); pdc-bitblt(0,0,rect.width(),rect.height(),dccompatible, 函数getclientrect用于猎取客户区的矩形大小,该函数只有一个参数为类或rect 函数bitblt,用于将源dc上的位
23、图拷贝到目的dc,函数原形如下: bool bitblt( int x, int y, int nwidth, int nheight, cdc* psrcdc, int ysrc, dword dwrop ); 第一个参数x,表示目的dc的左上角的x坐标。 其次个参数y,表示目的dc的左上角的y坐标。 第三个参数nwidth,表示目的dc或源位图的宽度。 第四个参数nheight,表示目的dc第五个参数psrcdc,指向包含位图的源dc。 第六、七个参数xsrc、ysrcy坐标。 第八个参数dwrop,表示贴图的模式,值,表示直接将源位图拷贝到目的dc中。 图9-09 使用bitblt函数将
24、位图作为背景 编译运行该程序,结果如图9-09所示。可以看出bitblt函数是按1:1的比例将位图 拷入到dc中的,当视图窗口最大化时可以看到整个位图,当视图窗口尺寸变小时,就只能 修改框架程序的显示效果 vc+培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址: 看到位图的一部分,假如想在视图窗口上显示整个位图而不管视图窗口多大时,可以用stretchblt函数。 步骤4:修改cex09_02view:ondraw函数代码,将位图拉伸显示,代码如下: void cex09_02view:ondraw(cdc* pdc) cex09_02doc* pdoc = getdocument();
25、 assert_valid(pdoc); / todo: add draw code for native data here /产生一个兼容dc cdc dccompatible; dccompatible.createcompatibledc(pdc); /创建及装入位图资源 cbitmap bmp; bmp.loadbitmap(idb_bitmap1); /将位图选入兼容dc dccompatible.selectobject(bmp); /将兼容dc上的内容拷入当前dc上 crect rect; getclientrect(rect); /猎取位图信息 bitmap bitmap; bmp.getbitmap(bitmap); 可以看出,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南省怀化三中2025届物理高一下期末学业水平测试试题含解析
- 2025届黑龙江省牡丹江市五县市物理高一第二学期期末综合测试模拟试题含解析
- 2025届陕西延安市实验中学大学区校际联盟高一物理第二学期期末复习检测模拟试题含解析
- 辽宁省阜新市海州高级中学2025年物理高二下期末复习检测试题含解析
- 宠物饲养与管理课件
- 2025届海南省临高县新盈中学高二物理第二学期期末经典模拟试题含解析
- 二零二五年财务顾问与财务软件公司合作协议
- 二零二五年度自建房竣工验收与交付使用合同
- 二零二五年财税代理服务合同-税务信息化解决方案
- 二零二五年酒吧餐厅综合承包运营管理协议
- 环境工程原理第13章-均相化学反应器课件
- DB11T 854-2023 占道作业交通安全设施设置技术要求
- 保洁卫生间巡查表
- 污染源废水采样原始记录表
- GB/T 2900.53-2001电工术语风力发电机组
- GB/T 17626.17-2005电磁兼容试验和测量技术直流电源输入端口纹波抗扰度试验
- 飞行机器实验室 PX4FLOW智能光流传感器使用说明 V1.3
- 高速公路机电系统培训课件
- 电厂新员工安规考试
- 山东省济南市各县区乡镇行政村村庄村名居民村民委员会明细
- 连锁药店店面设计及要求
评论
0/150
提交评论