C# 用tabcontrol实现窗体类似网页排版的显示

这里做的比较简陋,可以美化下

吧form设置位非顶级控件,直接放在tabcontro里边,然后实现tabcontrol的拖拽移除tabpage显示form以及添加tabpage

mousemove的触发时机需要优化一下

public Form1()
        {
            InitializeComponent();
        }
        private TabControl tabControl1 = new TabControl();
        private bool StartMove = false;
        private bool flag = true;
        private TabPage MovePage = null;
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            tabControl1.Dock = DockStyle.Fill;

            this.Controls.Add(tabControl1);
            this.Controls.SetChildIndex(tabControl1, 0);
            frm1ToolStripMenuItem.Click += delegate {
                var frm1 = new Form();
                frm1.Text = "frm1";
                var btn=new Button();
                btn.Text = "btn";
                btn.Click += delegate { MessageBox.Show("this is frm1"); btn.Text = "frm1"; };
                frm1.Controls.Add(btn);
                addfrm(frm1);
            };
            frm2ToolStripMenuItem.Click += delegate
            {
                var frm1 = new Form();
                frm1.Text = "frm2";
                var btn = new Button();
                btn.Text = "btn";
                btn.Click += delegate { MessageBox.Show("this is frm2"); };
                frm1.Controls.Add(btn);
                addfrm(frm1);
            };
            frm3ToolStripMenuItem.Click += delegate
            {
                var frm1 = new Form();
                frm1.Text = "frm3";
                var btn = new Button();
                btn.Text = "btn";
                btn.Click += delegate { MessageBox.Show("this is frm3"); };
                frm1.Controls.Add(btn);
                addfrm(frm1);
            };
            tabControl1.AllowDrop = true;
            Func<Point, TabPage> GetTabPageByTab = (point) =>
            {
                for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
                {
                    if (tabControl1.GetTabRect(i).Contains(point))
                    {
                        return this.tabControl1.TabPages[i];
                    }
                }
                return null;
            };
            tabControl1.MouseDown += (o, eg) => {
                if (flag)
                {
                    StartMove = true;
                    MovePage=GetTabPageByTab(new Point(eg.X, eg.Y));
                }
                flag = true;
            };
            tabControl1.MouseUp += (o, eg) => {
                StartMove = false;
            };
            tabControl1.SelectedIndexChanged += (o, eg) => {
                flag = false;//切换的时候因为失去焦点的原因,会触发down事件不触发up事件这里做屏蔽
            };
            tabControl1.MouseMove += (o, eg) => {
                if (StartMove && flag)
                {
                    if (MovePage != null)
                    {
                        this.DoDragDrop(MovePage, DragDropEffects.None);
                    }
                }
            };
            tabControl1.ControlAdded += delegate {
                StartMove = false;
                flag = false;
            };
            tabControl1.DragOver += (o, eg) => {
                eg.Effect = DragDropEffects.None;
                if (tabControl1.TabPages.Count < 2) return;
                TabPage page = (TabPage)eg.Data.GetData(typeof(TabPage));
                var frm1 = page.Controls[0] as Form;
                frm1.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
                frm1.Parent = null;
                frm1.TopLevel = true;
                frm1.Owner = this;
                frm1.Location = new Point(eg.X, eg.Y);
                frm1.Show();
                tabControl1.TabPages.Remove(page);
                MovePage = null;
                frm1.Move += (oo, ee) =>
                {
                    for (int i = 0; i < tabControl1.TabPages.Count; i++)
                    {
                        if (tabControl1.GetTabRect(i).Contains(this.PointToClient(frm1.Location)))
                        {
                            addfrm(frm1);
                        }
                    }
                };

            };

        }
        private void addfrm(Form frm)
        {
            if (tabControl1.Visible == false) tabControl1.Visible = true;
            bool flag = true;
            frm.TopLevel = false;
            frm.Dock = DockStyle.Fill;
            frm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            frm.Owner = null;
            foreach (TabPage page in tabControl1.TabPages)
            {
                if (page.Controls.Count < 1)
                {
                    page.Controls.Add(frm);
                    page.Text=frm.Text;
                    flag = false;
                    frm.Show();
                    return;
                }
            }
            if (flag)
            {
                var page=new TabPage(frm.Text);
                page.Controls.Add(frm);
                tabControl1.TabPages.Add(page);
                frm.Show();
            }

        }
