ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:612.51KB ,
资源ID:3525290      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3525290.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC内部培训资料第9章修改框架程序的显示效果.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VC内部培训资料第9章修改框架程序的显示效果.docx

1、VC内部培训资料第9章 修改框架程序的显示效果第9章 修改框架程序的显示效果本章将讲述如何修改MFC AppWizard自动生成的应用程序的外观,在学习本章内容之前,读者有必要回头复习一下第二章中讲过的创建一个窗口的过程。9.1修改Windows应用程序外观样式 我们可以通过不同的方法来修改应用程序的背景、标题、光标、图标以及框架是否具有最大、最小对话框等信息。我们知道由于视图类覆盖在框架窗口上,因此,我们通常在MainFrame中修改图标、标题及是否具有最大、最小框的属性;而背景及光标等信息就需要在View类中修改。9.1.1 在框架类中修改程序外观 本节内容所讲的实例都包含在光盘例子代码E

2、X09_00中。新建一个MFC单文档应用程序,工程名为EX09_00或用户自定义。 1. 在CMainFrame:PreCreateWindow中修改。在窗口产生之前,会调用它的成员函数PreCreateWindow,此时窗口还没有产生,相当于一栋大楼修建之前,在它的设计图纸上修改它的式样,然后按照修改后的图纸去修建大楼。修改方法有以下几种: 直接修改CREATESTRUCT结构,代码如下:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs) if( !CFrameWnd:PreCreateWindow(cs) ) return FALSE; /

3、TODO: Modify the Window class or styles here by modifying / the CREATESTRUCT cs cs.style&=WS_MAXIMIZEBOX; /去掉窗口的最大化按钮 cs.style&=FWS_ADDTOTITLE; /允许添加自己的标题 cs.lpszName=Visual C+教学; return TRUE;其中style和lpszName是结构CREATESTRUCT的数据成员,分别表示框架窗口的样式和标题。需要注意的是,要想将窗口框架显示标题改为我们的标题,必须要将style的FWS_ADDTOTITLE属性去掉。运

4、行程序,会发现窗口的最大化按钮不见了,并且标题再不是以前的那种很枯燥的“无标题”,而是换成了我们自己添加的Visual C+教学,结果如图9-00所示。图9-00 去掉了最大化按钮及添加新标题 重新设计、填写WNDCLASS,代码如清单9-00所示:清单9-00 CMainFrame:PreCreateWindow函数代码-1 BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)2 3 if( !CFrameWnd:PreCreateWindow(cs) )4 return FALSE;5 / TODO: Modify the Window cla

5、ss or styles here by modifying6 / the CREATESTRUCT cs7 WNDCLASS wndClass;8 wndClass.style=CS_HREDRAW;9 wndClass.lpfnWndProc=(WNDPROC):DefWindowProc;10 wndClass.cbClsExtra=0;11 wndClass.cbWndExtra=0; 12 wndClass.hInstance=:AfxGetInstanceHandle();13 wndClass.hIcon=LoadIcon(:AfxGetInstanceHandle(),14 M

6、AKEINTRESOURCE(IDI_ICON1); 15 wndClass.hCursor=LoadCursor(NULL,IDC_NO);16 LOGBRUSH lgbr;17 lgbr.lbStyle=BS_SOLID;18 lgbr.lbColor=RGB(255,255,0);19 lgbr.lbHatch=HS_CROSS;20 wndClass.hbrBackground=CreateBrushIndirect(&lgbr);21 wndClass.lpszMenuName=NULL; 22 wndClass.lpszClassName=hello;23 RegisterClas

7、s(&wndClass);24 cs.lpszClass=hello;25 return TRUE;26 第722行代码定义了一个新的窗体类wndClass并设计该类;,第1619行部分代码中自定义了一个LOGBRUSH结构类型的画刷lgbr,其中lbStyle、lbColor和lbHatch是该结构体的三个数据成员,分别表示所定义的画刷的样式等属性,设置该画刷的属性为实心的黄色,新设计的窗口类的背景就采用这个画刷。其中IDI_ICON1是我们在资源面板中新添加的一个图标资源的ID。代码中的大部分内容在第二章都接触过,可能最后一句cs.lpszClass=hello;有的读者大概不理解该句代码

8、的用意。我们知道,在CMainFrame:PreCreateWindow中,应用程序根据该函数传来的cs进行框架的显示,这个cs结构中的数据成员lpszClass包含框架生成时采用的窗口类的名称,如果我们不添加最后一句代码将我们的窗口类赋给lpszClass数据成员,那么它还会采用原来系统默认的窗口类。运行程序,读者会发现,框架的图标变了,但是背景和光标没有变,如图9-01所示,那是由于视图类覆盖在框架类上了,应将此段代码拷入CEX09_00View:PreCreateWindow函数中,就可以看到效果了。图9-01 修改了显示的图标 利用GetClassInfo函数,代码如清单9-01所示:

9、清单9-01 CMainFrame:PreCreateWindow函数代码1 BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)2 3 if( !CFrameWnd:PreCreateWindow(cs) )4 return FALSE;5 / TODO: Modify the Window class or styles here by modifying6 / the CREATESTRUCT cs7 WNDCLASS wndclass;8 :GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&

