MFC提供公用对话框类包括以下几种:
CColorDialog类: 用于选择颜色对话框
CFileDialog类: ........实现打开和保存文件对话框
CFindReplaceDialog类: ........查找和替换文本
CFontDialog类: .........选择字体对话框
COleDialog类: .........该类及其派生类用于生成OLE应用程序对话框
CpageSetupDialog类: ..........OLE Page Setup(指定页面设置和打印边界)
CPrintDialog类: ..........打印和打印设置对话框
首先在堆栈上构建一个CFileDialog类的对象,然后调用CFileDialog::DoModal()函数创建并显示对话框
CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
参数意义如下:
bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。
lpszFileName 指定默认的文件名。
dwFlags 指明一些特定风格。
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如: "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd 为父窗口指针。
<例子>
创建新工程Dialog,在菜单资源添加为“打开文件对话框”的菜单,ID为ID_FILEIO_DLG_OPEN,再添加菜单命令的的“打开文件对话框”的COMMAND命令消息处理函数,为OnFileioDlgOpen,代码如下:
void CDialogView::OnFileioDlgOpen()
{
// TODO: 在此添加命令处理程序代码
CFileDialog fileDlg(TRUE);//定义CFileDialog类对象,设第一个参数为TRUE,表示创建打开文件对话框
fileDlg.m_ofn.lpstrFilter=LPCTSTR(_T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0"));
//定义打开对话框的标题“打开文件”
fileDlg.m_ofn.lpstrTitle=LPCTSTR(_T("打开文件"));
char szchar[20];
memset(szchar,0,20);
if(fileDlg.DoModal() == IDOK)
{
CFile file(fileDlg.m_ofn.lpstrFile,CFile::modeRead);
file.Read(szchar,20);
file.Close();
MessageBox(LPCTSTR(szchar));
}
}
//DialogView.h
..................
public:
CFont m_font;//用来保护字体对话框中设置的字体
CString m_FontName;//用来存储字体对话框中字体的名称
.......................
//DialogView.cpp
void CDialogView::OnGraphFontset()
{
// TODO: 在此添加命令处理程序代码
CFontDialog m_setfontDlg;
//如果已经产生了字体,那么创建为新字体,将原来的字体删除
if(m_font.m_hObject)
m_font.DeleteObject();
if(m_setfontDlg.DoModal() == IDOK)
{
m_font.CreateFontIndirect(m_setfontDlg.m_cf.lpLogFont);
m_FontName = m_setfontDlg.m_cf.lpLogFont->lfFaceName;
Invalidate();//调用Invalidate重绘窗口
}
}
clrInit 默认颜色选择。 如果未指定任何值,则默认值为RGB (0,0,0) (黑色)。
dwFlags 自定义对话框的功能和外观的设置标志。
pParentWnd 指针到对话框的父级或所有者窗口。
<例子>
创建新工程Dialog,在菜单资源添加为“颜色设置”的菜单,ID为ID_GRAPH_CLRSET,再添加菜单命令的的“打开文件对话框”的COMMAND命令消息处理函数,为OnGraphClrset,
在CDialogView.h头文件中声明一个COLORREF类型变量m_clr来保护用户设置的颜色,然后在CDialogView构造函数中对m_clr初始化,m_clr = REG(0,255,255)代码如下:
//DialogView.h
..................
public:
CFont m_font;//用来保护字体对话框中设置的字体
CString m_FontName;//用来存储字体对话框中字体的名称
.......................
//DialogView.cpp
void CDialogView::OnGraphFontset()
{
// TODO: 在此添加命令处理程序代码
CFontDialog m_setfontDlg;
//如果已经产生了字体,那么创建为新字体,将原来的字体删除
if(m_font.m_hObject)
m_font.DeleteObject();
if(m_setfontDlg.DoModal() == IDOK)
{
m_font.CreateFontIndirect(m_setfontDlg.m_cf.lpLogFont);
m_FontName = m_setfontDlg.m_cf.lpLogFont->lfFaceName;
Invalidate();//调用Invalidate重绘窗口
}
}
//DialogView.h
..................
public:
CFont m_font;//用来保护字体对话框中设置的字体
CString m_FontName;//用来存储字体对话框中字体的名称
.......................
//DialogView.cpp
void CDialogView::OnGraphFontset()
{
// TODO: 在此添加命令处理程序代码
CFontDialog m_setfontDlg;
//如果已经产生了字体,那么创建为新字体,将原来的字体删除
if(m_font.m_hObject)
m_font.DeleteObject();
if(m_setfontDlg.DoModal() == IDOK)
{
m_font.CreateFontIndirect(m_setfontDlg.m_cf.lpLogFont);
m_FontName = m_setfontDlg.m_cf.lpLogFont->lfFaceName;
Invalidate();//调用Invalidate重绘窗口
}
}
void CCFindReplaceDialogView::OnFind()
{
CFindReplaceDialog* pDlg = new CFindReplaceDialog();
pDlg->Create( true, NULL, NULL, FR_DOWN, this );
/*
第一个参数为true显示的是查找对话框,为False时显示的是查找和替换对话框
第二个参数指定在查找对话框中显示的字符串
第三个参数指定在替换对话框中显示的字符串
第四个参数为指定标志位,用来定制对话框,其中FR_DOWM表示对话框中的“向下”单选按钮被选中,否则“向上”单选按钮被选中,具体可取值参考MSDN
第五个参数为指向父窗口的指针,如果为NULL,则为主框架窗口,使用时需要让它指向接收查找和替换消息的窗口
*/
pDlg->ShowWindow( SW_SHOW ); // 显示对话框
}
void CDialogView::OnButpage()
{
// TODO: 在此添加命令处理程序代码
CPageSetupDialog dlg;//利用默认参数构造页面设置对话框
PAGESETUPDLG psd = dlg.m_psd;
CString str;
str.Format(_T("页面大小为:%d * %d"), psd.ptPaperSize.x, psd.ptPaperSize.y);
MessageBox( str, _T("页面设置"));
}
void CDialogView::OnOnbutprint()
{
// TODO: 在此添加命令处理程序代码
DWORD dwflags=PD_ALLPAGES|PD_NOPAGENUMS|PD_USEDEVMODECOPIES|PD_SELECTION|PD_HIDEPRINTTOFILE;
CPrintDialog dlg(FALSE, dwflags, NULL);
if(dlg.DoModal() == IDOK)
{
CDC dc;
dc.Attach(dlg.GetPrinterDC());
//DrawStr(&dc, TRUE);
}
}