时间: 2024-10-11 11:10:30

C# 用tabcontrol实现窗体类似网页排版的显示的相关文章

div+css是网页排版技巧_html/css_WEB-ITnose

div+css是网页排版技巧_html/css_WEB-ITnose 以下是兄弟连培训总结的一些技巧,留下备用,希望对看到的人有用~~ 1,ul:默认的ul的margin和padding不是0,如果在导航中用到了左浮动的li,往往会把外部的div撑大,导致页面变形,改成: ul{margin:0px; padding:0px;} 2.img:1.这里牵涉的不同浏览器的问题,ie6里显示的图片height总是要大于准确值,这里就需要我们记住下面这一点 img{ display:block}:2.页

前端切图+网页排版的注意事项和经验分享

现在在学校里面,培训机构里面都有很多课程是前端切图这一方面的,简单来说就是学习div+css网页排版.有很多人经过这一轮的学习之后就发现自己对排版这一方面非常的熟悉甚至说自己的div+css的高手.其实真正说要懂得一个网页排版需要注意的一些问题是什么呢?是不是在电脑上面看到自己排版出来的页面就真的是一个成功的网页了吗?下面我说一下我自己在网页排版上面会注意的一些事情: 一.使用样式的种类和名字的规范 id和class应该如何使用 在我们使用div+css排版的时候,每一个div我们都会给他一个样

Js打开网页后居中显示

使用JavaScript定义打开网页后居中显示,并可为窗口设置大小,使用“window.open”方法打开新窗口:先来看完整的代码及调用方法: <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>打开居中的窗口</title> <script language="javascript"> //参数-url:要打开的网站,winname:打开后

WinForm实现类似QQ停靠,显示隐藏过程添加特效效果

原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右下角会显示一个窗体,一般情况下该窗体会隐藏停靠在右边,只露出很小部分,当鼠标移动到这个很小部分时,窗体全部显示,显示过程是从右边滑动到左边,当鼠标离开窗体时,窗体需要隐藏在右边,只露出很小部分,隐藏过程是从左边滑动到右边. 实现此类效果我碰到的连个难点是:1.如何判断鼠标离开了窗体?2.窗体显示隐藏

Dreamweaver中用css载入bg-image图片在设计栏不出现但可在网页中正常显示

刚开始以为是dreamweaver软件自身问题,但重启几次软件之后发现不是软件问题,检查css语法也没有问题,又以为是css中某些div遮住了图片,去掉有可能影响图片的div后,发现问题仍在,最后只能去html中寻找问题原因,最终发现少写了</div>,调整后可正常显示. 代码: <div class="divContent"> <div class="divTable"> </div> 修改: <div cla

C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞定,让PropertyGrid显示Control的所有属性.可是这里显示的属性名是英文的.对于我们开发人员来说这无可厚非,我们也乐于接受.并且让PropertyGrid显示中文属性名,这对于我们开发人员的使用来说显得多此一举.可是,对于我这种类型的一个应用工具,英文属性名对于很多客户来说可能就很难懂

Ueditor uParse功能Bug,生成了全局CSS: li,影响全局样式, 造成网页其它部分显示混乱解决方案

Ueditor uParse功能关于CSS li的Bug,解决方法 百度UEditor是一款不错的在线富文本编辑插件,这里不做过多介绍,详情移步UEditor官网:http://ueditor.baidu.com/ Bug: Ueditor uParse功能,生成了全局CSS: li,影响全局样式, 造成网页其它部分显示混乱. 版本:UEditor 1.4.3 分析如下: Ueditor uParse功能Bug,生成了全局CSS:li,影响全局样式,造成网页其它部分显示混乱,如下图示: 解决方法

extjs中新建窗体时,给窗体添加背景图片不显示问题之一

1.在extjs中新建窗体时,给窗体添加背景图片不显示,例如下面的代码. 不显示的原因:因为设置了  layout: 'fit', Ext.create('Ext.Window', { title: '客户关系管理系统', width: 1024, height: 600, //plain: true, bodyStyle: 'background:url(images/登录背景.jpg);', headerPosition: 'top', layout: 'fit', items: { bor

BASE64编码的图片在网页中的显示问题的解决

BASE64编码的图片在网页中的显示问题的解决 关于图片的Base64编码,你了解吗?