📄 09.1.1 在窗口创建之前修改.txt
字号:
第9章 定制应用程序外观
本章将讲述如何修改 MFC AppWizard自动生成的应用程序的外观,包括工具栏和状态栏的编程,以
及如何为应用程序添加一个启动画面。
在日常生活中,建筑商在盖楼时,通常都是在楼房建成之前先设计好它的外观和大小。当楼房建成
之后,还可以对其外观进行翻新或改造。同样,对于 MFC应用程序来说,为了改变 MFC AppWizard
自动生成的应用程序外观和大小,我们既可以在应用程序窗口创建之前进行,也可以在该窗口创建
之后进行。
9.1.1 在窗口创建之前修改
首先新建一个单文档类型的 MFC AppWizard (exe)工程,工程取名为: Style。如果希望在应用程序
窗口创建之前修改它的外观和大小,就应该在 CMainFrame类的 PreCreateWindow成员函数中进行。
该函数的初始定义代码如例如 1所示。
例 9-1
BOOL CMainFrame: :PreCreateWindow(CREATESTRUCT& cs)
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles hereby modifying
// the CREATESTRUCT cs
return TRUE;
在前面第 3章中已经介绍了这个PreCreateWindow函数,它是一个虚函数。在 MFC
底层代码中,当调用 PreCreateWindow函数时,如果传递了子类对象的指针,根据多态性原理,那
么就会调用子类对象的PreCreateWindow函数。从例9-1所示的代码可知,这个函数有一个参数,其
类型是CREATETRUCT结构,在第 3章中,我们己经把这个结构与 CreateWindowEx函数的参数进行了
比较,得知 CREATETRUCT结构中的字段与 CreateWindowEx函数的参数是完全一致的,只是先后顺序
相反而己。另外, PreCreateWindow函数的这个参数声明为引用类型,这样,如果在子类对象修改
了这个参数中成员变量的值,那么这种改变会反映到 MFC底层代码中,当 MFC底层代码调用
CreateWindowEx函数去创建窗口时,它就会使用改变后的参数值去创建这个窗口。因此,为了修改
一个窗口的外观和大小,我们只需要修改 CREATETRUCT结构体中相关成员变量的值就可以了。
下面,我们先修改Style应用程序窗口的大小,将其宽度设为300,高度设为200,即修改CREATETRUCT
结构体中的cx和 cy成员,修改后的代码如例9-2所示。
例9-2
BOOL CMainFrame : : PreCreateWindow(CREATESTRUCT& cs)
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO : Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.cx = 300;
cS.cy = 200;
return TRUE;
.
Build井运行Style程序,就可以看到初始大小为 300*200的应用程序窗口,如图 9.1所示。
如果想要修改应用程序窗口的标题,则可以通过修改 CREATETRUCT结构体中 IpszName成员的值来实
现,例如,可以在上述例如2所示代码中添加下面这条代码来修改 Style程序窗口的标题(提示:读者
应该在该代码的retum语句之前添加这条语句) :
cs.lpszName = “http: //www.sunxin.org”;
重新生成Style程序井运行,但会发现Style应用程序的标题井未发生改变。这是什么原因呢?读者应
该注意到,当新建一个Word文档时, Word窗口标题栏上显示的标题是:"文
档 1",如图 9.2所示。当我们再新建一个 Word文档时,它的标题变为:"文档 2":当继续新建 Word
文档,它的标题会变为"文档 3"、"文档 4"......,这些都是当前文档的标题。同样,在 MFCSDI
应用程序窗口标题栏上显示的"无标题"(如图以 1所示)这个字符串也是文档的标题。我们创建的这
个 Style应用程序是一个 SDI应用程序,在单文档界面 (SDI)应用程序中,框架的默认窗口样式是
WS OVERLAPPEDWINDOW和 FWS ADDTOTITLE 样式的组合。其中, FWS_ADDTOTITLE是 MFC特定的一
种样式,指示框架将文档标题添加到窗口标题上。因此,如果想让窗口显示自己设置的标题,只需
要将窗口的 FWS_ADDTOTITLE样式去掉即可。在第一章中就己经介绍过如何在现有类型的基础上去掉
某个类型的方法,就是对 FWS_ADDTOTITLE类型取反,并与现在窗口类型进行与操作,从而就可以将
窗口的这个特定类型去掉。因此,在 Style程序中,在上面设置窗口标题的代码之前加上下面这句
代码:
cs.style &= ~FWS_ADDTOTITLE;
或者:
cs.style = cs.style & ~FWS_ADDTOTITLE;
上述两种写法是一样的,建议使用前一种,读者应斗惯这种写法。
图 9.2Word文档界面重新生成 Style程序
运行,将会发现 Style应用程序的标题变成了我们所设置的标题,如图 9.3所示。
当然,在上述例 9-2所示代码中,也可以直接把CREATETRUCT结构体中的style成员设置为WS_
OVERLAPPEDWINDOW。该成员的初始定义代码是:
cs . style = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE ;
可以将该成员修改为:
cs .style = WS_OVERLAPPEDWIENDOW;相当于去掉了FWS ADDTOTITLE类型。读者可以试试这种方
法,将会发现效果是一样的。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -