VC中通用对话框的子类化
来源:互联网 发布:mysql连接池工作原理 编辑:程序博客网 时间:2024/06/05 22:56
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。
- VC中通用对话框的子类化
- VC通用对话框
- VC控件的子类化
- VC++窗口子类化
- VC++窗口子类化
- VC++中的子类化
- VC++窗口子类化
- 通用的关于对话框
- VC 对话框中嵌入对话框
- vc中建立非模态对话框的例子
- VC中对话框的“所有”控件?
- VC++中查找/替换对话框的使用
- VC++对话框中添加状态栏的方法
- VC中目录选择对话框的使用
- 在VC中复制对话框的方法
- VC++对话框中添加状态栏的方法
- vc中建立非模态对话框的例子
- 在VC中复制对话框的方法
- MyEclipse6.0快捷键大全
- 【android基础学习之一】——事件的监听与触发
- 如何在应用程序中映射网络驱动器
- git 使用
- UML建模工具中OCL 2.0的应用
- VC中通用对话框的子类化
- 电脑控制手机的另一选择——android vnc server
- c++数据的取值范围 .
- VC中用于调试程序的几个宏的使用技巧
- ubuntu 安装lamp
- OFFICE开发帮助
- 《Java 本地接口规范》- 简介
- k-means算法
- 关于优化Eclipse中代码补全自动提示(转)