CFormView类的用法举例
转载自:http://blog.csdn.net/laocunzhangxiashan/article/details/52176985
一.CFormView类优点:
MFC创建基于对话框的应用程序存在对话框大小无法改变大小的问题.程序移植遇到不同分辨率显示器就可能产生显示不全的问题.基于CFormView的派生类可以解决这个问题.
二.单文档应用程序使用:
两种方法.
第一种是在创建单文档应用程序过程中直接将派生于CView类的CXXXView类的基类修改为CFormView,除了经典的文档视类结构之外,MFC将额外生成一个对话框资源,ID为"IDD_XXX_FORM".同时,该对话框通过枚举与"CXXXView"类关联.
- //View类派生于CFormView
- class CSDITestView : public CFormView
- {
- protected: // 仅从序列化创建
- CSDITestView();
- DECLARE_DYNCREATE(CSDITestView)
- public:
- //主对话框与类关联
- enum{ IDD = IDD_SDITEST_FORM };
第二种方法:已经按照默认流程创建完单文档应用程序了之后再创建基于CFormView类的对话框时最好不要手动修改CXXXView的基类为CFormView,再手动添加一个对话框.
而是要通过以下步骤实现:
1.新建一个单文档应用程序.
2.菜单栏”项目”选择”类向导”,在”添加类”弹出式对话框中输入类名,”基类”选择为”CFormView.
3.在单文档应用程序的CXXXApp的实现文件顶部添加”#include ‘新类的头文件名’”.
4.在CXXXApp类的”InitInstance()”函数的”CSingleDocTemplate”类型(注册应用程序的文档模板,文档模板将用作文档,框架窗口和视图之间的连接)连接视类时,将视类替换为我们新添加的CFormView类派生的对话框类.
- // 注册应用程序的文档模板。文档模板
- // 将用作文档、框架窗口和视图之间的连接
- CSingleDocTemplate* pDocTemplate;
- //pDocTemplate = new CSingleDocTemplate(
- // IDR_MAINFRAME,
- // RUNTIME_CLASS(CSDITestDoc),
- // RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
- // RUNTIME_CLASS(CSDITestView));
- pDocTemplate = new CSingleDocTemplate(
- IDR_MAINFRAME,
- RUNTIME_CLASS(CSDITestDoc),
- RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
- RUNTIME_CLASS(CSDIFormDlg));
接下来就可以像操作对话框应用程序一样直接操作单文档应用程序了.需要注意的是CFormView派生类没有"OnInitDialog"函数.对话框的初始化(或者说习惯开始函数)可以放在"OnInitialUpdate"中完成.
三.多文档应用程序中实现两个对话框以选项卡的方式显示.
1.按照上述方法创建两个派生于CFormView的对话框.
2.为了让不同的选项卡显示不同的名字,可以在字符串表(string table)里新建一个字符串资源以备使用.如下图所示.
3.将"CXXXApp"类的CMDITestApp::InitInstance()函数中的pDocTemplate修改为该类的成员变量.并且新加一个相同类型的成员变量.
- public:
- CMultiDocTemplate* pDocTemplate;
- CMultiDocTemplate* pChildDocTemplate;
5.测试此时还是不能同时打开两个对话框.需要注释掉程序自动生成的新建文件函数,重载本类的新建文件函数
- //注释掉默认的文件新建函数
- //ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
- ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)
- //重载使用自己的文件新建函数
- ON_COMMAND(ID_FILE_NEW, &CMDITestApp::OnFileNew)
- void CMDITestApp::OnFileNew()
- {
- // TODO: 在此添加命令处理程序代码
- pDocTemplate->OpenDocumentFile(NULL);
- pChildDocTemplate->OpenDocumentFile(NULL);
- }
---------------------------------------------------------------------------------------
notes:
1.在单文档应用程序的CXXXApp中新加入的头文件中,需要加入:#include "Resource.h",才可以使用ID
2.可以选择新建对话框类型