MFC中包含了几个Windows通用对话框设计的封装类。比如,在CFileDialog里可以利用常用的CDialog成员函数DoModal()函数操纵通用文件对话框。
为了从CFileDialog这样的公共对话框类派生出程序员自己的子类,传统方法需要创建一个“子对话框模板”,然后将模板关联于派生出来的CFileDialog类。这个模板只能包括可增加到对话框中的控件。
但是,由于系统将这个派生的对话框模板的消息优先权隐含置于正常对话框顺序之前,MFC消息路径就不会到达这个新的控件类,因此在自己的派生CFileDialog 类里没有办法通过映射消息的方式编写消息处理代码。
在Visual C++ 6.0里这个问题得到了部分解决: MFC 消息路由可以起作用,但程序员还是不能使用 ClassWizard来增加消息处理器和成员变量。而且,如果试图用 ClassWizard 从CFileDialog 派生一个类,它不会使能“Dialog ID”框,没有办法为自己的对话框分配ID号,ClassWizard也不会为对话框增加对应的关联代码。
可以使用下列方法解决这个问题:
使用ClassWizard从CDialog (而不是CFileDialog) 派生新类,然后修改基类和所生成新类的构造函数。结果,新类将会从CFileDialog类派生, ClassWizard就能够处理新增加的控件了。
步骤如下
1. 创建自己的模板。
2. 将该模板关联于一个由CDialog派生出的类,使用ClassWizard (比如命名为CNewFileDialog)即可。
3. 在头文件里,CNewFileDialog.h的定义处,插入如下代码:
DECLARE—DYNAMIC(CNewFileDialog)
并修改构造函数的声明:
CNewFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN—HIDEREADONLY | OFN—OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL, CWnd pParentWnd = NULL);
4. 在新派生类的实现文件(.cpp)里,插入如下代码:
IMPLEMENT—DYNAMIC(CNewFileDialog, CFileDialog)
然后修改构造函数定义:
CnewFileDialog::CNewFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
DWORD dwFlags, LPCTSTR lpszFilter, CWnd pParentWnd) :
CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName,
dwFlags, lpszFilter, pParentWnd)
{
m_ofn.Flags |= OFN—ENABLETEMPLATE | OFN—PATHMUSTEXIST |
OFN—FILEMUSTEXIST | OFN—SHAREAWARE | OFN—ALLOWMULTISELECT;
m—ofn.lpTemplateName = MAKEINTRESOURCE(IDD—ABOUTBOX1);}
最后,在所有头文件和实现文件中用CFileDialog取代CDialog。
为了从CFileDialog这样的公共对话框类派生出程序员自己的子类,传统方法需要创建一个“子对话框模板”,然后将模板关联于派生出来的CFileDialog类。这个模板只能包括可增加到对话框中的控件。
但是,由于系统将这个派生的对话框模板的消息优先权隐含置于正常对话框顺序之前,MFC消息路径就不会到达这个新的控件类,因此在自己的派生CFileDialog 类里没有办法通过映射消息的方式编写消息处理代码。
在Visual C++ 6.0里这个问题得到了部分解决: MFC 消息路由可以起作用,但程序员还是不能使用 ClassWizard来增加消息处理器和成员变量。而且,如果试图用 ClassWizard 从CFileDialog 派生一个类,它不会使能“Dialog ID”框,没有办法为自己的对话框分配ID号,ClassWizard也不会为对话框增加对应的关联代码。
可以使用下列方法解决这个问题:
使用ClassWizard从CDialog (而不是CFileDialog) 派生新类,然后修改基类和所生成新类的构造函数。结果,新类将会从CFileDialog类派生, ClassWizard就能够处理新增加的控件了。
步骤如下
1. 创建自己的模板。
2. 将该模板关联于一个由CDialog派生出的类,使用ClassWizard (比如命名为CNewFileDialog)即可。
3. 在头文件里,CNewFileDialog.h的定义处,插入如下代码:
DECLARE—DYNAMIC(CNewFileDialog)
并修改构造函数的声明:
CNewFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN—HIDEREADONLY | OFN—OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL, CWnd pParentWnd = NULL);
4. 在新派生类的实现文件(.cpp)里,插入如下代码:
IMPLEMENT—DYNAMIC(CNewFileDialog, CFileDialog)
然后修改构造函数定义:
CnewFileDialog::CNewFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
DWORD dwFlags, LPCTSTR lpszFilter, CWnd pParentWnd) :
CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName,
dwFlags, lpszFilter, pParentWnd)
{
m_ofn.Flags |= OFN—ENABLETEMPLATE | OFN—PATHMUSTEXIST |
OFN—FILEMUSTEXIST | OFN—SHAREAWARE | OFN—ALLOWMULTISELECT;
m—ofn.lpTemplateName = MAKEINTRESOURCE(IDD—ABOUTBOX1);}
最后,在所有头文件和实现文件中用CFileDialog取代CDialog。