winform之在主窗体中不显示子窗体的菜单栏
在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之在主窗体中不显示子窗体的菜单栏的更多相关文章
- 接下来将介绍C#如何设置子窗体在主窗体中居中显示,本文提供详细的操作步骤,需要的朋友可以参考下
接下来将介绍C#如何设置子窗体在主窗体中居中显示,本文提供详细的操作步骤,需要的朋友可以参考下 其实表面上看是很简单的 开始吧,现在有两个窗体Form1主窗体,Form2子窗体 而且我相信大部分人都会 ...
- Winform中如何实现父窗体传递数据到子窗体并刷新子窗体
原理:利用委托和事件,本文将以图文并茂的例子讲述,告诉我们So Easy --------------------------------------------------------------- ...
- winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体
winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...
- Winform中如何实现子窗体刷新父窗体
原理:利用委托和事件,本文将以图文并茂的例子讲述,告诉我们So Easy --------------------------------------------------------------- ...
- 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体
在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体 在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage(); ...
- Delphi中实现MDI子窗体(转)
Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容 ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一 ...
- C# WinForm 解决子窗体放大后,子窗体图标放大的问题
解决子窗体放大后,子窗体的图标占用主窗体的菜单栏的问题. C#子窗体最大化时, 那个图标跑到主窗体的前面去了, 造成界面不统一也不美观. 所以需要进行处理, 只要有主窗体的菜单ItemAdded事件中 ...
- WPF 子窗体关闭时显示父窗体
这个问题纠结了两天,今天在一个朋友的帮助下,解决了,其实很简单,但是可能作为新手,接触WPF时间还是短,因此作为一个问题困扰了我. 父窗体部分代码 private void EditInformati ...
- Delphi - 子窗体继承父窗体后如何显示父窗体上的控件
1.创建子窗体Form1 File -> New -> Form,新建一个form,在form的单元文件中修改 2.子窗体中引用父窗体单元 uses TFatherForm 3.将子窗体中 ...
- window.open 打开子窗体,关闭全部的子窗体
需求:通过window.open方法打开了子窗体,当关闭主窗体时.子窗体应当也关闭. 实现思路: 1.打开子窗体函数window.open(url,winName)的第二个參数winName能够唯一标 ...
随机推荐
- TR069-STUN
原理 1.NAT穿越技术,为了解决NAT设备对P2P网络的通信限制 2.作用:检测网络中是否存在NAT设备,并获取两个通信端点经NAT设备分配的IP地址和端口号,然后建立一条可穿越NAT的P2P链 ...
- 【数据结构】哈夫曼树与哈夫曼编码(Huffman Encoding)
一.背景 编码是信息处理的基础(重新表示信息). 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度.但其在传输和存储等情况下编码效率不高. 可使用不等长编码,来 ...
- Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
有个需要是需要在安装包安装初始化时安装 Microsoft Visual c++ 2013 Redistributable 也就是判断软件安装前需不需要运行 vcredist_x64.exe 和 VC ...
- 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第6章
本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录
- 一文搞懂JavaEE的接口
在Java EE(Java Enterprise Edition)开发环境中,编程意义上的"接口"(interface)和API接口虽然都涉及接口的概念,但它们属于不同层面的术语. ...
- 解决maven编译错误:程序包com.sun.xml.internal.ws.spi不存在
转自https://blog.csdn.net/mn960mn/article/details/51253038 解决方法如下: 添加maven-compiler-plugin插件,并且配置compi ...
- bram_to_vid
Entity: bram_to_vid File: bram_to_vid.v Diagram Description Company: Fpga Publish Engineer: FP Revis ...
- Linux开启SSH连接
1. 查看是否安装 openssh-server:yum list installed | grep openssh-server 已安装成功,如下图 2.如果没有任何输出显示表示没有安装openss ...
- Scala选择分支if else
1 package com.atguigu.chapter03 2 3 import scala.io.StdIn 4 5 /** 6 * Scala 中 if else 表达式其实是有返回值的,具体 ...
- #网络流,二分#洛谷 3324 [SDOI2015]星际战争
题目 分析 二分答案,然后建图判断可行性 代码 #include <cstdio> #include <cctype> #include <queue> #defi ...