第十一讲 MFC常用控件的使用(3) 严宣辉 数学与计算机科学学院 E-mail:yanxuanhui@fjnu.edu.cn
第五章 对话框和常用控件 5.7 通用对话框和消息对话框 5.8 综合应用实例
5.7 通用对话框 Windows系统提供了一些标准的通用对话框,Windows系统本身提供了对这些对话框的支持,应用程序开发人员不必自己设计这些对话框。 在MFC类库中,所有这些对话框都是由公共基类CCommonDialog派生出来的。下面分几类来使用这些通用对话框。 表5.7_1 通用对话框类 类 作用 CFileDialog 打开或保存文件 CColorDialog 选择或者创建一种颜色 CFindReplaceDialog 查找替换字符串 CFontDialog 从可用的字体中选择一种字体 CPageSetDialog 设置页面参数 CPprintDialog 设置打印机和打印文档
5.7.1 文件存取对话框 5.7.1 文件存取对话框(CFileDialog) 5.7.1 文件存取对话框 5.7.1 文件存取对话框(CFileDialog) 在MFC中,CFileDialog源于CDialog类,所以它具备对话框的基本行为。如果CFileDialog类所提供的功能无法满足要求,那么可以把CFileDialog作为基类,派生新的文件对话框类,添加新的函数来满足特定的需要。
5.7.1 文件存取对话框 创建文件对话框对象时,系统执行CFileDialog( )构造函数来建立此对象,可以通过它的参数在构造函数中设定文件对话框的初值,决定是打开文件还是保存文件以及设置过滤器,只把符合要求的文件在列表框中显示。
5.7.1 文件存取对话框 使用CFileDialog对话框的步骤如下: 5.7.1 文件存取对话框 使用CFileDialog对话框的步骤如下: 1、创建CFileDialog对象, CFileDialog的构造函数如下: CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
5.7.1 文件存取对话框 Parameters bOpenFileDialog:如果为 TRUE 则构造一个文件打开(File Open)对话框,如果为FALSE则构造一个文件保存(File Save As )对话框。 lpszDefExt The default filename extension. If the user does not include an extension in the Filename edit box, the extension specified by lpszDefExt is automatically appended to the filename. If this parameter is NULL, no file extension is appended.
5.7.1 文件存取对话框 lpszFileName The initial filename that appears in the filename edit box. If NULL, no filename initially appears. dwFlags 标志组合,允许用户自定义对话框。详细内容可以参考OPENFILENAME结构的相关信息。 其中OFN_HIDEREADONLY表示隐藏只读文件. lpszFilter 用来指定文件过滤器的字符串序列。如果指使用文件过滤器,那么只有符合指定扩展名的文件才会显示在文件列表框中。过滤字符串有特定的格式。它实际上是由多个子串组成的。每个子串又由两部分组成;第一部分是过滤器的文字说明,例如”Text file(*.txt)”;第二部分是用于匹配的字符串,例如”*.txt”。子串的两部分之间要用“|”符号分开。各子串之间也要用“|”分开,而且整个字符串的最后两个字符必须是两个连续的“||”
5.7.1 文件存取对话框 一个典型的过滤字符串如下面所示: 5.7.1 文件存取对话框 一个典型的过滤字符串如下面所示: CString szFilter=“All files(*.*)|*.*|Text files(*.txt)|*.txt|Word documents(*.doc)|*.doc||” 例子:创建一个文件对话框fd1: CFileDialog fd1(TRUE,"*.txt","*.txt",1,szFilter); 2、初始化对话框。设置或者修改数据成员m_ofn,m_ofn的数据成员是OPENFILENAME类型的。 3、调用成员函数DoModal,显示文件对话框。
5.7.1 文件存取对话框 4、如果DoModal函数返回IDOK,则用户可调用文件对话框的成员函数获取信息 5.7.1 文件存取对话框 4、如果DoModal函数返回IDOK,则用户可调用文件对话框的成员函数获取信息 if(fd1.DoModal()==IDOK) m_sFilePath=fd1.GetPathName(); 表5.7_2 CFileDialog的主要成员函数 Operations 功能 GetPathName 返回一个包含全路径文件名的CString对象 GetFileName 返回一个包含有文件名(不含路径的CString对象 GetFileExt 返回一个只含文件扩展名的CString对象 GetFileTitle 返回一个只含文件名(不含扩展名的) CString对象 GetNextPathName 返回下一个选定文件的全路径 GetReadOnlyPref 所回所选文件的只读状态 GetStartPosition 所回文件名列表中的第一个元素的位置
5.7.1 文件存取对话框 技巧:在Windows 2000/NT/XP下可以将文件对话框显示为如下形式: 5.7.1 文件存取对话框 技巧:在Windows 2000/NT/XP下可以将文件对话框显示为如下形式: 加入语句: fd1.m_ofn.lStructSize=88;
5.7.2 打印对话框 5.7.2 CPrintDialog(打印对话框类) CPrintDialog类为应用程序提供一个标准的打印环境,可以利用它来建立打印(Print)对话框和打印设置(Print Setup)对话框。 在使用AppWizard建立程序的过程中,如果在“MFC AppWizard—Step 5” 中选中Printing and Print Preview功能设定,系统便会产生相关程序。
5.7.3 颜色设定对话框 5.7.3 CColorDialog(颜色设定对话框类) 由于每个人对颜色喜好不一样,在图形化操作界面中,大都会提供颜色设定对话框,让用户依个人喜好重新调配桌面环境的颜色。
5.7.3 颜色设定对话框 使用CColorDialog对话框的步骤如下: 1、创建CColorDialog对象, CFileDialog的构造函数如下: CColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL ); Parameters clrInit The default color selection. If no value is specified, the default is RGB(0,0,0) (black).
5.8.3 颜色设定对话框 2、初始化对话框。设置或者修改数据成员m_cc,m_cc的数据成员是CHOOSECOLOR类型的。 dwFlags A set of flags that customize the function and appearance of the dialog box. For more information, see the CHOOSECOLOR structure in the Win32 SDK documentation. 2、初始化对话框。设置或者修改数据成员m_cc,m_cc的数据成员是CHOOSECOLOR类型的。 3、调用成员函数DoModal,显示颜色对话框。 4、如果DoModal函数返回IDOK,则用户可调用颜色对话框的成员函数获取信息 【例】: CColorDialog dlg(RGB(255,0,0)); if(dlg.DoModal()==IDOK) m_color=dlg.GetColor();
表5.7_2 CColorDialog的主要成员函数 Operations 功能 GetColor Returns a COLORREF structure containing the values of the selected color. GetSavedCustomColors 获取用户创建的自定义颜色. SetCurrentColor Forces the current color selection to the specified color.
5.7.4 字体对话框 5.7.4 CFontDialog(字体对话框类) 在字处理或排版软件中,或者需要采用不同字体加强显示效果时,经常需要设定字体、字型等属性,这种场合就可以利用字形设定对话框来帮助用户选择文本外型、大小、颜色及字体。
5.7.4 字体对话框 使用字体对话框的具体步骤如下: 1、创建一个CFontDialog对象。CFontDialog类的构造函数如下: CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL );
5.7.4 字体对话框 lplfInitial 指向一个 LOGFONT 结构用来初始化对话框中的字体设置. dwFlags 用于设置对话框,指定一个或者多个选择字体标志.可以使用O或操作符”|”将多个标志合并起来.详细信息请看 CHOOSEFONT 结构的相关说明. pdcPrinter 指向一个代表打印的CDC对象,若设置该参数,则选择的字体就为打印机所用.
5.7.4 字体对话框 2、初始化对话框。修改或者设置数据成员m_cf,m_cf的数据成员为CHOOSEFONT结构。 3、调用成员函数DoModal,显示字体对话框。 4、如果DoModal函数返回IDOK,则用户可调用字体对话框的成员函数获取信息
5.7.4 字体对话框 表5.7_4 CFontDialog的主要成员函数 GetCurrentFont Retrieves the name of the currently selected font. GetFaceName Returns the face name of the selected font. GetStyleName Returns the style name of the selected font. GetSize Returns the point size of the selected font. GetColor Returns the color of the selected font. GetWeight Returns the weight of the selected font. IsStrikeOut Determines whether the font is displayed with strikeout. IsUnderline Determines whether the font is underlined. IsBold Determines whether the font is bold. IsItalic Determines whether the font is italic.
5.7.5 查找/替换对话框 5.7.5 CFindReplaceDialog(查找/替换对话框类) 在编辑文本时,经常会使用字符串“查找”、“替换”命令,尤其是在修改大量文本数据时特别有用。 CFindReplaceDialog类提供了标准的字符串查找和替换(Find and Replace)对话框。此类对话框是无模式的,以便在对话框中输入字符串并执行查找/替换命令时,让用户立即从原操作窗口看到该命令执行的结果。
5.7.6 OLE对话框 5.7.6 COleDialog(OLE对话框类) 它是一种高级的对话框,由此类派生以下几个对话框类: COleInsertDialog, COleConverDialog, COleChangeIconDialog, COleLinksDialog, Cole-BusyDialog, COleUpdateDialog, COlePasteSpecialDialog, COlePropertiesDialog, ColeChange-SourceDialog OLE对话框类与OLE操作有关,这里不再详细介绍。
5.7.7 消息对话框 1、概述 消息对话框只用于显示消息,它们的原型如下: int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 ); int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK ); 这两个函数都是用于创建和显示消息对话框,只不过AfxMessageBox是全程函数,可以用在任何地方;而MessageBox只能用于控件、对话框、窗口等一些窗口类中。
5.7.7 消息对话框 参数lpszText表示在消息对话框中显示的字符串文本;lpszCaption表示对话框的标题,为NULL时使用默认标题;nIDHelp表示消息的上下文帮助ID号;nType表示消息对话框的图标类型及所包含的按钮类型。这些类型是用MFC预定义的一些标识符来指定的,参看P239表5.29和5.30。例: int nChoice=MessageBox(“要保存文件吗?”,“提问“ , MB_YESNOCANCEL|MB_ICONWARNING);
5.7.7 消息对话框 Return Value: IDABORT The Abort button was selected. IDCANCEL The Cancel button was selected. IDIGNORE The Ignore button was selected. IDNO The No button was selected. IDOK The OK button was selected. IDRETRY The Retry button was selected. IDYES The Yes button was selected. 返回用户选择按钮的情况,其中IDOK表示用户单击[OK]按钮,
5.8 编程实例 下面创建的一个程序,用户通过选择命令菜单弹出“字体”对话框,在对话框中选择字体的名称、下划线、样式、大小等属性来改变字体。 (1) 利用MFC AppWizard(exe)创建单文档应用程序TestDialog。 (2) 利用ResourceView编辑如图5.8_1所示的菜单。 (3) 利用ClassWizard按表5.8_1中的信息在CTestDialogView类中添加消息映射函数。 (4) 在CTestDialogView类中添加成员变量和成员函数,如表5.8_2所示。 (5) 编写CTestDialogView( )构造函数:
图5.8_1 IDR_MAINFRAME菜单
表5.8_1 CTestDialogView类中添加消息映射函数 对 象 消 息 函 数 ID_TEST_FONTDLG COMMAND OnTestFontdlg
表5.8_2 CTestDialogView类中的成员变量和成员函数 变量类型 变量名称 访问权限 int m_nColor protected CFont* m_pCurFont protected 函数类型 函数名称 访问权限 Void Redraw(CDC* pDC)n protected
CTestDialogView::CTestDialogView( ) { // TODO: add construction code here m_pCurFont=new CFont; m_pCurFont->CreateFont(40, 0, 0, 0, 400, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH&FF_SWISS, "Arial"); }
(6) 编写CTestDialogView( )析构函数: CTestDialogView::~CTestDialogView( ) { delete m_pCurFont; } (7) 编写OnDraw( )函数: void CTestDialogView::OnDraw(CDC* pDC) CTestDialogDoc* pDoc = GetDocument( );
ASSERT_VALID(pDoc); // TODO: add draw code for native data here Redraw(pDC); } (8) 编写OnTestFontdlg( )函数: void CTestDialogView::OnTestFontdlg( ) { // TODO: Add your command handler code here CFontDialog dlg; int nRet=dlg.DoModal( ); if(nRet==IDOK){
delete m_pCurFont; m_pCurFont=new CFont; m_nCurFont->CreateFont(dlg.GetSize( ), 0, 0, 0, dlg.GetWeight( ), dlg.IsItalic( ), dlg.IsUnderline( ), dlg.IsStrikeOut( ), ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH&FF_SWISS, dlg.GetFaceName( )); m_nColor=dlg.GetColor( ); } CDC* pDC=GetDC( ); Redraw(pDC);
(9) 编写Redraw( )函数: void CTestDialogView::Redraw(CDC *pDC) { CRect rect; GetClientRect(&rect); CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(WHITE_BRUSH); pDC->Rectangle(rect); pDC->SelectObject(pOldBrush); CFont* pOldFont; pOldFont=(CFont*)pDC->SelectObject(m_nCurFont); pDC->SetTextColor(m_nChar); pDC->TextOut(40, 40, "我爱MFC编程!"); pDC->SelectObject(pOldFont); }
表5.8_3 CTestDialogDoc类的消息映射函数 (10) 利用ClassWizard按表5.8_2中的信息在CTestDialogDoc类中添加消息映射函数。 (11) 编写OnFileOpen( )函数: 表5.8_3 CTestDialogDoc类的消息映射函数 对 象 消 息 函 数 ID_FILE_OPEN COMMAND OnFileOpen ID_FILE_SAVE_AS COMMAND OnFileSaveAs
void CTestDialogDoc::OnFileOpen( ) { // TODO: Add your command handler code here CFileDialog dlg(TRUE); int ret=dlg.DoModal( ); if(ret==IDOK){ CString pathName=dlg.GetPathName( ); CString fileName=dlg.GetFileName( ); char buf[120]; sprintf(buf, "The %s file in %s is opened!", fileName,pathName); AfxMessageBox(buf); }
(12) 编写OnFileSaveAs( )函数: void CTestDialogDoc::OnFileSaveAs( ) { // TODO: Add your command handler code here CFileDialog dlg(FALSE); int ret=dlg.DoModal( ); if(ret==IDOK){ CString pathName=dlg.GetPathName( ); CString fileName=dlg.GetFileName( ); char buf[120]; sprintf(buf, "The %s file in %s is saved!", fileName,pathName); AfxMessageBox(buf); }
编译并运行应用程序。选择“文件”菜单中的“另存为”菜单项,将弹出如图5.8_2所示的对话框;选择“测试”菜单中的“字体对话框”,将弹出如图5.8_3所示的对话框。
图5.8_2 运行中的“保存为”对话框
图5.8_3 运行中的“字体”对话框
第5章上机练习题3 设计一个使用通用对话框CFileDialog打开一个文文件,并用一个文本框显示的程序,如下图: