创建从一个窗口弹出多个子窗口的结构叫MDI窗体结构

如果不按MDI结构管理,最简单的做法是:

在窗体A上添加菜单或按钮,在菜单或按钮事件中添加弹出B窗体代码:

B b = new B();

b.show()

这样A与B没有任何关系,有多少个弹出窗口任务栏上就有多少个图标,父窗口最小化时其余窗口没有任何变化。这样比较凌乱。

但好处是弹出窗口的位置和大小与父窗口没有约束关系,弹出窗口可以在父窗口之外显示。

稍改进的方法(可能是比下方改进MDI还好的方法)

B b = new B();

b.show(this) //加上this后标明b窗口属于A窗体this,这样A最小化时所有子窗口也会最小化,最小化后任务栏上只有一个图标。且所有子窗口始终在父窗口的前端,不会被其遮挡。但任务栏上还是会有所有子窗口的图标。

要用传统的MDI子窗口处理如下

1、父窗口的isMdiContainer属性设为true(可通过界面设)

2、菜单或按钮事件的子窗口弹出代码写为:

B b = new B();

b. MdiParent = this; //this代表父窗口

b.WindowState = FormWindowState.Maximized;//

b.show()

注意:重要缺陷:可能是VS的bug,所有子窗体都只能在父窗体控件下方显示,如果父窗体上有一个picturebox的图片背景,则所有弹出窗口都会被图片盖住,就像没弹出一样。(折腾我近1个小时才发现)。

3种解决方法:

1、将背景图片设成主窗口的背景,而不用picturebox但这样会产生闪烁,不好看

2、弹出任意子窗口后将picturebox隐藏。

3、用API函数代替b. MdiParent = this。写成API.SetParent(b.Handle,pictureBox1.Handle); 注意:是将子窗体的父窗体设为picturebox而不是A!这对传统MDI窗体来说已经比较完美了,但是如果用了下面的优化MDI效果就不好,只能用方法2

这样就完成了传统MDI窗体的设置,

这样做缺点与优点一样明显。

优点是:所有窗体在任务栏上只有一个图标,所有子窗体最小化后都罗列在父窗体底部(显示最大化、最小化等三个按钮)、所有子窗体都随父窗口一起最消失出现。

缺点只有1个,但很致命:子窗体不能挪出父窗体。对大显示器或多显示器非常不方便。

改进方法:主要解决子窗体无法挪出父窗口的。

思路:子窗体默认最大化,充满父窗口客户区,但点击恢复正常尺寸显示时,退出MDI子窗口模式,使其脱离父窗口尺寸限制,成为独立窗口。

方法:上述MDI设置后,在弹出每个窗体中增加Wndproc回调函数,处理还原显示事件以及最大、最小化事件

在子窗口函数中定义:

const int WM_SYSCOMMAND = 0X112;//274

const int SC_MAXIMIZE = 0XF030;//61488

const int SC_MINIMIZE = 0XF020;//61472

const int SC_RESTORE = 0XF120; //61728

const int SC_CLOSE = 0XF060;//61536

protected override void WndProc(ref Message m)

{

if (m.Msg == WM_SYSCOMMAND)

{

if (m.WParam.ToInt32() == SC_RESTORE) //处理窗体还原事件,将子窗口父窗体设为原父窗口的父窗口,即桌面

{

this.MdiParent = MF.mf.MdiParent;

this.WindowState = FormWindowState.Normal;

System.Drawing.Rectangle rect = SystemInformation.WorkingArea;//获取屏幕工作尺寸

this.Height = rect.Height * 3 / 4;

this.Width = rect.Width * 3 / 4;

this.CenterToParent();

}

if (m.WParam.ToInt32() == SC_MAXIMIZE) //处理窗体最大化最小化事件,还原成MDI模式,同时还要写上最大化、最小化

{

this.MdiParent = MF.mf;

this.WindowState = FormWindowState.Maximized;

}

if (m.WParam.ToInt32() == SC_MINIMIZE)

{

this.MdiParent = MF.mf;

this.WindowState = FormWindowState.Minimized;

}

}

base.WndProc(ref m);

}

