在MDi窗体嵌入子窗体后不显示菜单栏

背景:

由于之前做的一个程序的功能全部都是放在一个界面上的,有一个功能能够在数据库查询数据,并返回到界面上,数据量比较小的时候还好,但是数据量多了,导致它阻塞的其他线程,经过一系列讨论之后,决定将一个界面换成一个主界面加多个子界面。

实施:

多个子界面迁移完成之后,使用下面的方法将其放置的主界面中(先将主窗体的IsMdiContainer设置为true,不然会报错)

Form frm = new SssForm();
foreach (Form childForm in MdiChildren)
{
if (childForm != CccForm)
{
childForm.Close();
}
}
this.CccForm.Visible = false;
frm.MdiParent = this;
frm.Show();
frm.WindowState = FormWindowState.Maximized;

然后在主窗体和子窗体的属性那里把ControlBox属性设置为false,然后测试发现主窗体一开始是没有菜单栏的,但是打开子窗体之后就会在主窗体的右上角显示出菜单栏

查阅了一些网上的办法去改变其他属性值,但是测试之后发现没有用,有说用pannel的,但是我的这个程序需要在Mdi中实现,就没有去实践了,后面就去问gpt4了,最后用gpt4给的方法实现了

这个方法是重写WndProc,在获取到子窗体需要重新计算大小时,直接告诉系统我们只需要计算工作区,而不需要把菜单栏加入进来,这里微软的官方文档里面也有写到(https://learn.microsoft.com/zh-cn/windows/win32/winmsg/wm-nccalcsize)

以下是代码实现:

protected override void WndProc(ref Message m)
{
const int WM_NCCALCSIZE = 0x0083;
const int WM_NCHITTEST = 0x0084; switch (m.Msg)
{
case WM_NCCALCSIZE:
// 当窗体的大小需要重新计算时,系统会发送WM_NCCALCSIZE消息
// 这里可以修改消息的处理,以改变窗体非客户区的大小
// 如果wParam是TRUE(非零),则指示客户区大小需要重新计算
// 通过简单地返回0,我们可以告诉Windows我们已处理消息,不需要默认的非客户区
// 这实际上会移除所有的非客户区,包括边框和标题栏
if (m.WParam.ToInt32() != 0)
{
// 返回0表示我们处理了这个消息,不再需要默认的处理
// 这将去除非客户区,包括标题栏和边框
m.Result = IntPtr.Zero;
return;
}
break;
case WM_NCHITTEST:
// 可以在这里处理鼠标事件,例如检测鼠标是否在我们自定义的标题栏区域内
// 这对于添加拖动行为等自定义交互是有用的
base.WndProc(ref m);
if ((int)m.Result == 0x01) // HTCLIENT
{
// 可以修改m.Result来改变鼠标的行为,例如使其支
// m.Result = (IntPtr)2; // HTCAPTION 表示标题栏,允许拖动窗体
}
return;
}
base.WndProc(ref m);
}

然后根据我想要的功能给它简单的优化了一些

protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0083 && m.WParam.ToInt32() != 0)
{
m.Result = IntPtr.Zero;
return;
}
base.WndProc(ref m);
}

效果图:

