iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >利用WinForm实现上左右布局的方法详解
  • 896
分享到

利用WinForm实现上左右布局的方法详解

2024-04-02 19:04:59 896人浏览 八月长安
摘要

目录场景需求开发环境开发工具实现代码实现效果代码解析场景 现在90%的管理系统都是在用上左右这种布局方式,真可谓是经典永流传。不过,由于现在基本都是WEB做的后台管理系统,所以样式、

场景

现在90%的管理系统都是在用上左右这种布局方式,真可谓是经典永流传。不过,由于现在基本都是WEB做的后台管理系统,所以样式、效果等控制起来都比较方便。但是在winform上就很头疼了,现在还有很大一部分的的布局是采用的上下或者上中下的布局方式,也有一些由于使用了第三方的控件,做了上左右的布局,我本人也是。即便做了好多年WinfORM了,也没做过原生上左右布局的主页面。

前一段时间突然想起来做个小工具,想着就搭个架子出来吧,一直以为使用Mid属性会很容易实现,现实却告诉我想的太简单了。

上面的菜单栏和下面的提示栏不用多说。中间左右布局使用splitContainer即可,当我满心欢喜的把窗口放到panel2中的时候,才发现一个严重的问题,带边框的窗体太丑了,去掉边框的话,没办法对页面进行更好的管理。而使用Menu的一些属性监听不到panel中的Form,只能玩Mdi。

需求

所以,综上场景所述,结合现在的Web后台管理系统(Tab布局)。而且就连Win11和Win10都有一些插件支持资源管理器Tab标签了,何不简单点直接使用TabControl来实现呢?既方便管理了窗体,又在一定程度解决了窗体的边框样式问题。

开发环境

.net Framework版本:4.5

开发工具

Visual Studio 2013

实现代码