10、wndclass);9 wndclass.hIcon=:LoadIcon(:AfxGetInstanceHandle(),10 MAKEINTRESOURCE(IDI_ICON1);11 wndclass.lpszClassName=hello;12 :RegisterClass(&wndclass);13 cs.lpszClass=hello;14 return TRUE;15 第7行首先定义一个窗口类对象wndclass,然后在第8行调用GetClassInfo函数将取得的当前使用的窗口类信息赋给对象wndclass,最后,通过911行修改wndclass,再由12、13行代码重新注册及加

11、载修改后的窗口对象来实现,程序运行结果同图9-01一样。函数GetClassInfo用于取得某一窗口类的信息,原形如下:BOOL GetClassInfo( HINSTANCE hInstance, LPCTSTR lpClassName, LPWNDCLASS lpWndClass); 第一个参数hInstance,表示创建窗口类的当前运行的应用程序实例。第二个参数lpClassName,要获取的窗口类的类名。 第三个参数lpWndClass,指向WNDCLASS结构类型的对象,函数调用后获取的窗口类的信息存放到该参数中。2. 在CMainFrame: OnCreate中修改。 利用SetW

12、indowLong函数,如下:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) SetWindowLong(m_hWnd,GWL_STYLE, :GetWindowLong(m_hWnd,GWL_STYLE) & WS_MAXIMIZEBOX); return 0;其中, GetWindowLong函数用于取得指定窗口的信息,函数原形如下:LONG GetWindowLong( HWND hWnd, int nIndex);第一个参数hWnd,表示要获取信息的窗口句柄,或窗口类所在的窗口.第二个参数nIndex,要获取的信息索引,此参

13、数可取下列值: GWL_EXSTYLE 获取窗口的扩展风格 GWL_STYLE 获取窗口的样式 GWL_WNDPROC 获取窗口过程的回调函数函数SetWindowLong,用于改变指定窗口的属性风格,该函数原形如下:LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong);第一个参数hWnd,表示要设置新属性的窗口句柄,或窗口类所在的窗口.第二个参数nIndex,要设置的属性的索引,此参数可取下列值: GWL_EXSTYLE 设置新的窗口扩展风格 GWL_STYLE 设置新的窗口样式 GWL_ID 分配一个新的窗口标识第三个参数dw