2015.12.14 MDI(多文档窗口结构)设置基本解决,折腾一天,部分解决存在已久的问题。但效果仍不如临时航线的MDI窗体结构。的更多相关文章

  1. Qt 的MDI 多文档窗口

    一.MDI简介 MDI就是多文档界面(Multi-document Interface,MDI)应用程序 MDI就是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并共享主窗口 ...

  2. Word2003文档窗口分成上下两个独立的窗口

    http://www.officezu.com/word/2003/index16.html 拆分窗口就是把一个Word2003文档窗口分成上下两个独立的窗口,从而可以通过两个Word2003文档窗口 ...

  3. 打开word文档总是自动弹出控件工具条的解决办法:

    打开word文档总是自动弹出控件工具条的解决办法:1.查看是否word文档和模板中了'apmp宏病毒,按ALT+F11组合键,双击当前文档下属的ThisDocument,清空里面的内容:双击Norma ...

  4. Pycharm新建文档的模板设置

    下图演示的是关于python的文档的模板设置! 这样,以后的每一个新建的python的py文件,开头都会有下图中的两句:解释器路径与编码方式 步聚5的第二行内容打错了,应该是utf: #!/usr/b ...

  5. hbase0.96与hive0.12整合高可靠文档及问题总结

    本文链接:http://www.aboutyun.com/thread-7881-1-1.html 问题导读:1.hive安装是否需要安装mysql?2.hive是否分为客户端和服务器端?3.hive ...

  6. ABBYY FineReader 14创建PDF文档功能解析

    使用ABBYY FineReader,您可以轻松查看和编辑任何类型的 PDF,真的是一款实至名归的PDF编辑转换器,您知道的,它能够保护.签署和编辑PDF文档,甚至还可以创建PDF文档,本文和小编一起 ...

  7. 图文详细解说DevExpress 2015新版亮点【附文档下载】

    历时两个月,翻译自官网的更新说明文档,最后整理成册,文末附PDF地址. DevExpress 在今年6月份发布了正式的2015版本,2015在旧版基础上有明显的升级改进,尤其是DevExtreme.W ...

  8. ABBYY FineReader 12 能够识别哪些文档语言

    ABBYY FineReader可以识别单语言文本和多语言文本(如使用两种及以上语言).对于多语言文本,需要选择多种识别语言. 要为文本指定一种 OCR 语言,请从主工具栏或任务窗口的文档语言下拉列表 ...

  9. 关于MDI多文档程序的一些思考

    MDI程序的框架 客户窗口是一个预定义的窗口类(MDICLIENT),它是框架窗口的子窗口同时也是各个子文档窗口的父窗口.框架窗口和各个子文档窗口都是自定义的窗口类. MDI程序中的一些要点 窗口中的 ...

随机推荐

  1. 增强织梦DedeCMS“更新系统缓存”清理沉余缓存的功能

    我们使用织梦DedeCMS系统有很长一段时间后,不间断的在后台更新系统缓存的时候,有些缓存文件夹及缓存文件没有被清理,导致日积月累的垃圾缓存文件越来越多,可以以百千万计算,现在增强更新系统缓存功能清理 ...

  2. CSDN_帖子__WapPc

    CSDN的帖子,Wap版 和 PC版 网址对应关系: 1. 举个例子: 手机版的网址: http://bbs.csdn.net/wap/topics/391891319 PC版的网址: http:// ...

  3. 理解collate Chinese_PRC_CI_AS

    我们在create table时经常会碰到这样的语句,例如:password nvarchar(10)collate chinese_prc_ci_as null,那它到底是什么意思呢?不妨看看下面: ...

  4. spring: 在Spring应用中使用JDBC(使用profiles选择数据源/使用基于JDBC驱动的数据源)

    在实际开发过程中有很多持久化技术可供选择:Hibernate.iBATIS和JPA等.尽管如此,还是有很多应用使用古老的方法即JDBC技术,来访问数据库. 使用JDBC技术不需要开发人员学习新的框架, ...

  5. 有关linux下redis overcommit_memory的问题,有需要的朋友可以参考下。

    我在安装redis-4.0.6后,启动时出现一些问题,如下: :M Jan ::! Background save may fail under low memory condition. To fi ...

  6. 命令——WPF学习之深入浅出

    WPF学习之深入浅出话命令   WPF为我们准备了完善的命令系统,你可能会问:“有了路由事件为什么还需要命令系统呢?”.事件的作用是发布.传播一些消息,消息传达到了接收者,事件的指令也就算完成了,至于 ...

  7. 目标检测 — 计算IOU

    1.IOU=交集/并集 #include<iostream> #include<algorithm> #include<stdio.h> #include < ...

  8. 51nod 1281 二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1281 隐藏话题 1281 山峰和旗子 题目来源: Codility 基准 ...

  9. NoSQL四种——kv存储(memcache,Riak),列存储(Cassandra,Hbase),文档类(mongoDB,CouchDB),图数据库(neo4j)

    见:https://software.intel.com/sites/default/files/Configuration_and_Deployment_Guide_for_Cassandra_on ...

  10. 【.Net】关于内存缓存的一点记录

    引言 最近看了内存缓存的一些介绍和用法,在此做个简单记录. MemoryCache 类 MemoryCache 类是.Net 4.0推出的类库,主要是为了方便在Winform和Wpf中构建缓存框架的. ...