System.windows.Forms.ContextMenuStrip MenuStrip = new ContextMenuStrip();
        public UserTabpage()
        {
            InitializeComponent();
            DrawMode = TabDrawMode.OwnerDrawFixed;
            SizeMode = TabSizeMode.Fixed;
            ItemSize = new Size(100, 24);
           


            MenuStrip.Items.Add(new System.Windows.Forms.ToolStripLabel("关闭其他", null, false, (s, e) =>
            {
                for (int i = 0; i < TabPages.Count; i++)
                {
                    if (i != SelectedIndex)
                    {
                        TabPages.RemoveAt(i);
                        i--;
                    }
                }
            }));


            MenuStrip.Items.Add(new System.Windows.Forms.ToolStripLabel("关闭所有", null, false, (s, e) =>
            {
                for (int i = 0; i < TabPages.Count; i++)
                {
                    TabPages.RemoveAt(i);
                    i--;
                }
            }));


        }


        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(e);
            try
            {
                Rectangle rect = GetTabRect(e.Index);
                string title = TabPages[e.Index].Text;
                if (title.Length > 5)
                {
                    title = title.SubStringByte(10) + "..";
                }
                Brush brush = new SolidBrush(Color.Black);
                Font font = new Font("宋体", 10);


                e.Graphics.DrawString(title, font, brush, new PointF(rect.X + 2, rect.Y + 5));


                e.Graphics.DrawString("X", font, new SolidBrush(Color.OrangeRed), new Point((e.Index + 1) * rect.Width - 15, rect.Y + 5));


                Point x1 = new Point(rect.X, rect.Height);
                Point x2 = new Point((e.Index + 1) * rect.Width, rect.Height);
                if (e.Index == SelectedIndex)
                {
                    e.Graphics.DrawLine(new Pen(Color.Red, 1), x1, x2);
                }
                else
                {
                    e.Graphics.DrawRectangle(new Pen(Color.White, 1), rect);
                }


            }
            catch { }


        }
        protected override void OnMouseClick(MouseEventArgs e)
        {
            base.OnMouseClick(e);
            try
            {
                Point point = e.Location;
                if (e.Button == MouseButtons.Left)
                {
                    Rectangle rect = GetTabRect(SelectedIndex);
                    if (point.X >= (SelectedIndex + 1) * rect.Width - 15)
                    {
                        TabPages.Remove(SelectedTab);
                    }


                }
                else if (e.Button == MouseButtons.Right)
                {
                    for (int i = 0; i < TabPages.Count; i++)
                    {
                        if (GetTabRect(i).Contains(point))
                        {
                            Point p = this.PointToScreen(new Point(e.X, e.Y));
                            SelectedIndex = i;
                            MenuStrip.Show(p);
                            return;
                        }
                    }
                }
            }
            catch { }
        }
  private void MainForm_Load(object sender, EventArgs e)
        {
            Treenode node = new TreeNode("Form1");
            node.Name = "Form1";
            treeMenu.Nodes.Add(node);
            node = new TreeNode("Form2");
            node.Name = "Form2";
            treeMenu.Nodes.Add(node);
        }


        private void ShowForm(string name, string text)
        {
            try
            {
                foreach (TabPage page in tabForm.TabPages)
                {
                    if (page.Text == text)
                    {
                        tabForm.SelectedTab = page;
                        return;
                    }
                }
                Type t = this.GetType();
                Assembly ass = this.GetType().Assembly;
                Type type = ass.GetType(Assembly.GetExecutingAssembly().GetName().Name + "." + name);


                Form form = System.Activator.CreateInstance(type) as Form;
                form.TopLevel = false;
                form.Text = text;
                form.FormBorderStyle = FormBorderStyle.None;
                form.Dock = DockStyle.Fill;


                TabPage tabPage = new TabPage(form.Text);
                tabPage.AutoScroll = true;
                tabPage.Controls.Add(form);
                tabForm.TabPages.Add(tabPage);
                tabForm.SelectedTab = tabPage;


                form.Show();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        private void treeMenu_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (!string.IsNullOrEmpty(e.Node.Name))
            {
                ShowForm(e.Node.Name, e.Node.Text);
            }
        }

实现效果

代码解析

首先是写了个自定义控件,用来封装一些TabControl的操作,主要实现的有:tab页加关闭按钮,增加选中标记,增加右键菜单。

然后是主页面采用了硬编码的方式加载了菜单,其菜单显示值对应的是Text(自定义),Name对应的是Form的名称,然后通过反射显示页面到TabPage中。

到此这篇关于利用WinForm实现上左右布局的方法详解的文章就介绍到这了,更多相关WinForm上左右布局内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用WinForm实现上左右布局的方法详解

本文链接: https://www.lsjlt.com/news/166906.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用WinForm实现上左右布局的方法详解
    目录场景需求开发环境开发工具实现代码实现效果代码解析场景 现在90%的管理系统都是在用上左右这种布局方式,真可谓是经典永流传。不过,由于现在基本都是Web做的后台管理系统,所以样式、...
    99+
    2024-04-02
  • html左中右自适应布局的方法
    本篇内容介绍了“html左中右自适应布局的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在最新的html标准中 有了个calc css表...
    99+
    2023-06-08
  • css页面中常见左中右分栏布局的实现方法
    这篇文章主要介绍“css页面中常见左中右分栏布局的实现方法”,在日常操作中,相信很多人在css页面中常见左中右分栏布局的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • div css左右浮动布局的方法是什么
    这篇文章主要介绍“div css左右浮动布局的方法是什么”,在日常操作中,相信很多人在div css左右浮动布局的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”di...
    99+
    2024-04-02
  • span在div里居左和居右布局的方法
    本篇内容介绍了“span在div里居左和居右布局的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 两...
    99+
    2024-04-02
  • 如何使用CSS实现左图右文混排布局
    小编给大家分享一下如何使用CSS实现左图右文混排布局,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!代码如下:<!DOCTYPE html PUBLIC "-//W3C//D...
    99+
    2024-04-02
  • 如何使用ViewPager+RadioGroup实现左右滑动卡片布局
    小编给大家分享一下如何使用ViewPager+RadioGroup实现左右滑动卡片布局,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!效果如图所示:选择某个界面时,对应的第几个小圆点亮:通过selector制造圆点...
    99+
    2023-06-29
  • css如何实现左侧固定右侧自适应的布局方式
    小编给大家分享一下css如何实现左侧固定右侧自适应的布局方式,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一.浮动布局先让固定宽度的div浮动!使其脱离文档流。 2.margin-left的值等于固定div的宽度相等。&n...
    99+
    2023-06-08
  • JQUERY实现左右权限的操作方法
    JQUERY实现左右权限的操作方法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代码:<!DOCTYP...
    99+
    2024-04-02
  • wasd键盘变成上下左右的解决方法
    小编给大家分享一下wasd键盘变成上下左右的解决方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!wasd键盘变成上下左右的解决办法:1、找到键盘上的快捷键“FN+W键”,并同时按下“FN+W键”;2、直接将键盘的插口从电...
    99+
    2023-06-15
  • CSS实现Tab布局的方法
    小编给大家分享一下CSS实现Tab布局的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、布局方式1、内容与tab分离<div class=&...
    99+
    2023-06-08
  • CSS Flexbox布局:利用弹性盒子布局实现灵活的布局结构
    CSS Flexbox布局:灵活的布局结构实现简介:在前端开发中,页面布局是一个重要的环节。传统的布局方式,如使用浮动或定位,有时候在设计不符合标准化的情况下会出现一系列问题。为了克服这些问题,CSS3引入了Flexbox布局,它可以为开发...
    99+
    2023-11-18
    CSS 布局 FLEXBOX
  • vue实现顶部左右滑动导航的方法
    这篇文章主要讲解了“vue实现顶部左右滑动导航的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue实现顶部左右滑动导航的方法”吧!日常开发中经常用到导航这些东西,写篇文章记录下。该导航...
    99+
    2023-06-20
  • CSS Positions布局实现多列等高布局的方法
    在网页开发中,实现多列等高布局是一个常见的需求。传统的方法是使用JavaScript来实现,但是这种方法存在兼容性和性能问题。现在我们可以通过使用CSS Positions布局来实现多列等高布局,不仅简单易用,而且效果良好。实现多列等高布局...
    99+
    2023-10-21
    CSS 布局 Positions
  • CSS布局教程:实现瀑布流布局的最佳方法
    瀑布流布局(Waterfall Layout)是一种常见的网页布局方式,它可以使不同大小的元素以多列的形式依次排列,给人一种瀑布水流般的感觉。这种布局常用于照片墙、产品展示等需要展示多个项目的网页。本文将介绍如何使用CSS实现瀑布流布局,并...
    99+
    2023-10-21
    瀑布流布局 最佳方法 CSS布局
  • 纯CSS实现图片左右翻转效果的方法
    这篇“纯CSS实现图片左右翻转效果的方法”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“纯CSS实现图片左右翻转效果的方法”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来...
    99+
    2023-06-06
  • Android实现布局全屏的方法
    这篇文章给大家分享的是有关Android实现布局全屏的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,...
    99+
    2023-06-14
  • CSS布局教程:实现对比布局的最佳方法
    CSS布局教程:实现对比布局的最佳方法,需要具体代码示例引言:CSS是一种强大的样式语言,可以用于控制网页的布局和样式。在网页设计中,经常会遇到需要实现对比布局的情况。对比布局是指网页中的两个或多个元素以对比的方式排列和展示,从而吸引用户的...
    99+
    2023-10-25
    最佳方法 CSS布局 对比布局
  • CSS多列布局的实现方法
    本篇内容主要讲解“CSS多列布局的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS多列布局的实现方法”吧!摘要:  多列布局在网站应用中也是经常见到...
    99+
    2024-04-02
  • CSS布局教程:实现圆形布局的最佳方法
    CSS布局教程:实现圆形布局的最佳方法,需要具体代码示例在网页设计中,常常需要实现一些独特的布局效果来吸引用户的注意力。其中,圆形布局是一种非常常见且有趣的布局效果,可以用来展示图片、图标或者其他内容。本文将介绍实现圆形布局的最佳方法,并提...
    99+
    2023-10-26
    实现方法 CSS布局 圆形布局
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作