14、NewLong,表示要设置的新的属性值。上段代码的实现过程是首先调用GetWindowLong获取当前窗口的信息,然后去掉最大化按钮,最后调用SetWindowLong,给窗口设置新的属性。 利用SetClassLong函数,如下:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) SetClassLong(m_hWnd,GCL_HICON, (long)AfxGetApp()-LoadIcon(IDI_ICON1);return 0;其中,函数SetClassLong用于重置当前窗口所包含的窗口类的WNDCLASS结构中的指定数据成员

15、的属性,函数原形如下:DWORD SetClassLong( HWND hWnd, int nIndex, LONG dwNewLong); 第一个参数hWnd,表示要设置新属性的窗口句柄,或窗口类所在的窗口.第二个参数nIndex,要设置的属性的索引,此参数可取下列值: GCL_HBRBACKGROUND 设置新的背景画刷 GCL_HCURSOR 设置新的光标 GCL_HICON 设置新的图标 GCL_STYLE 设置新的窗口样式 第三个参数dwNewLong,表示要设置的新的属性值。9.1.2 在视图类中修改程序外观1. 在EX09_00View:PreCreateWindow中修改 重新

16、设计、填写WNDCLASS,代码如下:BOOL CEX09_00View:PreCreateWindow(CREATESTRUCT& cs) / TODO: Modify the Window class or styles here by modifying / the CREATESTRUCT cs /定义并设计新的窗口类wndClassWNDCLASS wndClass; wndClass.style=CS_HREDRAW; wndClass.lpfnWndProc=(WNDPROC):DefWindowProc; wndClass.cbClsExtra=0; wndClass.cbWn

17、dExtra=0; wndClass.hInstance=:AfxGetInstanceHandle(); wndClass.hIcon=LoadIcon(:AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1); wndClass.hCursor=LoadCursor(NULL,IDC_NO); /定义新的画刷来修改窗体类的背景色 LOGBRUSH lgbr; lgbr.lbStyle=BS_SOLID; lgbr.lbColor=RGB(255,255,0); lgbr.lbHatch=HS_CROSS; wndClass.hbrBackgro

18、und=CreateBrushIndirect(&lgbr); wndClass.lpszMenuName=NULL; wndClass.lpszClassName=hello; /注册窗口类 RegisterClass(&wndClass); cs.lpszClass=hello; return CView:PreCreateWindow(cs);该段代码放在框架窗口类中时,光标及背景并没有改变,将代码移到视图类中,就会看到如图9-02所示的效果。图9-02 修改了显示的光标及背景 利用AfxRegisterWndClass函数,代码如下:BOOL CEX09_00View:PreCreat

19、eWindow(CREATESTRUCT& cs)cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0); return CView:PreCreateWindow(cs);运行程序结果如图9-03所示。图9-03 修改成十字光标和黑色背景2. 在CEX09_00View:OnCreate中修改。 利用SetClassLong函数,如下:int CEX09_00View:OnCreate(LPCREATEST

20、RUCT lpCreateStruct) 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所示。图9-04 改回正常的光标9.2 制作动画图标 本节将通过一个实例来讲述如何给自己的应用程序添加一组不断的动态显示的图标。本实例将使应用程序框架上的图标不断的变化,显示为一组

21、脸部表情,当然,用到的图标是事先拷贝到文件夹EX09_01res下面的,我们在本工程的资源面板中只要导入这些图标就可以了,不需要自己再动手画一些图标了。完整例程请参见光盘中例子代码EX09_01,具体操作步骤如下: 步骤1:新建一个MFC单文档应用程序,工程名为EX09_01或用户自定义。 步骤2:在资源面板中导入五个图标。五个图标的名称分别为FACE01.ICO、FACE02.ICO、FACE03.ICO、FACE04.ICO、FACE05.ICO(包含在EX09_01res文件夹下)。打开工作台的Resource View页面,右击Icon文件夹,在弹出的快捷方式菜单中选择Import菜单

22、项,弹出如图9-05所示的Import Resource导入资源对话框,打开EX09_01res文件夹,将该文件夹下的五个脸部图标一一导入到工程中。五个图标的ID均采用默认的IDI_ICON1、IDI_ICON2、IDI_ICON3、IDI_ICON4、IDI_ICON5。 步骤3: 在框架窗口类中添加成员变量m_hIcon5。我们知道,通常改变图标的操作是在框架窗口类中,因此,在CMainFrame类中添加HICON类型的成员变量m_hIcon5,用来加载并保存图标资源。图9-05 导入图标资源 步骤4:在框架窗口类的OnCreate函数中中加载图标并设置计时器,代码如下:int CMain

