第 22 章
先根
据4.4.2 节的第4 部分,为Sample4_1 创建ID 为ID_PROPERTIES 的“查看|打开一般属xìng页
对话框”菜单项,并为之在CSample4_1View 类中添加消息处理函数OnProperties()。添加如
下代码就可以直接打开一般属xìng页对话框:
void CSample4_1View::OnProperties()
{
// TODO: Add your command handler code here
// 创建属xìng表对象
CTestSheet sheet("");
// 打开模态一般属xìng页对话框
sheet.DoModal();
}
技巧:开发大型程序时有可能会创建许多类。这种情况下可以创建目录优化工作区。例如在
Sample4_1 中可以将CTestSheet 及其包含的属xìng页类CTestPage1、CTestPage2 和CTestPage3
归在同一个目录下。具体cāo作为如下:
(1)单击在IDE 左侧工作区窗口的“ClassView”选项卡。
(2)在“ClassView”中的Sample4_1 classes 节点上单击鼠标右键,选择“New Folder”菜
单项,打开“New Folder”对话框。
(3)在“New Folder”对话框中的“Ncom of the new folder”输入框中输入TestSheet,单击
“OK”按钮退出对话框,就可以看到“ClassView”中的Sample4_1 classes 节点多了一个
TestSheet 的目录。
(4)在“ClassView”中将CtestSheet、CTestPage1、CTestPage2 和CTestPage3 拖至TestSheet
目录就可以完成归类。
4.5 通用对话框
在Windows 系统中提供了一些通用对话框,如打印设置对话框、页面设置对话框、查找
枫叶文学网www.fywxw.com
第4 章 对话框
·89·
对话框、文件对话框、字体对话框和颜色对话框等。这些是Windows 系统中出现频率很大的
对话框,将它们定义为通用对话框可以极大地减轻程序的复杂度。同时,MFC 已经用类封装
了这些通用对话框。一般来讲,要使用通用对话框,不需要派生新的类,因为MFC 提供的
基类已经提供了常用的功能。而且在对话框结束后,可以通过成员函数得到用户在对话框中
的选择。
本节用一个包含各种通用对话框的例程来分别介绍Windows 系统提供的通用对话框的
编程方法。
实例4-5:创建通用对话框实例。源代码在光盘中“\04\实例4-5\GridDemo”目录下。
GridDemo,是一个表格编辑器。该表格编辑器提供一个固定大小的自绘表格,用户可以
新建、打开和保存表格。同时该程序还提供了一些基本的编辑功能,如查找表格中出现的字
符串、设置表格中文本的字体和颜色。最后该表格还可以调整打印效果,并在打印机中输出。
这些功能都是用通用对话框进行设置的。
首先介绍一下GridDemo 的基本框架。GridDemo 是一个单文档应用程序,类和主要成员
变量的关系如图4-26 所示。
? CMainFrcom:GridDemo 的框架类。
? CGridDemoDoccomnt:GridDemo 的文档类,用于存取文档并更新相应的视图。
? m_CellTextArray:CGridDemoDoccomnt 的成员变量,用于保存表格中的文本,是一个
一维的字符串数组,通过行数m_nRow 和列数m_nCol 映shè到二维的表格中。
? CGridDemoView:GridDemo 的视图类,用于显示和修改表格。表格的每个单元格在
CGridDemoView 中以输入框的控件形式出现。这个表格由一个输入框控件数组
m_CellArray 组成,并且由这个控件数组进行绘制。
? m_CellArray:CGridDemoView 的成员变量,用于显示和修改表格,是一个一维的
CMyEdit 类型数组,数组下标与文档类中的m_CellTextArray 一致。
? CMyEdit:重载的CEdit 类,用于更改输入框文字颜色和字体。
图4-26 GridDemo 的组织关系图
4.5.1 打印设置对话框
打印设置对话框如图4-27 所示,这个对话框提供了Windows 标准打印设置,包括选择
打印机、打印范围和打印份数等。这些选项一般在打印输出前进行设置。
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·90·
图4-27 打印设置对话框
CPrintDialog 封装了打印设置对话框的cāo作。在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 语句块中的打印cāo作,反之则不进行打印。
(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 保
枫叶文学网www.fywxw.com
第4 章 对话框
·91·
存在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 查找对话框
用户在查找字符串时,在查找对话框中可进行查找字符串的设置和其他查找选项的设
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·92·
置,如查找方向、是否区分大小写等,如图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 Ncom”
栏中输入“m_pFindDlg”的变量。
(3)创建CFindReplaceDialog 对象,并打开查找对话框。
这一功能由CGridDemoView::OnFind()函数实现,代码如下:
void CGridDemoView::OnFind()
{
// TODO: Add your command handler code here
//在堆中创建对话框
m_pFindDlg = new CFindReplaceDialog();
//打开一个没有匹配全词的查找对话框
m_pFindDlg->Create( TRUE, "", "", FR_DOWN|FR_HIDEWHOLEWORD, this );
}
(4)在CGridDemoView 类中添加接收查找对话框FINDMSGSTRING 消息的处
松语文学免费小说阅读_www.16sy.com
据4.4.2 节的第4 部分,为Sample4_1 创建ID 为ID_PROPERTIES 的“查看|打开一般属xìng页
对话框”菜单项,并为之在CSample4_1View 类中添加消息处理函数OnProperties()。添加如
下代码就可以直接打开一般属xìng页对话框:
void CSample4_1View::OnProperties()
{
// TODO: Add your command handler code here
// 创建属xìng表对象
CTestSheet sheet("");
// 打开模态一般属xìng页对话框
sheet.DoModal();
}
技巧:开发大型程序时有可能会创建许多类。这种情况下可以创建目录优化工作区。例如在
Sample4_1 中可以将CTestSheet 及其包含的属xìng页类CTestPage1、CTestPage2 和CTestPage3
归在同一个目录下。具体cāo作为如下:
(1)单击在IDE 左侧工作区窗口的“ClassView”选项卡。
(2)在“ClassView”中的Sample4_1 classes 节点上单击鼠标右键,选择“New Folder”菜
单项,打开“New Folder”对话框。
(3)在“New Folder”对话框中的“Ncom of the new folder”输入框中输入TestSheet,单击
“OK”按钮退出对话框,就可以看到“ClassView”中的Sample4_1 classes 节点多了一个
TestSheet 的目录。
(4)在“ClassView”中将CtestSheet、CTestPage1、CTestPage2 和CTestPage3 拖至TestSheet
目录就可以完成归类。
4.5 通用对话框
在Windows 系统中提供了一些通用对话框,如打印设置对话框、页面设置对话框、查找
枫叶文学网www.fywxw.com
第4 章 对话框
·89·
对话框、文件对话框、字体对话框和颜色对话框等。这些是Windows 系统中出现频率很大的
对话框,将它们定义为通用对话框可以极大地减轻程序的复杂度。同时,MFC 已经用类封装
了这些通用对话框。一般来讲,要使用通用对话框,不需要派生新的类,因为MFC 提供的
基类已经提供了常用的功能。而且在对话框结束后,可以通过成员函数得到用户在对话框中
的选择。
本节用一个包含各种通用对话框的例程来分别介绍Windows 系统提供的通用对话框的
编程方法。
实例4-5:创建通用对话框实例。源代码在光盘中“\04\实例4-5\GridDemo”目录下。
GridDemo,是一个表格编辑器。该表格编辑器提供一个固定大小的自绘表格,用户可以
新建、打开和保存表格。同时该程序还提供了一些基本的编辑功能,如查找表格中出现的字
符串、设置表格中文本的字体和颜色。最后该表格还可以调整打印效果,并在打印机中输出。
这些功能都是用通用对话框进行设置的。
首先介绍一下GridDemo 的基本框架。GridDemo 是一个单文档应用程序,类和主要成员
变量的关系如图4-26 所示。
? CMainFrcom:GridDemo 的框架类。
? CGridDemoDoccomnt:GridDemo 的文档类,用于存取文档并更新相应的视图。
? m_CellTextArray:CGridDemoDoccomnt 的成员变量,用于保存表格中的文本,是一个
一维的字符串数组,通过行数m_nRow 和列数m_nCol 映shè到二维的表格中。
? CGridDemoView:GridDemo 的视图类,用于显示和修改表格。表格的每个单元格在
CGridDemoView 中以输入框的控件形式出现。这个表格由一个输入框控件数组
m_CellArray 组成,并且由这个控件数组进行绘制。
? m_CellArray:CGridDemoView 的成员变量,用于显示和修改表格,是一个一维的
CMyEdit 类型数组,数组下标与文档类中的m_CellTextArray 一致。
? CMyEdit:重载的CEdit 类,用于更改输入框文字颜色和字体。
图4-26 GridDemo 的组织关系图
4.5.1 打印设置对话框
打印设置对话框如图4-27 所示,这个对话框提供了Windows 标准打印设置,包括选择
打印机、打印范围和打印份数等。这些选项一般在打印输出前进行设置。
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·90·
图4-27 打印设置对话框
CPrintDialog 封装了打印设置对话框的cāo作。在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 语句块中的打印cāo作,反之则不进行打印。
(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 保
枫叶文学网www.fywxw.com
第4 章 对话框
·91·
存在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 查找对话框
用户在查找字符串时,在查找对话框中可进行查找字符串的设置和其他查找选项的设
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·92·
置,如查找方向、是否区分大小写等,如图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 Ncom”
栏中输入“m_pFindDlg”的变量。
(3)创建CFindReplaceDialog 对象,并打开查找对话框。
这一功能由CGridDemoView::OnFind()函数实现,代码如下:
void CGridDemoView::OnFind()
{
// TODO: Add your command handler code here
//在堆中创建对话框
m_pFindDlg = new CFindReplaceDialog();
//打开一个没有匹配全词的查找对话框
m_pFindDlg->Create( TRUE, "", "", FR_DOWN|FR_HIDEWHOLEWORD, this );
}
(4)在CGridDemoView 类中添加接收查找对话框FINDMSGSTRING 消息的处
松语文学免费小说阅读_www.16sy.com