2015.12.14 MDI(多文档窗口结构)设置基本解决,折腾一天,部分解决存在已久的问题。但效果仍不如临时航线的MDI窗体结构。
创建从一个窗口弹出多个子窗口的结构叫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窗体结构。的更多相关文章
- Qt 的MDI 多文档窗口
一.MDI简介 MDI就是多文档界面(Multi-document Interface,MDI)应用程序 MDI就是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并共享主窗口 ...
- Word2003文档窗口分成上下两个独立的窗口
http://www.officezu.com/word/2003/index16.html 拆分窗口就是把一个Word2003文档窗口分成上下两个独立的窗口,从而可以通过两个Word2003文档窗口 ...
- 打开word文档总是自动弹出控件工具条的解决办法:
打开word文档总是自动弹出控件工具条的解决办法:1.查看是否word文档和模板中了'apmp宏病毒,按ALT+F11组合键,双击当前文档下属的ThisDocument,清空里面的内容:双击Norma ...
- Pycharm新建文档的模板设置
下图演示的是关于python的文档的模板设置! 这样,以后的每一个新建的python的py文件,开头都会有下图中的两句:解释器路径与编码方式 步聚5的第二行内容打错了,应该是utf: #!/usr/b ...
- hbase0.96与hive0.12整合高可靠文档及问题总结
本文链接:http://www.aboutyun.com/thread-7881-1-1.html 问题导读:1.hive安装是否需要安装mysql?2.hive是否分为客户端和服务器端?3.hive ...
- ABBYY FineReader 14创建PDF文档功能解析
使用ABBYY FineReader,您可以轻松查看和编辑任何类型的 PDF,真的是一款实至名归的PDF编辑转换器,您知道的,它能够保护.签署和编辑PDF文档,甚至还可以创建PDF文档,本文和小编一起 ...
- 图文详细解说DevExpress 2015新版亮点【附文档下载】
历时两个月,翻译自官网的更新说明文档,最后整理成册,文末附PDF地址. DevExpress 在今年6月份发布了正式的2015版本,2015在旧版基础上有明显的升级改进,尤其是DevExtreme.W ...
- ABBYY FineReader 12 能够识别哪些文档语言
ABBYY FineReader可以识别单语言文本和多语言文本(如使用两种及以上语言).对于多语言文本,需要选择多种识别语言. 要为文本指定一种 OCR 语言,请从主工具栏或任务窗口的文档语言下拉列表 ...
- 关于MDI多文档程序的一些思考
MDI程序的框架 客户窗口是一个预定义的窗口类(MDICLIENT),它是框架窗口的子窗口同时也是各个子文档窗口的父窗口.框架窗口和各个子文档窗口都是自定义的窗口类. MDI程序中的一些要点 窗口中的 ...
随机推荐
- 增强织梦DedeCMS“更新系统缓存”清理沉余缓存的功能
我们使用织梦DedeCMS系统有很长一段时间后,不间断的在后台更新系统缓存的时候,有些缓存文件夹及缓存文件没有被清理,导致日积月累的垃圾缓存文件越来越多,可以以百千万计算,现在增强更新系统缓存功能清理 ...
- CSDN_帖子__WapPc
CSDN的帖子,Wap版 和 PC版 网址对应关系: 1. 举个例子: 手机版的网址: http://bbs.csdn.net/wap/topics/391891319 PC版的网址: http:// ...
- 理解collate Chinese_PRC_CI_AS
我们在create table时经常会碰到这样的语句,例如:password nvarchar(10)collate chinese_prc_ci_as null,那它到底是什么意思呢?不妨看看下面: ...
- spring: 在Spring应用中使用JDBC(使用profiles选择数据源/使用基于JDBC驱动的数据源)
在实际开发过程中有很多持久化技术可供选择:Hibernate.iBATIS和JPA等.尽管如此,还是有很多应用使用古老的方法即JDBC技术,来访问数据库. 使用JDBC技术不需要开发人员学习新的框架, ...
- 有关linux下redis overcommit_memory的问题,有需要的朋友可以参考下。
我在安装redis-4.0.6后,启动时出现一些问题,如下: :M Jan ::! Background save may fail under low memory condition. To fi ...
- 命令——WPF学习之深入浅出
WPF学习之深入浅出话命令 WPF为我们准备了完善的命令系统,你可能会问:“有了路由事件为什么还需要命令系统呢?”.事件的作用是发布.传播一些消息,消息传达到了接收者,事件的指令也就算完成了,至于 ...
- 目标检测 — 计算IOU
1.IOU=交集/并集 #include<iostream> #include<algorithm> #include<stdio.h> #include < ...
- 51nod 1281 二分
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1281 隐藏话题 1281 山峰和旗子 题目来源: Codility 基准 ...
- NoSQL四种——kv存储(memcache,Riak),列存储(Cassandra,Hbase),文档类(mongoDB,CouchDB),图数据库(neo4j)
见:https://software.intel.com/sites/default/files/Configuration_and_Deployment_Guide_for_Cassandra_on ...
- 【.Net】关于内存缓存的一点记录
引言 最近看了内存缓存的一些介绍和用法,在此做个简单记录. MemoryCache 类 MemoryCache 类是.Net 4.0推出的类库,主要是为了方便在Winform和Wpf中构建缓存框架的. ...