CFormView类的用法举例一二

一.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类派生的对话框类.

5.编译通过运行之后发现对话框可以在单文档一启动就显示了.

	// 注册应用程序的文档模板。文档模板
	// 将用作文档、框架窗口和视图之间的连接
	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;
4.新增的文档模板将第二个对话框与框架和文档连接起来.与pDocTemplate连接方法一致.函数的第一个参数可以设置为步骤2新建的那个字符串资源.

5.测试此时还是不能同时打开两个对话框.需要注释掉程序自动生成的新建文件函数,重载本类的新建文件函数

	//注释掉默认的文件新建函数
	//ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
	ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)
	//重载使用自己的文件新建函数
	ON_COMMAND(ID_FILE_NEW, &CMDITestApp::OnFileNew)
6.重载的文件新建函数中内容如下.

void CMDITestApp::OnFileNew()
{
	// TODO: 在此添加命令处理程序代码
	pDocTemplate->OpenDocumentFile(NULL);
	pChildDocTemplate->OpenDocumentFile(NULL);

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值