利用非模窗口生成MDI介面

2016-01-29 11:58 10 1 收藏

利用非模窗口生成MDI介面,利用非模窗口生成MDI介面

【 tulaoshi.com - C语言心得技巧 】

利用非模窗口生成MDI界面

作者:Kelvin

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载源代码

  我想生成一个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 onlyCMainFrame();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 两个函数中处理标题栏。

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


图一 图像描述

来源:http://www.tulaoshi.com/n/20160129/1484052.html

延伸阅读
软件界面生动与否很大程度上决定于你对窗口的设计和控制。事实上,Windows程序员可以对系统中的任何窗口进行操纵,它意味着,Windows程序员可以直接操纵任何正在运行的应用窗口;可以发现一个特定的应用是否在运行,如果该应用没有运行还可以启动它;可以重新排列屏幕上的所有窗口;还可以使其他应用的窗口最大化或最小化。下面我们探讨一种十分...
标签: Java JAVA基础
  问题的由来 前不久做了一个通过JSP生成PDF报表的小项目,算得上开了一次眼界。企业的一些信息通过网络形成Html报表,虽然IE可以直接打印显示在其中的内容,但是从界面上来看,如果直接将Html的显示结果打印出来,显得不太美观。如果将它转成PDF文件再打印,则打印效果会好很多。 iText简介 iText是一个开放源码的Java类...
利用窗口光线拍出人像作品 人像摄影诞生之初,摄影师们就开始运用窗口射进来的优美光线充当作品中的主要光源。窗口光线既柔和,又有明确的方向性。调整被摄对象与窗口之间的关系,我们就能直观的体会到窗口光线的这一特点。既拥有柔和的光线特性,同时又能烘托出人物面部的细节起伏。 下图所示为一幅标准的使用窗口光线拍摄的人像。...
C++ At Work 专栏... 计算MDI子窗口数,仅显示文件夹的打开对话框 原著:Paul DiLascia 翻译:NorthTibet 下载源代码:CAtWork0506.exe (195KB) 原文出处:Counting MDI Children, Browsing for Folders 本文发布后内容有更新,详情参见文章的“编辑更新” 计算 MDI 子窗口数 ...
标签: 电脑入门
QQ是目前国内最多用户使用的聊天软件之一,每当我们每次登录QQ时,软件都系自动弹出“腾讯迷你首页”,以方便用户查看当天的焦点新闻。但是并不是所有用户都喜欢自动弹出的窗口,如果你是QQ会员,那么可以关闭自动弹出迷你首页的。 那么非QQ会员就不可以了吗?答案当然不是啦。 非QQ会员其实可以通过借助QQ会员实现关闭“自动弹出迷你...

经验教程

517

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部