深入浅出MFC第2版(PDF格式)-第84部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
COleDialog Ole 相关对话框
CObject
CObject
CCmdTarget
CCmdTarget
CWnd
CWnd
CDialog
CDialog
CmonDialog
CmonDialog
CColorDialog
CColorDialog
CFileDialog
CFindReplaceDialog
CFindReplaceDialog
CFontDialog
CFontDialog
COleDialog
COleDialog
CPageSetupDialog
CPageSetupDialog
CPrintDialog
CPrintDialog
407
…………………………………………………………Page 470……………………………………………………………
第篇 湷觥 FC 程式設計
在C/SDK 程序中, 使用通用对话框的方式是, 首先填充一块特定的结构如
OPENFILENAME,然后调用API 函数如GetOpenFileName。当函数回返,结构中的某
些字段便持有了使用者输入的值。
MFC 通用对话框类别,使用之简易性亦不输Windows API 。下面这段码可以激活【Open 】
对话框并最后获得文件完整路径:
char szFileters'' = 〃Text fiels (*。txt)|*。txt|All files (*。*)|*。*||〃
CFileDialog opendlg (TRUE; 〃txt〃; 〃*。txt〃;
OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; szFilters; this);
if (opendlg。DoModal() == IDOK) {
filename = opendlg。GetPathName();
}
opendlg 构造式的第一个参数被指定为TRUE,表示我们要的是一个【Open 】对话框而
不是【Save As】对话框。第二参数〃txt〃 指定预设扩展名;如果使用者输入的文件没有
扩展名,就自动加上此一扩展名。第三个参数〃*。txt〃 出现在一开始的【file name】字段
中。OFN_ 参数指定文件的属性。第五个参数szFilters 指定使用者可以选择的文件型
态,最后一个参数是父窗口。
当DoModal 回返,我们可以利用CFileDialog 的成员函数GetPathName 取得完整的档
案路径。也可以使用另一个成员函数GetFileName 取其不含路径的文件名称,或
GetFileTitle 取得既不含路径亦不含扩展名的文件名称。
这便是MFC 通用对话框类别的使用。你几乎不必再从其中衍生出子类别,直接用就好
了。
408
…………………………………………………………Page 471……………………………………………………………
第6章 MFC 程式的生死因果
本章回顾
乍看MFC 应用程序代码,实在很难推想程序的进行。一开始是一个衍生自CWinApp 的全
域对象application object ,然后是一个隐藏的WinMain 函数,调用application object 的
InitInstance 函数,将程序初始化。初始化动作包括构造一个窗口对象(CFrameWnd 物
件),而其构造式又调用CFrameWnd::Create 产生真正的窗口(并在产生之前要求MFC
注册窗口类别)。窗口产生后WinMain 又调用Run 激活消息循环,将WM_MAND
(IDM_ABOUT )和WM_PAINT 分别交给成员函数OnAbout 和OnPaint 处理。
虽然刨根究底不易,但是我们都同意,MFC 应用程序代码的确比SDK 应用程序代码精简许
多。事实上,MFC 并不打算让应用程序代码比较容易理解,毕竟raw Windows API 才是
最直接了当的动作。许许多多细碎动作被包装在MFC 类别之中,降低了你写程序的负
担,当然,这必须建立在一个事实之上:你永远可以改变MFC 的预设行为。这一点是
无庸置疑的,因为所有你可能需要改变的性质,都被设计为MFC 类别中的虚拟函数了,
你可以从MFC 衍生出自己的类别,并改写那些虚拟函数。
MFC 的好处在更精巧更复杂的应用程序中显露无遗。至于复杂如OLE 者,那就更是非
MFC 不为功了。本章的Hello 程序还欠缺许多Windows 程序完整功能,但它毕竟是一
个好起点,有点晦涩但不太难。下一章范例将运用MDI 、Document/View 、各式各样的UI
对象。。。。
409
…………………………………………………………Page 472……………………………………………………………
第篇 湷觥 FC 程式設計
410
…………………………………………………………Page 473……………………………………………………………
第7章 簡單而完整:MFC 骨幹程式
第7章
简单而完整:MFC 骨干程序
当技术愈来愈复杂,
入门愈来愈困难,
我们的困惑愈来愈深,
犹豫愈来愈多。
上一章的Hello 范例,对于MFC 程序设计导入很适合。但它只发挥了MFC 的一小部
份特性,只用了三个MFC 类别(CWinApp、CFrameWnd 和CDialog)。这一章我们要
看一个完整的MFC 应用程序骨干(注),其中包括丰富的UI 对象(如工具栏、状态
列)的生成,以及很重要的Document/View 架构观念。
注:我所谓的MFC 应用程序骨干,指的是由AppWizard 产生出来的MFC 程序,也
就是像第4章所产生的Scribble step0 那样的程序。
不二法门:熟记MFC 类别阶层架构
我还是要重复这一句话:MFC 程序设计的第一要务是熟记各类别的阶层架构,并清楚了
解其中几个一定会用到的类别。一个MFC 骨干程序(不含ODBC 或OLE 支持)运用到
的类别如图7…1 所示,请与图6…1 做个比较。
411
…………………………………………………………Page 474……………………………………………………………
第篇 湷觥 FC 程式設計
CObject
CObject
CCmdTarget
CCmdTarget
CWinThread
CWinThread
CWinApp
CWinApp
CMyWinApp
CMyWinApp
CWnd
CWnd
CView
CView
CMyView
CFrameWnd
CFrameWnd
CMDIFrameWnd CMyMDIFrameWnd
CMDIFrameWnd CMyMDIFrameWnd
CMDIChildWnd CMyMDIChildWnd
CMDIChildWnd CMyMDIChildWnd
CControlBar
CDocument CControlBar
CDocument
CMyDoc CStatusBar
CStatusBar
CMyDoc
CToolBar
CDocTemplate CToolBar
CDocTemplate
CMultiDocTemplate CDialog CMyDialog
CMultiDocTemplate CDialog CMyDialog
图7…1 本章范例程序所使用的MFC 类别。请与图6…1 做比较。
MFC 程序的UI 新风貌
一套好软件少不得一幅漂亮的使用者接口。图7…2 是信手拈来的几个知名Windows 软
体,它们一致具备了工具栏和状态列等视觉对象,并拥有MDI 风格。利用MFC ,我们
很轻易就能够做出同等级的UI 接口。
第7章简单而完整:MFC 骨干程序
412
…………………………………………………………Page 475……………………………………………………………
第7章 簡單而完整:MFC 骨幹程式
图7…2a Microsoft Word for Windows,允许使用者同时编辑多份文件,每
一份文件就是所谓的document,这些document 窗口绝离不会脱
Word 主窗口的管辖。
413
…………………………………………………………Page 476……………………………………………………………
第篇 湷觥 FC 程式設計
图7…2b Microsoft Excel , 允许同时制作多份报表。每一份报表就是一份
document。
414
…………………………………………………………Page 477……………………………………………………………
第7章 簡單而完整:MFC 骨幹程式
图7…2c Microsoft PowerPoint 允许同时制作多份演示文稿资料,每一份演示文稿就
是一份document
。
撰写MFC 程序,我们一定要放弃传统的「纯手工打造」方式,改用Visual C++ 提供的
各种开发工具。AppWizard 可以为我们制作出MFC 程序骨干;只要选择某些按钮,不
费吹灰之力你就可以获得一个很漂亮的程序。这个全自动生产线做出来的程序虽不具备
任何特殊功能(那正是我们程序员的任务),但已经拥有以下的特征:
415
…………………………………………………………Page 478……………………………………………………………
第篇 湷觥 FC 程式設計
标准的【File】菜单,以及对话框。
标准的【Edit】菜单(剪贴簿功能)。这
份菜单是否一开始就有功效,必须视你选