模块化的开发,将模块合并到一起的时候,遇到了Mdi不能添加到其它窗口下的问题。

分两种情况:

将mdi窗口A设成普通窗口B的子控件,需要将A的TopLevel设置成false,但是Mdi窗口的TopLevel必须为顶级;

将mdi窗口A设成mdi窗口B的子窗口,A.MdiParent = B,编译时不通过,窗口不能既是mdi子级,又是mdi父级。

最后通过windows Api强制将mdi窗口A的parent设置成窗口B。

[DllImport("user32.dll", EntryPoint = "SetParent")]
public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);MDIParent1 form = new MDIParent1();
SetParent(form.Handle, this.Handle);
form.Location = new Point(0, 0);
form.Size = this.Size;
form.Show();

通过SetParent将mdi窗口强行放到了普通的Form下。

调试的时候,界面上达到了预期的目标,但是发现了另一个新的问题。

焦点在mdi的子窗口上时,mdi窗口上的控件无效,点击事件全部触发不了;焦点在mdi的父窗口上时,mdi窗口的控件又“激活”了。而在单独打开mdi窗口时,完全不存在这个问题。

查询了一下msdn里面的SetParent的说明,发现了如下段:

“For compatibility reasons, SetParent does not modify the WS_CHILD or WS_POPUP window styles of the window whose parent is being changed. Therefore, it is not possible to change a window from parent to child or from child to parent.”

我的理解是,虽然用SetParent强制将普通窗口设置成mdi的父窗口,但是mdi的子级窗口的属性却没有赋予。

解决的思路,调用另一个windows·Api SetWindowLong强制修改mdi的窗口属性。

private const int GWL_STYLE = -16;
private const int WS_CHILD = 0x40000000;//设置窗口属性为child

[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
public static extern int GetWindowLong(IntPtr hwnd, int nIndex);[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
public static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);var s = GetWindowLong(form.Handle, GWL_STYLE);
SetWindowLong(form.Handle, GWL_STYLE, s | WS_CHILD);

至此,问题算解决了。发一个效果图:

补充一个bug:虽然解决了mdiParent获取焦点的问题,后来发现mdiChild获取焦点又不正常了。如果mdiChild,如上图中的Form2界面上有TextBox控件时,修改TextBox的文字时,光标的位置,总是不正常。能力有限,尚待解决。

转载注明出处:http://www.cnblogs.com/icyJ

C# 将MDI窗口嵌入普通窗口相关推荐

  1. Windows核心编程_将窗口嵌入到桌面图标下面不被遮挡 spy 分析过程

    近年很流行动态视频桌面,实则上早期的windows vista系统上有一个Windows DreamScene软件将桌面壁纸设置成视频,但是是收费的! 首先先来观察一下Windows桌面的组成单元: ...

  2. 将GLFW窗口嵌入Win32 SDK窗口及其多线程渲染方法

    这篇文章(MFC单文档视图中嵌入GLFW窗口)提到了glfw嵌入mfc的办法,采用的查找进程PID再嵌入的方法,进程间通信采用UDP,略微繁琐. 其实不必如此麻烦,SetParent直接就可以办到. ...

  3. Mplayer 嵌入Qt 窗口 制作播放器(嵌入方法)

    众所周知 Mplayer 播放有 -wid + 窗口句柄 的指令,可以让Mplayer嵌入指定窗口播放. 因此只有利用该指令就可以让Mplayer在Qt指定的窗口或控件播放视频, 实现平台 Ubunt ...

  4. 【原创】A进程窗口嵌入到B进程窗口中显示

    做了一个把A应用程序嵌入到B应用程序中显示的Demo,源码: //在B应用启动时创建A进程 CreateProcess(_T("A.exe"),NULL,NULL,NULL,FAL ...

  5. linux把终端嵌入桌面,在Ubuntu Linux桌面上嵌入终端窗口

    除了Tilda 和 Yakuake 终端具有嵌入桌面的效果之外,使用 Devil's Pie 这个小程序你同样可以将终端窗口嵌入到你的 Linux 桌面. 下面就以 GNOME Terminal 为例 ...

  6. 在你的 Linux 桌面嵌入终端窗口

    Toy Posted in Apps 除了我们已经介绍过的 Tilda 和 Yakuake 终端具有嵌入桌面的结果之外,运用 Devil's Pie 这个小步伐你异样可以将终端窗口嵌入到你的 Linu ...

  7. C#MDI窗体实现多窗口效果

     C#MDI窗体实现多窗口效果   Visual C#是微软公司推出的下一代主流程序开发语言,他也是一种功能十分强大的程 序设计语言,正在受到越来越多的编程人员的喜欢.在Visual C#中,提供 ...

  8. python任务栏_Python 将窗口嵌入到任务栏,在任务栏显示文本

    效果展示 image.png 任务栏简介 首先,大致了解以下Windows的任务栏,任务栏实质上是一个容器(类名为"Shell_TaryWnd"),在这个容器中有个二级容器(类名为 ...

  9. 易语言大漠把游戏窗口嵌入辅助窗口

    我们为了辅助操作的更加精准,让游戏的进程隐藏在我们的辅助里,我们可以把游戏窗口嵌入到我们的辅助里面.下面是演示视频和截图 把游戏窗口嵌入辅助窗口 说明 1.首先获取游戏的句柄 2.可以后台绑定也可以前 ...

  10. 将OSG嵌入QT窗口系统中,实现拖拽界面

    将OSG嵌入QT窗口系统中,实现拖拽界面 一.原理 OSG底层使用的是OpenGL图形系统,QT也增加了对OpenGL的支持,因此,可以通过QT的OpenGL模块,实现将OSG窗口嵌入到QT中,这样可 ...

最新文章

  1. windows下二进制mysql的卸载以及安装教程
  2. python队列join
  3. Java中JMX管理器的作用,项目中有什么具体使用?
  4. 游戏设计模式实操经验:游戏结算功能实现的两个要点
  5. JAVAWEB企业级开发关于Tomcat的安装和配置
  6. CentOS 6.6系统安装
  7. Vulkan::0.0::开始于VulKanSDK(Getting Started with the Vulkan SDK)
  8. html5画布实现公司印章效果
  9. 想自学单片机和c语言,单片机想入门应该怎么学?请记住以下几点
  10. RouterOS(ROS)设置动态域名(DDNS)
  11. Invalid prop:type check failed for prop“value“.Expected String with value“8“,got Number with value 8
  12. Hbase、Kudu和ClickHouse横向对比
  13. Java50道经典编程题:(十三)数字谜题 ——循环语句及判断符的使用
  14. Asterisk电子传真-5
  15. 计算机server无法启动服务,win7不能启动server服务提示错误1068的解决方法
  16. 5G NR标准 第4章 LTE概述
  17. 人工智能,离我们还远么?
  18. 很火的微信聊天界面个性签名设置方法,除了好看更重要的是...
  19. 黑衣人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三十四)
  20. Vue使用echarts做两个数据对比

热门文章

  1. C++链接和运行相关错误
  2. 二叉树三种遍历非递归算法
  3. eclipse导入github项目(踩多个坑后发现这个最实用)
  4. c++两个文档匹配数据_MongoDB 数据库的命名、设计规范
  5. java set collection_Java的Collection接口和Set接口?
  6. android.mk ndk编译选项优化,Android NDK(ARM开发)使用NEON优化 - Fla
  7. 《Android群英传》— Android 书籍
  8. 一步一步教你如何安装Dart
  9. Echarts 地图绘制
  10. JS自动让手机调出软键盘,进行输入