在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. 探究C# dynamic动态类型本质

    本周在做接口动态传参的时候思考了个问题:如何把一个json字符串,转成C#动态类? 比如由 { 'userId': 100, 'id': 1, 'title': 'hello world', 'com ...

  2. Obsidian 设置快捷键 Ctrl+Shift+J 打开OB(未启动则启动,启动未激活则激活,已激活则最小化)- autoHotKey

    Obsidian 设置快捷键 Ctrl+Shift+J 打开OB(未启动则启动,启动未激活则激活,已激活则最小化)- autoHotKey 需求 将Obsidian作为主笔记软件使用,设置个快捷键,配 ...

  3. 基于DSP的光纤麦克风声音采集系统硬件设计方案总结

    前记  光纤声传感器是一种利用光纤作为传光介质或探测单元的一类声传感器,相比传统电声传感器其具有灵敏度高.频带响应宽.抗电磁干扰等优越特性,可广泛应用于国防安全.工业无损检测.医疗诊断及消费电子等领域 ...

  4. 求给定两个排序好的数组中第k大的数

    这个问题比求两个长度相等的排序数组的上中位数难度要高一点,难就难在不是求中位数了,但是我们要学会举一反三,可以尝试通过分析将求第k大的数转化为求中位数.将数组中不可能的数排除,在剩下可能的数中求中位数 ...

  5. 【leetcode 952. 按公因数计算最大组件大小】【欧拉筛+并查集】

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; class Solution { List< ...

  6. 专访OV季军|毕业转为freelancer,他如何斩获大量CG奖项?

    "新锐先锋,玩转未来"--首届实时渲染3D动画创作大赛由瑞云科技主办,英伟达.青椒云.3DCAT实时渲染云协办,戴尔科技集团.Reallusion.英迈.万生华态.D5渲染器.中视 ...

  7. Kotlin 协程基础使用学习

    原文: Kotlin 协程基础使用学习-Stars-One的杂货小窝 本篇阅读可能需要以下知识,否则可能阅读会有些困难 客户端开发基础(Android开发或JavaFx开发) Java多线程基础 ko ...

  8. C++ malloc、calloc、realloc

    1. malloc 函数原型: extern void *malloc(unsigned int num_bytes); 如果分配成功:则返回指向被分配内存空间的指针,不然返回指针NULL .同时,当 ...

  9. 从零开始写 Docker(九)---实现 mydocker ps 查看运行中的容器

    本文为从零开始写 Docker 系列第九篇,实现类似 docker ps 的功能,使得我们能够查询到后台运行中的所有容器. 完整代码见:https://github.com/lixd/mydocker ...

  10. Oracle 几种行转列的方式 sum+decode sum+case when pivot

    原始数据: 方式一: select t_name, sum(decode(t_item, 'item1', t_num, 0)) item1, sum(decode(t_item, 'item2', ...