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程序中的一些要点 窗口中的 ...
随机推荐
- 进程【TLCL】
ps命令 ps x 加上 "x" 选项(注意没有开头的 "-" 字符),告诉 ps 命令,展示所有进程,不管它们由什么 终端(如果有的话)控制. 在 TTY 一 ...
- BZOJ3242/UOJ126 [Noi2013]快餐店
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 碰到错误Could not load the Tomcat server configuration at \Servers\MyEclipse Tomcat v8.5-config. The Servers project is closed.
本人用的myeclipse是2017版. 可能解决的方法是: 双击MyEclipse Tomcat v8.5,然后就会弹出以下窗口,
- [thinkphp使用phpspreadsheet时出现]Cannot redeclare xxxxxx() (previously declared in C:\WWW\xxx.xxx:xxx)
[thinkphp使用phpspreadsheet时出现]Cannot redeclare xxxxxx() (previously declared in C:\WWW\xxx.xxx:xxx) 一 ...
- Java map简介
了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试· Oracle JDeveloper 10g jav ...
- hdu 1849 Rabbit and Grass(nim)
Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- eclipse配置lombok
原文:http://wsj356428476.iteye.com/blog/1655032 1.下载Lombok.jar https://projectlombok.org/ 2.运行Lombok.j ...
- vue配置stylus
首先Vue-init webapck 随便一个name vue项目创建好之后 cnpm i (利用淘宝镜像) cnpm i stylus stylus-loader -D 进行安装和配置 styl常 ...
- ImageSwitcher的简单使用
测试代码: activity_main.xml: <?xml version="1.0" encoding="utf-8"?> <Linear ...
- BEC listen and translation exercise 12
More than 220 cities now have air quality monitoring systems and 42 others will have systems in plac ...