MDI的几个小技巧

1、MDI启动时无子窗口

找到App类的InitInstance方法,该方法代表了windows应用程序在启动时的初始化任务。用命令行信息类CCommandLineInfo修改程序启动时的命令实现。

	// 分析标准 shell 命令、DDE、打开文件操作的命令行
	CCommandLineInfo cmdInfo;
//	ParseCommandLine(cmdInfo);
	cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

2、MDI启动时子窗口最大化

要修改子窗口的风格,在CChildFrame类的PreCreateWindow函数中实现函数原型为
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
参数cs是要创建窗口的结构信息,对cs进行修改即可。在MDI中cs.style的默认值为WS_CHILD|FWS_ADDTOTITLE|WS_OVERLAPPEDWINDOW。修改方法如下

BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
	if( !CMDIChildWnd::PreCreateWindow(cs) )
		return FALSE;
	cs.style = cs.style | WS_MAXIMIZE | WS_VISIBLE;  //MDI启动时窗口最大化
	return TRUE;
}
3、MDI启动时主窗口最大化

找到App类的InitInstance函数,修改以下信息

	// 主窗口已初始化,因此显示它并对其进行更新
//	pMainFrame->ShowWindow(m_nCmdShow);
	pMainFrame->ShowWindow(SW_MAXIMIZE);
	pMainFrame->UpdateWindow();

4、创建带滚动条的窗体

可以通过修改窗体创建时的style值实现,但实际上MFC有一个继承自CView类的CSrcollView类可以方便的实现带滚动条的窗口。

首先在View.h和View.cpp文件中Ctrl+H将CView全部替换成CScrollView。

然后修改View类的OnInitialUpdate函数,没有的话打开类向导添加这个函数。

在打开图像时也可以继续重载CalWindowRect和OnActivateView使图像适合视图窗口

CalWindowsRect 基于工作区的大小计算窗口大小

GetDocSize是从图像中获得的大小

void CDIPDemoView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CSize sz;
	sz.cx = sz.cy = 1000;  //设置滚动条的大小
	SetScrollSizes(MM_TEXT, sz);
}

	void CDIPDemoView::OnInitialUpdate() 
	{
		CView::OnInitialUpdate();

		// TODO: Add your specialized code here and/or call the base class

	}
	void CDIPDemoView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
	{
		CScrollView::OnInitialUpdate();
		ASSERT(GetDocument() != NULL);

		SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
	}

	void CDIPDemoView::OnActivateView(BOOL bActivate, CView* pActivateView,
		CView* pDeactiveView)
	{
		CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);

		if (bActivate)
		{
			ASSERT(pActivateView == this);
			Invalidate(); //激活该视图时进行重绘
		}
	}

5、重载OnOpenDocument时改变对话框过滤后缀名

其实这点原理也没搞得太懂,就是在MDI程序中对FileOpen添加消息处理函数时,用这种方法并不能打开多个文件,而实际上OnOpenDocument函数已经实现了多文档打开,但是打开对话框上只能显示如下


自己写CFileDialog改变参数不起作用。

后来找到方法就是修改.rc的stringtable中的IDR_XXXTYPE宏,XXX是工程名

stringtable有三项 ID 值 标题

IDR_XXXTYPE的标题是\nXXX\nXXX\n\n\nXXX.Document\nXXX.Document

再第3个\n添加显示文本,在第4个\n添加后缀名即可。

比如\nXXX\nXXX\n文本文档(*.txt)\n.txt\nXXX.Document\nXXX.Document


后来查了下发现其实关键还是在App::InitInstance()里

找到

	// 注册应用程序的文档模板。文档模板
	// 将用作文档、框架窗口和视图之间的连接
	CMultiDocTemplate* pDocTemplate;
	pDocTemplate = new CMultiDocTemplate(
		IDR_BMPTYPE,
		RUNTIME_CLASS(CDIPDemoDoc),
		RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
		RUNTIME_CLASS(CDIPDemoView));
IDR_BMPTYPE是在stringtable里新建的一个对象,对应标题为\nXXX\nXXX\nBMP图像(*.bmp)\n.bmp\nXXX.Document\nXXX.Document

原理部分不是弄得很清楚,找时间看看《深入浅出MFC》

此处见http://hi.baidu.com/ecoiboblpwbijye/item/dd05129bab4375f028164733

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值