winform之在主窗体中不显示子窗体的菜单栏的更多相关文章

  1. 接下来将介绍C#如何设置子窗体在主窗体中居中显示,本文提供详细的操作步骤,需要的朋友可以参考下

    接下来将介绍C#如何设置子窗体在主窗体中居中显示,本文提供详细的操作步骤,需要的朋友可以参考下 其实表面上看是很简单的 开始吧,现在有两个窗体Form1主窗体,Form2子窗体 而且我相信大部分人都会 ...

  2. Winform中如何实现父窗体传递数据到子窗体并刷新子窗体

    原理:利用委托和事件,本文将以图文并茂的例子讲述,告诉我们So Easy --------------------------------------------------------------- ...

  3. winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体

    winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...

  4. Winform中如何实现子窗体刷新父窗体

    原理:利用委托和事件,本文将以图文并茂的例子讲述,告诉我们So Easy --------------------------------------------------------------- ...

  5. 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体

    在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage();   ...

  6. Delphi中实现MDI子窗体(转)

        Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容  ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一 ...

  7. C# WinForm 解决子窗体放大后,子窗体图标放大的问题

    解决子窗体放大后,子窗体的图标占用主窗体的菜单栏的问题. C#子窗体最大化时, 那个图标跑到主窗体的前面去了, 造成界面不统一也不美观. 所以需要进行处理, 只要有主窗体的菜单ItemAdded事件中 ...

  8. WPF 子窗体关闭时显示父窗体

    这个问题纠结了两天,今天在一个朋友的帮助下,解决了,其实很简单,但是可能作为新手,接触WPF时间还是短,因此作为一个问题困扰了我. 父窗体部分代码 private void EditInformati ...

  9. Delphi - 子窗体继承父窗体后如何显示父窗体上的控件

    1.创建子窗体Form1 File -> New -> Form,新建一个form,在form的单元文件中修改 2.子窗体中引用父窗体单元 uses TFatherForm 3.将子窗体中 ...

  10. window.open 打开子窗体,关闭全部的子窗体

    需求:通过window.open方法打开了子窗体,当关闭主窗体时.子窗体应当也关闭. 实现思路: 1.打开子窗体函数window.open(url,winName)的第二个參数winName能够唯一标 ...

随机推荐

  1. Springboot中-全局异常处理类用法示例

    使用springboot搭建web项目的时候,一般都会添加一个全局异常类,用来统一处理各种自定义异常信息, 和其他非自定义的异常信息,以便于统一返回错误信息.下面就是简单的示例代码, 自定义异常信息. ...

  2. python 判断bytes是否相等的几种方法

    一 前言: python判断bytes是否相等,一般要用到这几种方法:is,==,operator.下面做几个例子让大家看一下. 二 正文: 1 相等方法: test1=b'0xab' test2=b ...

  3. day04-Java基础语法

    Java基础语法 1.注释 注释不会被执行,是用来给写代码的人看的. 1.1单行注释 单行注释只能注释一行文字 // 注释 1.2多行注释 多行注释可以注释多行文字 /* 注释 注释 注释 */ 1. ...

  4. day06-SpringMVC底层机制简单实现-02

    SpringMVC底层机制简单实现-02 https://github.com/liyuelian/springmvc-demo.git 4.任务3-从web.xml动态获取容器配置文件 4.1分析 ...

  5. 一个简单的RTMP服务器实现 --- RTMP实现要点

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  6. 【2012 Asia ChangChun Regional Contes】 [Math Magic] 动态规划

    题目链接: https://acm.hdu.edu.cn/showproblem.php?pid=4427 解法: 题目m范围较小$m\leq 1000$,n 范围也较小 $n\leq 1000$, ...

  7. vim的使用进步

    vim的使用进步 1.如果遇到命令行中无法退出的 狂按esc按键 或者也可以使用v模式下切换一下,之后按esc 保存退出 保存退出--:wq 保存:w 不保存退出:q! i--插入模式 v- 可视化模 ...

  8. AI助力快速定位数据库难题

    最近很多人都在讨论AI能否替代人类工作的话题,最近笔者正好遇到一个AI帮自己快速定位问题的实例,分享给大家,一起来切身感受下AI对于解决数据库问题的价值吧. 事情的经过是这样,有个朋友咨询我,说他最近 ...

  9. FFmpeg开发笔记(七)欧拉系统编译安装FFmpeg

    FFmpeg支持Linux.macOS.Windows.Android等操作系统,其中Linux系列包括Ubuntu.Debian.Mint.CentOS.RHEL.Fedora等分支.FFmpeg官 ...

  10. verilog模型概述

    模型功能 verilog是硬件描述语言的一种,主要用于ASIC和FPGA中,用于实现数字逻辑控制. 相较于VHDL,verilog的语法更加接近C语言,格式也更加宽松,具备更强的灵活性. 模型框图 v ...