当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 利用非模窗口生成MDI介面

VC++
几个数字信号处理算法程序
简易软盘镜像工具的实现及操作系统编写初步
教你使用正则表达式
C++ 扩展和嵌入 Python
拷贝构造和赋值操作符,C#和本机 C++ 代码的互用性
精通VC与Matlab联合编程(六)
精通VC与Matlab联合编程(五)
一个排序用的C++函数模板
浅析VC与MATLAB联合编程
C++编译器如何实现异常处理
文件重定义冲突的分析与解决
一步一步实现MFC扩展DLL中导出类和对话框
C宏:智者的利刃,愚者的恶梦!
引用的作用
《UTF-8与GB2312之间的互换》的改进
程序风格的要素-C++风格指南
VC+6.0实现文本串的自由拆分
怎样给串行化类分配版本号(可配置版本模式)
在常规的编程任务中使用新的 <tuple> 库
使用 typedef 抑制劣质代码

VC++ 中的 利用非模窗口生成MDI介面


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 90 ::
收藏到网摘: n/a

利用非模窗口生成MDI界面

作者:Kelvin

下载源代码

  我想生成一个MDI窗口的界面,但发现用VC实现起来很麻烦,要加很多很多的RUNTIME_CLASS,而且不能实现在主窗口中加入功能选项。就是说生成一个OUTLOOK的主窗口,在主窗口中再加入多文档窗口(象OFFICE的多文档子窗口)。因此,写了这个 CMDIChild 类。效果如图一所示。

要实现本类:

第一步:生成一个单文档程序(基类是CFormView)。
第二步:在工程中加入 MDIChild.H 和 MDIChild.cpp 两个文件。
第三步:在主窗口中加入一个变量 CMDIChild m_Child。

#include "MDIChild.H"class CMainFrame : public CFrameWnd{protected: // create from serialization only	CMainFrame();	DECLARE_DYNCREATE(CMainFrame)	// Attributespublic:	CMDIChild m_Child; ///////////////////////////////	.....} 
第四步:在 OnCreate() 事件中加入m_Child.InitMainWnd(this)。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){	......	RECT Rect;	SetRect(&Rect, 0,64,800, 574); // 非模子窗口的活动区域,没想出自动计算的好办法,	m_Child.InitMainWnd(this, &Rect); //所以只能手工设置。} 
第五步:增加菜单事件
#include "Dlg1.H"void CMainFrame::OnDialog1() {	CDlg1 *pDlg = NULL;	char *sName = "功能1"; ////////////////////////////////	if(!m_Child.GetClassChild(sName))	{	pDlg = new CDlg1;	if(!pDlg) return;	pDlg->Create(IDD_DIALOG1, this);	}	m_Child.ADD((CView*)pDlg, sName);} 
第六步:补充CDlg1是一个CDialog的弹出窗口,将普通弹出窗口转变成非模窗口的方法在网上有很多,这里就不多说了,也可以自己看代码。非模子窗口是用名称进行管理的,就是说可以生成两个基类相同的窗口,但是它们 在 m_Child.ADD 的时候要用不同的名称登记。

技术细节:
  利用非模窗口在弹出时依然响应消息流的特点,程序主要是通过管理主窗和非模子窗口,让它们在得到和失去焦点的时候标题栏依然显示正常。因为,激活非模子窗口时会使主窗口的标题变灰,激活主窗口时非模子窗口也会变灰。要实现这种功能并不困难,但要把这些功能封装成一个类方便使用就比较复杂。我是运用 了 SetWindowLong(hWnd,GWL_WNDPROC,(LONG)MDIChildProc) 来栏截主窗口和非模子窗口的信息。在 MDIChildProc 和 MDIMainProc 两个函数中处理标题栏。

缺点:
  没有想出方便的方法得到主窗口客户区的大小,因此我强制了主窗口始终为最大化,并且需要手工计算出客户区的大小。以后我就不用它了。


图一 图像描述