• 仿QQ面板举一反三之拉幕式窗口


     设计昨天尝试了仿QQ面板的设计(具体请看:http://www.cnblogs.com/KenBlove/archive/2008/09/27/1300938.html ),今天忽然想如果将面板横着放,不就成了一个拉幕式的窗口了么?

    说做就做.立即动手:

    首先,和QQ面板不同的就是QQ面板设计当点击Module button的时候,会显示下一级的button.但是这次我们做的不同,应该显示不同的内容,道理大同小异.我们将在panel中加入usercontrol,至于usercontrol里面要显示什么内容,就随便你发挥了.

    先看看最终界面吧:

    点击右边相应button,则可以显示不同的usercontrol,形成初步的拉幕效果:

    看完界面,我们来说说具体的实现吧.先在新建一个C# windows Application,拖拉相应的控件(重点是中间有一个panel控件,其余都是装饰),如图:

    像做QQ面板一样,我先定义一些必要的变量和属性:

            private string[] _Module;
            
    private int _ModuleButtonWidth = 25;

            
    /// <summary>
            
    /// 初始模块
            
    /// </summary>
            public string[] Module
            {
                
    get { return _Module; }
                
    set { _Module = value; }
            }


    定义好变量,我们开始写Form1_Load函数:

            private void Form1_Load(object sender, EventArgs e)
            {
                
    this.panel1.BorderStyle = BorderStyle.None;
                
    //初始化
                Module = new string[] { "初始模块1""初始模块2""初始模块3""初始模块4""初始模块5" };

                
    for (int i = 0; i < Module.Length; i++)
                {
                    
    //增加模块Button
                    Button btn = new Button();
                    btn.FlatStyle 
    = FlatStyle.Popup;
                    btn.Width 
    = _ModuleButtonWidth;
                    btn.Height 
    = this.panel1.Height;
                    btn.Name 
    = string.Format("Button{0}", i.ToString());
                    btn.Text 
    = Module[i];
                    btn.Left 
    = this.panel1.Width - _ModuleButtonWidth * (Module.Length - i);
                    btn.Click 
    += new EventHandler(btn_Click);
                    
    this.panel1.Controls.Add(btn);
                }
            }


    就是将Button加到Panel中,很简单!下边开始写点击Button加载usercontrol的操作:

            private void btn_Click(object sender, EventArgs e)
            {
                
    //标志是否找到用户点击的Button
                bool findOutStatus = false;

                
    //清除上一次操作加载的子菜单项
                for (int i = 0; i < this.panel1.Controls.Count; i++)
                {
                    
    if (this.panel1.Controls[i].GetType().Name == "Panel")
                    {
                        
    this.panel1.Controls.RemoveAt(i);
                    }
                }

                
    for (int i = 0; i < this.panel1.Controls.Count; i++)
                {
                    
    if (this.panel1.Controls[i].GetType().Name == "Button")
                    {
                        
    //重新定义各个button位置
                        if (!findOutStatus)
                        {
                            
    this.panel1.Controls[i].Left = _ModuleButtonWidth * i;
                        }
                        
    else
                        {
                            
    this.panel1.Controls[i].Left = this.panel1.Width - _ModuleButtonWidth * (Module.Length - i);
                        }

                        
    //找到所点击的Button,在其下加载子项
                        if (this.panel1.Controls[i].Name == ((Button)sender).Name)
                        {
                            findOutStatus 
    = true;

                            Panel panel 
    = new Panel();
                            panel.BackColor 
    = Color.AliceBlue;
                            panel.Left 
    = _ModuleButtonWidth * (i + 1);
                            panel.Width 
    = this.panel1.Width - _ModuleButtonWidth * Module.Length;
                            panel.Height 
    = this.panel1.Height;
                            
    switch (i)
                            {
                                
    case 0:
                                    panel.Controls.Add(
    new ucPart1());
                                    
    break;
                                
    case 1:
                                    panel.Controls.Add(
    new ucPart2());
                                    
    break;
                                
    case 2:
                                    panel.Controls.Add(
    new ucPart3());
                                    
    break;
                                
    case 3:
                                    panel.Controls.Add(
    new ucPart4());
                                    
    break;
                                
    case 4:
                                    panel.Controls.Add(
    new ucPart5());
                                    
    break;
                            }
                            
    this.panel1.Controls.Add(panel);
                        }
                    }
                }
            }

    大概意思代码里面都有说了..怎么样?很简单吧?! 附完整源代码:https://files.cnblogs.com/KenBlove/WindowsApplication1.7z

  • 相关阅读:
    【数据结构】10.java源码关于LinkedHashMap
    【数据结构】9.java源码关于HashTable
    【数据结构】8.java源码关于HashMap
    【数据结构】7.java源码关于LinkedList
    【LEETCODE】69、动态规划,easy,medium级别,题目:198、139、221
    【LEETCODE】68、动态规划,medium级别,题目:95、120、91
    【LEETCODE】67、分治递归,medium&hard级别,题目:215、312
    【数据结构】6.java源码ArrayList
    【LEETCODE】66、字符串分类,hard级别,题目:32,72,76
    mysql查询所有表数据大小
  • 原文地址:https://www.cnblogs.com/KenBlove/p/1301386.html
Copyright © 2020-2023  润新知