友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
VC语言6.0程序设计从入门到精通-第15部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
(1)在 IDE 的主菜单中选择“View| ClassWizard ”菜单命令,或按快捷键 Ctrl+W 打开
ClassWizard 对话框。
(2 )在“ClassWizard ”对话框中,单击“Add Class ”按钮,在弹出的下拉菜单中选择“New ”
菜单项,打开“New Class ”对话框。
(3 )在“NewClass ”对话框中创建名为 CTestSheet 的属性表派生类。在“Class type ”下
拉列表框中选择 MFC Class ,在“Name ”输入框中输入 CTestSheet,在“Base class ”下拉列
表框中选择 CPropertySheet,如图 4…24 所示。单击“OK ”按钮退出“New Class ”对话框,
返回“ClassWizard ”对话框,可以看到“Class name ”下拉列表框中已经选择了新创建的
CTestSheet ”类。
“
图 4…24 添加 CProperySheet 类的派生类
(4 )为 CTestSheet 类添加每个属性页类的成员变量 。关闭“ClassWizard ”对话框,在 IDE
左侧工作区中单击“ClassView ”选项卡,展开 Sample4_1 classes 节点,在 CTestSheet 上单击
Add Member Variable ”菜单项,打开 Add Member Variable 对话框。在“Variable
鼠标右键,选择“
Type ”输入框中输入 CTestPage1,在“Variable Name ”输入框中输入 m_page1 ,单击“OK ”
按钮就可以为 CTestSheet 类添加第一个属性页类 CTestPage1 的 m_page1 成员变量。重复这一
过程,为 CTestSheet 添加成员变量 CTestPage2 类的 m_page2 和 CTestPage3 类的 m_page3 。
(5 )最后在属性表类 CTestSheet 的构造函数中将所有属性页添加到属性表中。在 IDE 左
侧工作区中单击“ ClassView ”选项卡,展开 Sample4_1 classes|CTestSheet 节点,双击
“CTestSheet(LPCTSTR pszCaption; CWnd* pParentWnd = NULL; UINT iSelectPage = 0) ”,即可
编辑 CTestSheet 的构造函数,修改函数代码如下:
CTestSheet::CTestSheet(LPCTSTR pszCaption; CWnd* pParentWnd; UINT iSelectPage)
:CPropertySheet(pszCaption; pParentWnd; iSelectPage)
{
AddPage(&m_page1);
AddPage(&m_page2);
AddPage(&m_page3);
}
·86 ·
…………………………………………………………Page 96……………………………………………………………
第 4 章 对话框
5 .打开向导对话框
在实例 Sample4_1 中添加一个菜单项打开前面创建的向导对话框,步骤如下:
(1)首先创建打开向导对话框的菜单项。
单击 IDE 左侧工作区的“ResourceView ”标签,展开Menu 节点,双击 IDR_SAMPLETYPE ,
打开“IDR_SAMPLETYPE ”菜单资源编辑界面。在 IDE 右侧客户区展开顶层“查看”菜单,
双击虚线框,打开添加一个新的菜单项的对话框。在“ID ”输入框中输入 ID_WIZARD,在
“Caption ”输入框中输入“打开向导对话框”,回车确认修改。
(2 )为新建的菜单项添加消息处理函数。
在 IDE 主菜单栏中依次选择菜单“View|ClassWizard ”,或者在开发环境的界面中直接使
用快捷键 Ctrl+W,打开“ClassWizard ”对话框。单击“Message Maps ”选项卡,在“Class name ”
下拉列表框中选择“CSample4_1View ”,在“Object IDs ”列表框中选择 ID_WIZARD ,在
“Messages ”列表框中选择 MAND,单击“Add Function ”按钮,在弹出的对话框中单击
OK ”按钮,就创建了名为 OnWizard 的菜单项消息处理函数。
“
(3 ) 单 击 “ Edit Function ” 按 钮 , 关 闭 “ ClassWizard ” 对 话 框 , IDE 定 位 到
CSample4_1View::OnWizard()函数,编辑 CSample4_1View::OnModalless()函数,代码如下:
void CSample4_1View::OnWizard()
{
// TODO: Add your mand handler code here
// 创建属性表对象
CTestSheet sheet(〃〃);
// 设置属性对话框为向导对话框
sheet。SetWizardMode();
// 打开模态向导对话框
sheet。DoModal();
}
至此,创建向导对话框的所有步骤已经完成,编译运行 Sample4_1,选择菜单“查看|打
开向导对话框 ”,就可以打开创建的向导对话框,图 4…25 所示为在向导对话框最后一步单击
“完成”按钮后的运行结果。
图 4…25 向导对话框的最后一步
·87 ·
…………………………………………………………Page 97……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
4。4。3 一般属性页对话框的创建步骤
一般属性页对话框提供了选项卡的功能,为属性进行合理的分类。本节将介绍这类属性
对话框的创建步骤。
(1)创建属性页模板。
(2 )为各个属性页添加属性页类。
(3 )创建属性表类。
以上 3 个步骤都与向导对话框的创建步骤相同。惟一的区别是不用添加 4。4。2 节中提到
的 OnSetActive()和 OnWizardFinish()函数。
(4 )打开属性页对话框。
打开一般属性对话框与打开向导对话框的方法类似,只需要把打开前的 SetWizardMode()
函数去掉即可。例如在 Sample4_1 中打开一个为 CTestSheet 类的一般属性页对话框,首先根
据 4。4。2 节的第 4 部分,为 Sample4_1 创建 ID 为 ID_PROPERTIES 的“查看|打开一般属性页
对话框”菜单项,并为之在 CSample4_1View 类中添加消息处理函数 OnProperties() 。添加如
下代码就可以直接打开一般属性页对话框:
void CSample4_1View::OnProperties()
{
// TODO: Add your mand handler code here
// 创建属性表对象
CTestSheet sheet(〃〃);
// 打开模态一般属性页对话框
sheet。DoModal();
}
技巧:开发大型程序时有可能会创建许多类。这种情况下可以创建目录优化工作区。例如在
Sample4_1 中可以将 CTestSheet 及其包含的属性页类 CTestPage1、CTestPage2 和 CTestPage3
归在同一个目录下。具体操作为如下:
(1)单击在 IDE 左侧工作区窗口的“ClassView ”选项卡。
(2 )在“ClassView ”中的 Sample4_1 classes 节点上单击鼠标右键,选择“New Folder ”菜
单项,打开“New Folder ”对话框。
(3 )在“New Folder ”对话框中的“Name of the new folder ”输入框中输入 TestSheet,单击
“OK ”按钮退出对话框,就可以看到“ClassView ”中的 Sample4_1 classes 节点多了一个
TestSheet 的目录。
(4 )在“ClassView ”中将 CtestSheet、CTestPage1、CTestPage2 和 CTestPage3 拖至 TestSheet
目录就可以完成归类。
4。5 通用对话框
在 Windows 系统中提供了一些通用对话框,如打印设置对话框、页面设置对话框、查找
·88 ·
…………………………………………………………Page 98……………………………………………………………
第 4 章 对话框
对话框、文件对话框、字体对话框和颜色对话框等 。这些是 Windows 系统中出现频率很大的
对话框,将它们定义为通用对话框可以极大地减轻程序的复杂度 。同时,MFC 已经用类封装
了这些通用对话框。一般来讲,要使用通用对话框,不需要派生新的类,因为 MFC 提供的
基类已经提供了常用的功能。而且在对话框结束后,可以通过成员函数得到用户在对话框中
的选择。
本节用一个包含各种通用对话框的例程来分别介绍 Windows 系统提供的通用对话框的
编程方法。
实例 4…5 :创建通用对话框实例。源代码在光盘中“04实例 4…5GridDemo ”目录下。
GridDemo,是一个表格编辑器。该表格编辑器提供一个固定大小的自绘表格,用户可以
新建、打开和保存表格。同时该程序还提供了一些基本的编辑功能,如查找表格中出现的字
符串、设置表格中文本的字体和颜色 。最后该表格还可以调整打印效果,并在打印机中输出。
这些功能都是用通用对话框进行设置的。
首先介绍一下 GridDemo 的基本框架。GridDemo 是一个单文档应用程序,类和主要成员
变量的关系如图 4…26 所示。
o CMainFrame :GridDemo 的框架类。
o CGridDemoDocument :GridDemo 的文档类,用于存取文档并更新相应的视图。
o m_CellTextArray :CGridDemoDocument 的成员变量,用于保存表格中的文本,是一个
一维的字符串数组,通过行数 m_nRow 和列数 m_nCol 映射到二维的表格中。
o CGridDemoView :GridDemo 的视图类,用于显示和修改表格。表格的每个单元格在
CGridDemoView 中以输入框的控件形式出现。这个表格由一个输入框控件数组
m_CellArray 组成,并且由这个控件数组进行绘制。
o m_CellArray :CGridDemoView 的成员变量,用于显示和修改表格,是一个一维的
CMyEdit 类型数组,数组下标与文档类中的 m_CellTextArray 一致。
o CMyEdit :重载的 CEdit 类,用于更改输入框文字颜色和字体。
图 4…26 GridDemo 的组织关系图
4。5。1 打印设置对话框
打印设置对话框如图 4…27 所示,这个对话框提供了 Windows 标准打印设置,包括选择
打印机、打印范围和打印份数等。这些选项一般在打印输出前进行设置。
·89 ·
…………………………………………………………Page 99……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
图 4…27 打印设置对话框
CPrintDialog 封装了打印设置对话框的操作 。在 GridDemo 的 GridDemoView。cpp 文件中,
CGridDemoView::OnFilePrint()函数用于创建打印设置对话框,步骤如下:
(1)创建 CGridDemoView::OnFilePrint()函数。
CGridDemoView::OnFilePrint()是 GridDemo 例程视图类“文件|打印”菜单项的消息处理
函数。在用 IDE 的 AppWizard 创建 SDI 应用程序的过程中,默认创建了“文件|打印”菜单
项,用户只需要依照第 3 章的讲解,在 CGridDemoView 类中为该菜单项 ON_FILE_PRINT
添加消息处理函数,就可以创建 CGridDemoView::OnFilePrint()函数。
(2 )创建 CPrintDialog 对象。CGridDemoView::OnFilePrint()函数创建 CPrintDialog 对象
dlg,代码如下:
//打开一个打印设置对话框
CPrintDialog dlg(FALSE;PD_NOSELECTION|PD_NOPAGENUMS;this);
(3 ) 打 开 CPrintDialog 对 话 框 。 这 通 过 调 用 CPrintDialog::DoModal() 函 数 实 现 ,
CGridDemoView::OnFilePrint()函数中的代码如下:
if(dlg。DoModal() == IDOK)
上面的 if 语句打开打印设置对话框,并判断如果用户是否单击“确定”按钮,如果是,
DoModal() 函数返回 IDOK ,进行 if 语句块中的打印操作,反之则不进行打印。
(4 )将从打印设置对话框获得的打印设备上下文附加到打印输出时使用的设备上下文对
象。CGridDemoView::OnFilePrint() 中这一步骤具体如下:
CDC dc;
dc。Attach(dlg。GetPrinterDC());//把打印设备上下文附加到 DC 对象
(5 )进行打印的具体过程,本章不涉及这类内容,故略过,用户可以参考第 14 章。
(6 )结束打印。CGridDemoView::OnFilePrint() 中的对应代码如下:
//结束打印
DeleteDC(dc。Detach());
4。5。2 页面设置对话框
页面设置对话框如图 4…28 所示,提供了 Windows 打印页面设置的标准功能,包括选择
纸张、打印方向和页边距等。CpageSetupDialog 类中封装了页面设置对话框。
下面演示 GridDemo 例程如何使用页面设置对话框进行页边距的设置:m_rectMargin 保
·90 ·
…………………………………………………………Page 100……………………………………………………………
第 4 章 对话框
存在 CGridDemoView 的成员变量中,为 CGridDemoView::OnFilePrint() 的打印代码设置页边
距。相关代码在 GridDemoView。cpp 文件的 CGridDemoView::OnFilePrintSetup()函数中,具体
如下:
(1)创建 CGridDemoView::OnFilePrintSetup()函数。
CGridDemoView::OnFilePrintSetup()函数在 GridDemo 例程中是“文件|页面设置”菜单项
的消息响应函数,对应 ID 为 ID_FILE_PRINT_SETUP 。由 IDE 的 AppWizard 默认创建的 SDI
应用程序中,ID_FILE_PRINT_SETUP 对应的菜单项是“文件|打印设置”,只需要将菜单项
的标题更改为“页面设置”即可与 GridDemo 例程一致。用户只要依照第 3 章的讲解,在
CGridDemoView 类中为该菜单项 ON_FILE_PRINT_SETUP 添加消息处理函数,就可以创建
CGridDemoView::OnFilePrintSetup()函数。
图 4…28 页面设置对话框
(2 )创建页面设置对话框对象,并设置初始值。这部分功能在CGridDemoView::OnFilePrintSetup()
函数的开头实现,代码如下:
//打开一个页面设置对话框,用于设置打印区域,以毫米为单位
CPageSetupDialog dlg;
//初始化页边空白区域
dlg。m_psd。rtMargin=m_rectMargin;
(3 )打开页面设置对话框,保存程序用户设置的页面空白区域。这部分功能的实现代码
在 CGridDemoView::OnFilePrintSetup()函数中具体如下:
if (dlg。DoModal()==IDOK)
{
//设置新的页边空白区域
dlg。GetMargins(&m_rectMargin;NULL);
}
4。5。3 查找对话框
用户在查找字符串时,在查找对话框中可进行查找字符串的设置和其他查找选项的设
·91 ·
…………………………………………………………Page 101……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
置,如查找方向、是否区分大小写等,如图 4…29 所示。
图 4…29 查找对话框
查找对话框在 MFC 中封装为 CFindReplaceDialog 。该对话框跟其他 Windows 通用对话
框不同之处在于该对话框一般不作为模态对话框使用,而作为非模态对话框。如单击“查找
下一个”按钮时,对话框会向父窗口发送消息,通知主窗口进行查找。创建查找对话框的步
骤如下:
(1)添加“编辑|查找”菜单的消息处理函数 CGridDemoView::OnFind() 。
GridDemo 例程中创建查找对话框的代码在 CGridDemoView::OnFind() 函数中添加。
CGridDemoView::OnFind() 函 数 是 “ 编 辑 | 查 找 ” 菜 单 的 消 息 处 理 函 数 , 对 应 ID 为
ID_EDIT_FIND 。需要按照第 3 章的讲解,在“编辑”顶层菜单中添加标题为“查找”,ID 为
ID_EDIT_FIND 的子菜单,然后为 CGridDemoView 类添加这个 ID 的消息处理函数,即
OnFind() 。
(2 )为 CGridDemoView 类添加 CFindReplaceDialog 的指针成员变量。
按照 4。3 节中非模态对话框的创建过程,应当在堆中创建查找对话框的对象,因此,用
户还需为 CGridDemoView 添加类型为“CFindReplaceDialog * ”的 m_pFindDlg 成员变量。方
法为在 IDE 左侧工作区单击“ClassView ”选项卡,展开 GridDemo classes 节点,然后在
CGridDemoView 上单击鼠标右键,选择“Add Member Variable ”菜单项,打开“Add Member
Variable ”对话框,在“Variable Type ”栏中输入“CFindReplaceDialog * ”,在“Variable Name ”
栏中输入“m_pFindDlg ”的变量。
(3 )创建 CFindReplaceDialog 对象,并打开查找对话框。
这一功能由 CGridDemoView::OnFind()函数实现,代码如下:
void CGridDemoView::OnFind()
{
// TODO: Add your mand handler code here
//在堆中创建对话框
m_pFindDlg = new CFindReplaceDialog();
//打开一个没有匹配全词的查找对话框
m_pFindDlg…》Create( TRUE; 〃〃; 〃〃; FR_DOWN|FR_HIDEWHOLEWORD; this );
}
(4 )在 CGridDemoView 类中添加接收查找对话框 FINDMSGSTRING 消息的处理函数。
打开查找对话框后,当用户单击“查找下一个”或者其他按钮时,对话框会向父窗口发
送 FINDMSGSTRING 消息,这不是 MFC 中预先定义好的消息,故不能通过 ClassWizard 添
加消息处理函数,必须手动添加。添加过程如下:
o 先在 CGridDemoView。h 文件的头部“class CGridDemoView ”语句前添加如下代码,将
FINDMSGSTRING 消息注册为 WM_FINDREPLACE 自定义消息:
·92 ·
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!