首页 > 其他分享 >winform之在主窗体中不显示子窗体的菜单栏

winform之在主窗体中不显示子窗体的菜单栏

时间:2024-04-20 15:11:38浏览次数:28  
标签:WndProc 界面 WM 菜单栏 窗体 Result 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);
}

效果图:

标签:WndProc,界面,WM,菜单栏,窗体,Result,winform
From: https://www.cnblogs.com/wuchen9527/p/18147718

相关文章

  • vb.net from窗体接受键盘输入信息
    PublicClassForm1'当窗体初始化时,订阅键盘按下事件PrivateSubForm1_Load(senderAsObject,eAsEventArgs)HandlesMyBase.LoadAddHandlerMe.KeyDown,AddressOfForm1_KeyDownEndSub'键盘按下事件的处理程序PrivateSubForm1_K......
  • Winform 子窗体调用父窗体方法
    子窗体部分1.定义委托///<summary>///双击委托事件///</summary>///<paramname="path"></param>publicdelegatevoidfrmProcessDoubleClick(stringpath);///<summary>///双击最大化点击事件///......
  • 界面组件库DevExpress Office File API(WinForms & WPF)v24.1新功能预览
    本文描述了界面组件库DevExpress的OfficeFileAPI(WinForms&WPF)和受Office启发的控件在v24.1中发布的一些功能,并详细介绍了我们当前的抢先体验预览版本v24.1中的内容。DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress......
  • C#的窗体假关闭操作例子 - 开源研究系列文章
          晚上编码的时候,想到了以前编写的窗体关闭的事情,就是带托盘图标的应用,有一个主显示操作窗体,但是主窗体点击关闭按钮的时候,实际上是窗体隐藏而非真正关闭,这个在其它的一些应用程序里有这个效果。于是就想到了这个例子,记录下来,如果其他读者也有这个问题,那直接复用此例子......
  • C#判断窗体是否被遮挡 - 开源研究系列文章
    https://www.cnblogs.com/lzhdim/p/18122548  上次发布了托盘窗体的显示与隐藏的博文:,但是在测试窗体最大化的时候发现窗体没有隐藏,调试了下知道是窗体是否被遮挡这个函数的判断有问题。于是就研究了该代码,然后联系了该操作类的作者,也是博客园的园友,然后在他的帮助下将操作类进......
  • Winform项目中纯代码创建WCF服务
    接口:[ServiceContract(CallbackContract=typeof(IViewCallback),SessionMode=SessionMode.Required)]publicinterfaceIViewService{[OperationContract]voidServiceTest();}类:[ServiceBehavior(InstanceContextMode=......
  • New!界面控件DevExpress WinForms v24.1预览版抢先体验
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!在之前的文章中(点击这里回顾>>),我们为大家介绍了DevE......
  • C#判断窗体是否被遮挡 - 开源研究系列文章
          上次发布了托盘窗体的显示与隐藏的博文:,但是在测试窗体最大化的时候发现窗体没有隐藏,调试了下知道是窗体是否被遮挡这个函数的判断有问题。于是就研究了该代码,然后联系了该操作类的作者,也是博客园的园友,然后在他的帮助下将操作类进行了更新,添加了特殊窗体的处理代码,这......
  • winform车牌识别源码(纯算法)
    车牌识别,本是图像领域中,非常成熟的一个应用,也是目前无处不在的停车场自动收费设备的技术基础。前言本文将使用c#语言,winform框架开发一个车牌识别系统M=,不借助任何框架,纯算法。效果  使用工具VisualStudio2019思路打开要识别的车牌对车牌进行去雾操作接着进......
  • 界面组件DevExpress WinForms v23.2 - 数据展示、UI模板功能全新升级
    DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!DevExpressWinForms控件日前正式发布了v23.2,此版......