23、Frame:OnCreate(LPCREATESTRUCT lpCreateStruct) /加载图标资源 m_hIcon0=AfxGetApp()-LoadIcon(IDI_ICON1); m_hIcon1=AfxGetApp()-LoadIcon(IDI_ICON2); m_hIcon2=AfxGetApp()-LoadIcon(IDI_ICON3); m_hIcon3=LoadIcon(AfxGetApp()-m_hInstance,MAKEINTRESOURCE(IDI_ICON4); m_hIcon4=LoadIcon(AfxGetInstanceHandle(),MAKEINTRE

24、SOURCE(IDI_ICON5); /改变框架的图标 SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon0); SetTimer(1,500,NULL); return 0;上段代码中,在加载五个图标时采用了三种方法,然而三种方法的原理是相同的,然后调用SetClassLong函数将框架的图标替换成第一个我们自己加载的图标,最后,设置计时器。那么接下来的工作就是在计时器事件中使图标不断的变化。 步骤5:在CMainFrame类中添加OnTimer函数,代码如下:void CMainFrame:OnTimer(UINT nIDEvent) / TODO: A

25、dd 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,用来标识图标数组变量的下标,静态变量在函数执行完毕时,内存空间不释放,并且变量的值仍然保留。第二句代码iIndex=+iIndex%5;的作用是将iIndex控制在0到4范围内,因为m_hIcon数组变量的下标为

26、0到4。最后调用函数SetClassLong,在计时器触发时改变图标的显示。9.3 将图片作为窗体背景 上一节中,我们介绍了如何修改MFC AppWizard生成的应用程序框架,包括窗口背景等属性,但是,上一节中修改后的窗口背景最对也只是改变了颜色,本节将向读者介绍如何将一幅图片作为窗口显示的背景。 通常情况下,将一幅位图选做窗口背景都经过以下几个步骤:1. 创建一个兼容设备描述表2. 创建及装入位图资源3. 将位图选入兼容设备描述表4. 将兼容设备描述表上的内容拷贝到当前设备描述表上读者大概不能够很好的理解以上所说的几个步骤,不要紧,下面我们将通过一个实例来解释以上几个步骤,完整例程请参见光

27、盘中例子代码EX09_02,具体操作步骤如下: 步骤1:新建一个MFC单文档应用程序,工程名为EX09_02或用户自定义。 步骤2:在资源面板中添加一幅位图资源。图9-06 插入资源对话框可以找一幅自己喜欢的比较漂亮的位图,拷贝到本工程文件夹下的res文件夹里,命名为bitmap.bmp,然后打开工作台的Resource View页面,选择菜单Insert|Resource,弹出如图9-06所示插入资源Insert Resource对话框,在该对话框上选中Bitmap,然后单击对话框右边的Import按钮。 单击Import按钮后,弹出如图9-07所示的导入资源对话框,打开EX09_02res

28、文件夹,选中该文件夹下的bitmap.bmp文件,单击Import按钮将该位图导入到工程中。图9-07 导入bitmap.bmp位图资源 将位图导入到工程中时,会弹出如图9-08所示的消息框,该消息框提示用户位图已经正确的导入到工程中了,但是由于位图的颜色大于256位色,因此不能加载到Visual C+的位图编辑器中,并且不能编辑该位图,我们可以不必去理会它,因为我们并不想修改这个位图。但是,如果读者在加载位图之后,希望能够修改这个位图,那么你加导入到工程中的位图就应该至少是256位颜色以下的位图。图9-08 消息提示框 位图加载之后,就采用缺省的ID号IDB_BITMAP1。 步骤3:在CE

29、X09_02View:OnDraw函数中贴图。1. 产生一个兼容DC:CDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);调用CDC类的成员函数CreateCompatibleDC用于创建兼容某一设备描述表的一个兼容DC,函数原形如下:BOOL CreateCompatibleDC( CDC* pDC );该函数只有一个参数pDC,指向要兼容的设备描述表,如果该参数为NULL,那么创建的兼容DC是兼容系统显示屏幕的。本例中兼容的DC就是CEX09_02View:OnDraw函数中由系统传来的pDC。2. 创建及装入位图资源: CBitma

30、p bmp; bmp.LoadBitmap(IDB_BITMAP1); 代码中首先创建一个CBitmap类的对象bmp,然后调用CBitmap类的成员函数LoadBitmap,将位图资源载入对象bmp中。3. 将位图选入兼容DC dcCompatible.SelectObject(&bmp);4. 将兼容DC上的内容拷入当前DC上 CRect rect; GetClientRect(&rect); pDC-BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible, 0,0,SRCCOPY); 函数GetClientRect用于获取客户区的矩形大小,该函数只有一个参数为CRect类或RECT结构的对象引用,调用该函数之后返回的矩形大小就存放在此参数中。 函数BitBlt,用于将源DC上的位图拷贝到目的DC,函数原形如下:BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int y

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1