vc++基础教程 第9章.docx
- 文档编号:2844133
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:16
- 大小:612.48KB
vc++基础教程 第9章.docx
《vc++基础教程 第9章.docx》由会员分享,可在线阅读,更多相关《vc++基础教程 第9章.docx(16页珍藏版)》请在冰豆网上搜索。
vc++基础教程第9章
第9章修改框架程序的显示效果
本章将讲述如何修改MFCAppWizard自动生成的应用程序的外观,在学习本章内容之前,读者有必要回头复习一下第二章中讲过的创建一个窗口的过程。
9.1修改Windows应用程序外观样式
我们可以通过不同的方法来修改应用程序的背景、标题、光标、图标以及框架是否具有最大、最小对话框等信息。
我们知道由于视图类覆盖在框架窗口上,因此,我们通常在MainFrame中修改图标、标题及是否具有最大、最小框的属性;而背景及光标等信息就需要在View类中修改。
9.1.1在框架类中修改程序外观
本节内容所讲的实例都包含在光盘例子代码EX09_00中。
新建一个MFC单文档应用程序,工程名为EX09_00或用户自定义。
1.在CMainFrame:
:
PreCreateWindow中修改。
在窗口产生之前,会调用它的成员函数PreCreateWindow,此时窗口还没有产生,相当于一栋大楼修建之前,在它的设计图纸上修改它的式样,然后按照修改后的图纸去修建大楼。
修改方法有以下几种:
●直接修改CREATESTRUCT结构,代码如下:
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreateWindow(cs))
returnFALSE;
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
cs.style&=~WS_MAXIMIZEBOX;//去掉窗口的最大化按钮
cs.style&=~FWS_ADDTOTITLE;//允许添加自己的标题
cs.lpszName="VisualC++教学";
returnTRUE;
}
其中style和lpszName是结构CREATESTRUCT的数据成员,分别表示框架窗口的样式和标题。
需要注意的是,要想将窗口框架显示标题改为我们的标题,必须要将style的FWS_ADDTOTITLE属性去掉。
运行程序,会发现窗口的最大化按钮不见了,并且标题再不是以前的那种很枯燥的“无标题”,而是换成了我们自己添加的"VisualC++教学",结果如图9-00所示。
图9-00去掉了最大化按钮及添加新标题
●重新设计、填写WNDCLASS,代码如清单9-00所示:
清单9-00CMainFrame:
:
PreCreateWindow函数代码
-------------------------------------------------------------------------------
1BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
2{
3if(!
CFrameWnd:
:
PreCreateWindow(cs))
4returnFALSE;
5//TODO:
ModifytheWindowclassorstylesherebymodifying
6//theCREATESTRUCTcs
7WNDCLASSwndClass;
8wndClass.style=CS_HREDRAW;
9wndClass.lpfnWndProc=(WNDPROC):
:
DefWindowProc;
10wndClass.cbClsExtra=0;
11wndClass.cbWndExtra=0;
12wndClass.hInstance=:
:
AfxGetInstanceHandle();
13wndClass.hIcon=LoadIcon(:
:
AfxGetInstanceHandle(),
14MAKEINTRESOURCE(IDI_ICON1));
15wndClass.hCursor=LoadCursor(NULL,IDC_NO);
16LOGBRUSHlgbr;
17lgbr.lbStyle=BS_SOLID;
18lgbr.lbColor=RGB(255,255,0);
19lgbr.lbHatch=HS_CROSS;
20wndClass.hbrBackground=CreateBrushIndirect(&lgbr);
21wndClass.lpszMenuName=NULL;
22wndClass.lpszClassName="hello";
23RegisterClass(&wndClass);
24cs.lpszClass="hello";
25returnTRUE;
26}
第7~22行代码定义了一个新的窗体类wndClass并设计该类;,
第16~19行部分代码中自定义了一个LOGBRUSH结构类型的画刷lgbr,其中lbStyle、lbColor和lbHatch是该结构体的三个数据成员,分别表示所定义的画刷的样式等属性,设置该画刷的属性为实心的黄色,新设计的窗口类的背景就采用这个画刷。
其中IDI_ICON1是我们在资源面板中新添加的一个图标资源的ID。
代码中的大部分内容在第二章都接触过,可能最后一句cs.lpszClass="hello";有的读者大概不理解该句代码的用意。
我们知道,在CMainFrame:
:
PreCreateWindow中,应用程序根据该函数传来的cs进行框架的显示,这个cs结构中的数据成员lpszClass包含框架生成时采用的窗口类的名称,如果我们不添加最后一句代码将我们的窗口类赋给lpszClass数据成员,那么它还会采用原来系统默认的窗口类。
运行程序,读者会发现,框架的图标变了,但是背景和光标没有变,如图9-01所示,那是由于视图类覆盖在框架类上了,应将此段代码拷入CEX09_00View:
:
PreCreateWindow函数中,就可以看到效果了。
图9-01修改了显示的图标
●利用GetClassInfo函数,代码如清单9-01所示:
清单9-01CMainFrame:
:
PreCreateWindow函数代码
1BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
2{
3if(!
CFrameWnd:
:
PreCreateWindow(cs))
4returnFALSE;
5//TODO:
ModifytheWindowclassorstylesherebymodifying
6//theCREATESTRUCTcs
7WNDCLASSwndclass;
8:
:
GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);
9wndclass.hIcon=:
:
LoadIcon(:
:
AfxGetInstanceHandle(),
10MAKEINTRESOURCE(IDI_ICON1));
11wndclass.lpszClassName="hello";
12:
:
RegisterClass(&wndclass);
13cs.lpszClass="hello";
14returnTRUE;
15}
第7行首先定义一个窗口类对象wndclass,然后在第8行调用GetClassInfo函数将取得的当前使用的窗口类信息赋给对象wndclass,最后,通过9~11行修改wndclass,再由12、13行代码重新注册及加载修改后的窗口对象来实现,程序运行结果同图9-01一样。
函数GetClassInfo用于取得某一窗口类的信息,原形如下:
BOOLGetClassInfo(HINSTANCEhInstance,LPCTSTRlpClassName,LPWNDCLASSlpWndClass);
第一个参数hInstance,表示创建窗口类的当前运行的应用程序实例。
第二个参数lpClassName,要获取的窗口类的类名。
第三个参数lpWndClass,指向WNDCLASS结构类型的对象,函数调用后获取的窗口类的信息存放到该参数中。
2.在CMainFrame:
:
OnCreate中修改。
●利用SetWindowLong函数,如下:
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{……
SetWindowLong(m_hWnd,GWL_STYLE,
:
:
GetWindowLong(m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);
return0;
}
其中,GetWindowLong函数用于取得指定窗口的信息,函数原形如下:
LONGGetWindowLong(HWNDhWnd,intnIndex);
第一个参数hWnd,表示要获取信息的窗口句柄,或窗口类所在的窗口.
第二个参数nIndex,要获取的信息索引,此参数可取下列值:
GWL_EXSTYLE获取窗口的扩展风格
GWL_STYLE获取窗口的样式
GWL_WNDPROC获取窗口过程的回调函数
函数SetWindowLong,用于改变指定窗口的属性风格,该函数原形如下:
LONGSetWindowLong(HWNDhWnd,intnIndex,LONGdwNewLong);
第一个参数hWnd,表示要设置新属性的窗口句柄,或窗口类所在的窗口.
第二个参数nIndex,要设置的属性的索引,此参数可取下列值:
GWL_EXSTYLE设置新的窗口扩展风格
GWL_STYLE设置新的窗口样式
GWL_ID分配一个新的窗口标识
第三个参数dwNewLong,表示要设置的新的属性值。
上段代码的实现过程是首先调用GetWindowLong获取当前窗口的信息,然后去掉最大化按钮,最后调用SetWindowLong,给窗口设置新的属性。
●利用SetClassLong函数,如下:
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{……
SetClassLong(m_hWnd,GCL_HICON,
(long)AfxGetApp()->LoadIcon(IDI_ICON1));
return0;
}
其中,函数SetClassLong用于重置当前窗口所包含的窗口类的WNDCLASS结构中的指定数据成员的属性,函数原形如下:
DWORDSetClassLong(HWNDhWnd,intnIndex,LONGdwNewLong);
第一个参数hWnd,表示要设置新属性的窗口句柄,或窗口类所在的窗口.
第二个参数nIndex,要设置的属性的索引,此参数可取下列值:
GCL_HBRBACKGROUND设置新的背景画刷
GCL_HCURSOR设置新的光标
GCL_HICON设置新的图标
GCL_STYLE设置新的窗口样式
第三个参数dwNewLong,表示要设置的新的属性值。
9.1.2在视图类中修改程序外观
1.在EX09_00View:
:
PreCreateWindow中修改
●重新设计、填写WNDCLASS,代码如下:
BOOLCEX09_00
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vc+基础教程 第9章 vc 基础教程
![提示](https://static.bdocx.com/images/bang_tan.gif)