您的位置:C++老鼠窝编程 【提问与解答】 正文
站内文章搜索
热门内容
推荐内容
最新内容
广告信息

用MFC和ClassWizard子类化Window的通用对话框


用MFC和ClassWizard子类化Window的通用对话框
(hangwire发表于2002-1-16 0:43:19)

为了子类化Windows通用对话框(如CFileDialog),我们必须创建一个"子对话框模板"并将这个模板绑定到自己的CFileDialog派生类中。这个模板必须只包含你添加到此对话框中的控制。
从所周知,系统将你的对话框模板放在常规对话框的顶层,MFC的消息处理例程是到达不了你的对话框控制的,所以你无法编写代码处理CFileDialog派生类中的消息映射。如果有人解决了这个问题,我愿洗耳恭听。
在Visual C 6.0中,这个问题得到了部分解决。MFC消息例程运行的很好,但是你无法用ClassWizard来添加消息处理器和成员变量。另外,如果想要用ClassWizard从CFileDialog派生一个类,"Dialog ID"输入框会被屏蔽掉,从而无法添加对话框的代码。
为了解决这个问题,本文提供如下技巧:
用ClassWizard从CDialog(而不是CFileDialog)派生自己的类,然后修改派生类的基类(改为CFileDialog)和构造函数。这样你的类将从CFileDialog派生,并且ClassWizard将仍然可以处理你添加的对话框控制。
下面是实现这个技巧的步骤:

1、创建模板
2、用ClassWizard绑定一个CDialog 派生类,如命名为CMyFileDialog
3、在头文件中的CMyFileDialog定义中插入下面的代码行:

DECLARE_DYNAMIC(CMyFileDialog)

然后修改构造函数声明:

CMyFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL);

4、在实现文件中插入下面的代码

IMPLEMENT_DYNAMIC(CMyFileDialog, CFileDialog)

然后修改构造函数定义

CMyFileDialog::CMyFileDialog(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);
}

5、最后,用CFileDialog 代替头文件和实现文件中的CDialog 引用。


 
点这里复制本页地址发送给您QQ/MSN上的好友
相关文章

作为对象的函数指针
在Direct3D中创建暗灯特效
避免在ATL中引发的不明确接口问题
调试ATL组件中的引用计数问题
用注册表键存储用户程序的信息
用ATL的注册器来定制注册表入口
LNK4089的警告是什么意思,如何避免它?
如何拷贝一个工程的对话框资源到另一个工程
如何用VC调用VB的ActiveX DLL?
我的C 学习之路
如何等比例缩放图像
如何禁止对话框关闭按钮和浮动工具条上的系
产生真正的随机数
如何在vc中制作256色的16x16和32x32大小的彩
如何得到视图指针?
如何让自定义的基于CStatic的Static控件响应
如何用CZip/CUnzip类压缩/解压缩文件
初始化应用程序的大小
CListBox编程中LBS_OWNERDRAWFIXED式样设置
如何在MFC中判断EOF

相关评论


本文章所属分类:首页 【提问与解答】