前段时间因工作需要做一个类似进销存的系统,这里要用到基于C/S架构的WinForm界面,为了给我一样的菜鸟多一个参考,现将过程及关键界面的实现代码贴在后面,供参考!老鸟飘过~~
一、实现效果 演示
namespace TabTest
{partial class TabTest{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("子节点1-1");System.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode("子节点1-2");System.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode("子节点1-3");System.Windows.Forms.TreeNode treeNode16 = new System.Windows.Forms.TreeNode("根节点1", new System.Windows.Forms.TreeNode[] {treeNode13,treeNode14,treeNode15});System.Windows.Forms.TreeNode treeNode17 = new System.Windows.Forms.TreeNode("子节点2-1");System.Windows.Forms.TreeNode treeNode18 = new System.Windows.Forms.TreeNode("根节点2", new System.Windows.Forms.TreeNode[] {treeNode17});System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TabTest));this.treeView1 = new System.Windows.Forms.TreeView();this.MainTabControl = new System.Windows.Forms.TabControl();this.button1 = new System.Windows.Forms.Button();this.panel1 = new System.Windows.Forms.Panel();this.panel2 = new System.Windows.Forms.Panel();this.panel3 = new System.Windows.Forms.Panel();this.splitContainer1 = new System.Windows.Forms.SplitContainer();this.panel4 = new System.Windows.Forms.Panel();this.panel5 = new System.Windows.Forms.Panel();this.pictureBox1 = new System.Windows.Forms.PictureBox();this.label5 = new System.Windows.Forms.Label();this.tabPage5 = new System.Windows.Forms.TabPage();this.label4 = new System.Windows.Forms.Label();this.tabPage4 = new System.Windows.Forms.TabPage();this.label3 = new System.Windows.Forms.Label();this.tabPage3 = new System.Windows.Forms.TabPage();this.label2 = new System.Windows.Forms.Label();this.tabPage2 = new System.Windows.Forms.TabPage();this.MainTabControl.SuspendLayout();this.panel1.SuspendLayout();this.panel2.SuspendLayout();this.splitContainer1.Panel1.SuspendLayout();this.splitContainer1.Panel2.SuspendLayout();this.splitContainer1.SuspendLayout();this.panel4.SuspendLayout();this.panel5.SuspendLayout();((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();this.tabPage5.SuspendLayout();this.tabPage4.SuspendLayout();this.tabPage3.SuspendLayout();this.tabPage2.SuspendLayout();this.SuspendLayout();// // treeView1// this.treeView1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(224)))), ((int)(((byte)(192)))));this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;this.treeView1.Location = new System.Drawing.Point(0, 0);this.treeView1.Name = "treeView1";treeNode13.Name = "node1-1";treeNode13.Text = "子节点1-1";treeNode14.Name = "node1-2";treeNode14.Text = "子节点1-2";treeNode15.Name = "node1-3";treeNode15.Text = "子节点1-3";treeNode16.Name = "node1";treeNode16.Text = "根节点1";treeNode17.Name = "node2-1";treeNode17.Text = "子节点2-1";treeNode18.Name = "节点4";treeNode18.Text = "根节点2";this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {treeNode16,treeNode18});this.treeView1.Size = new System.Drawing.Size(153, 441);this.treeView1.TabIndex = 1;this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);// // MainTabControl// this.MainTabControl.Controls.Add(this.tabPage2);this.MainTabControl.Controls.Add(this.tabPage3);this.MainTabControl.Controls.Add(this.tabPage4);this.MainTabControl.Controls.Add(this.tabPage5);this.MainTabControl.Dock = System.Windows.Forms.DockStyle.Fill;this.MainTabControl.HotTrack = true;this.MainTabControl.ItemSize = new System.Drawing.Size(120, 22);this.MainTabControl.Location = new System.Drawing.Point(0, 0);this.MainTabControl.Name = "MainTabControl";this.MainTabControl.Padding = new System.Drawing.Point(3, 3);this.MainTabControl.RightToLeftLayout = true;this.MainTabControl.SelectedIndex = 0;this.MainTabControl.Size = new System.Drawing.Size(791, 441);this.MainTabControl.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;this.MainTabControl.TabIndex = 0;// // button1// this.button1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));this.button1.Cursor = System.Windows.Forms.Cursors.VSplit;this.button1.Dock = System.Windows.Forms.DockStyle.Fill;this.button1.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));this.button1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));this.button1.Location = new System.Drawing.Point(0, 0);this.button1.Name = "button1";this.button1.Size = new System.Drawing.Size(22, 441);this.button1.TabIndex = 0;this.button1.Text = "<";this.button1.UseVisualStyleBackColor = false;this.button1.Click += new System.EventHandler(this.button1_Click_1);this.button1.MouseEnter += new System.EventHandler(this.button1_MouseEnter);// // panel1// this.panel1.BackColor = System.Drawing.Color.Gray;this.panel1.Controls.Add(this.pictureBox1);this.panel1.Dock = System.Windows.Forms.DockStyle.Top;this.panel1.Location = new System.Drawing.Point(0, 0);this.panel1.Name = "panel1";this.panel1.Size = new System.Drawing.Size(970, 72);this.panel1.TabIndex = 7;// // panel2// this.panel2.Controls.Add(this.splitContainer1);this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;this.panel2.Location = new System.Drawing.Point(0, 72);this.panel2.Name = "panel2";this.panel2.Size = new System.Drawing.Size(970, 441);this.panel2.TabIndex = 8;// // panel3// this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom;this.panel3.Location = new System.Drawing.Point(0, 469);this.panel3.Name = "panel3";this.panel3.Size = new System.Drawing.Size(970, 44);this.panel3.TabIndex = 9;// // splitContainer1// this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;this.splitContainer1.Location = new System.Drawing.Point(0, 0);this.splitContainer1.Name = "splitContainer1";// // splitContainer1.Panel1// this.splitContainer1.Panel1.Controls.Add(this.treeView1);// // splitContainer1.Panel2// this.splitContainer1.Panel2.Controls.Add(this.panel5);this.splitContainer1.Panel2.Controls.Add(this.panel4);this.splitContainer1.Size = new System.Drawing.Size(970, 441);this.splitContainer1.SplitterDistance = 153;this.splitContainer1.TabIndex = 0;// // panel4// this.panel4.Controls.Add(this.button1);this.panel4.Dock = System.Windows.Forms.DockStyle.Left;this.panel4.Location = new System.Drawing.Point(0, 0);this.panel4.Name = "panel4";this.panel4.Size = new System.Drawing.Size(22, 441);this.panel4.TabIndex = 1;// // panel5// this.panel5.Controls.Add(this.MainTabControl);this.panel5.Dock = System.Windows.Forms.DockStyle.Fill;this.panel5.Location = new System.Drawing.Point(22, 0);this.panel5.Name = "panel5";this.panel5.Size = new System.Drawing.Size(791, 441);this.panel5.TabIndex = 2;// // pictureBox1// this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));this.pictureBox1.Location = new System.Drawing.Point(0, 0);this.pictureBox1.Name = "pictureBox1";this.pictureBox1.Size = new System.Drawing.Size(970, 72);this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;this.pictureBox1.TabIndex = 0;this.pictureBox1.TabStop = false;// // label5// this.label5.AutoSize = true;this.label5.Font = new System.Drawing.Font("微软雅黑", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));this.label5.Location = new System.Drawing.Point(288, 185);this.label5.Name = "label5";this.label5.Size = new System.Drawing.Size(0, 28);this.label5.TabIndex = 1;// // tabPage5// this.tabPage5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));this.tabPage5.Controls.Add(this.label5);this.tabPage5.Location = new System.Drawing.Point(4, 26);this.tabPage5.Name = "tabPage5";this.tabPage5.Padding = new System.Windows.Forms.Padding(3);this.tabPage5.Size = new System.Drawing.Size(783, 411);this.tabPage5.TabIndex = 4;this.tabPage5.Text = "子节点2-1";// // label4// this.label4.AutoSize = true;this.label4.Font = new System.Drawing.Font("微软雅黑", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));this.label4.Location = new System.Drawing.Point(288, 185);this.label4.Name = "label4";this.label4.Size = new System.Drawing.Size(0, 28);this.label4.TabIndex = 1;// // tabPage4// this.tabPage4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));this.tabPage4.Controls.Add(this.label4);this.tabPage4.Location = new System.Drawing.Point(4, 26);this.tabPage4.Name = "tabPage4";this.tabPage4.Padding = new System.Windows.Forms.Padding(3);this.tabPage4.Size = new System.Drawing.Size(783, 411);this.tabPage4.TabIndex = 3;this.tabPage4.Text = "子节点1-3";// // label3// this.label3.AutoSize = true;this.label3.Font = new System.Drawing.Font("微软雅黑", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));this.label3.Location = new System.Drawing.Point(288, 185);this.label3.Name = "label3";this.label3.Size = new System.Drawing.Size(0, 28);this.label3.TabIndex = 1;// // tabPage3// this.tabPage3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))));this.tabPage3.Controls.Add(this.label3);this.tabPage3.Location = new System.Drawing.Point(4, 26);this.tabPage3.Name = "tabPage3";this.tabPage3.Padding = new System.Windows.Forms.Padding(3);this.tabPage3.Size = new System.Drawing.Size(783, 411);this.tabPage3.TabIndex = 2;this.tabPage3.Text = "子节点1-2";// // label2// this.label2.AutoSize = true;this.label2.Font = new System.Drawing.Font("微软雅黑", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));this.label2.Location = new System.Drawing.Point(76, 137);this.label2.Name = "label2";this.label2.Size = new System.Drawing.Size(0, 28);this.label2.TabIndex = 1;// // tabPage2// this.tabPage2.BackColor = System.Drawing.Color.White;this.tabPage2.Controls.Add(this.label2);this.tabPage2.Location = new System.Drawing.Point(4, 26);this.tabPage2.Name = "tabPage2";this.tabPage2.Padding = new System.Windows.Forms.Padding(3);this.tabPage2.Size = new System.Drawing.Size(783, 411);this.tabPage2.TabIndex = 1;this.tabPage2.Text = "子节点1-1";// // TabTest// this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(970, 513);this.Controls.Add(this.panel3);this.Controls.Add(this.panel2);this.Controls.Add(this.panel1);this.Name = "TabTest";this.Text = "DEMO - Panel布局及TabControl增加关闭按钮和Treeview导航";this.Load += new System.EventHandler(this.TabTest_Load);this.MainTabControl.ResumeLayout(false);this.panel1.ResumeLayout(false);this.panel2.ResumeLayout(false);this.splitContainer1.Panel1.ResumeLayout(false);this.splitContainer1.Panel2.ResumeLayout(false);this.splitContainer1.ResumeLayout(false);this.panel4.ResumeLayout(false);this.panel5.ResumeLayout(false);((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();this.tabPage5.ResumeLayout(false);this.tabPage5.PerformLayout();this.tabPage4.ResumeLayout(false);this.tabPage4.PerformLayout();this.tabPage3.ResumeLayout(false);this.tabPage3.PerformLayout();this.tabPage2.ResumeLayout(false);this.tabPage2.PerformLayout();this.ResumeLayout(false);}#endregionprivate System.Windows.Forms.TreeView treeView1;private System.Windows.Forms.TabControl MainTabControl;private System.Windows.Forms.Button button1;private System.Windows.Forms.Panel panel1;private System.Windows.Forms.Panel panel2;private System.Windows.Forms.SplitContainer splitContainer1;private System.Windows.Forms.Panel panel3;private System.Windows.Forms.Panel panel5;private System.Windows.Forms.Panel panel4;private System.Windows.Forms.PictureBox pictureBox1;private System.Windows.Forms.TabPage tabPage2;private System.Windows.Forms.Label label2;private System.Windows.Forms.TabPage tabPage3;private System.Windows.Forms.Label label3;private System.Windows.Forms.TabPage tabPage4;private System.Windows.Forms.Label label4;private System.Windows.Forms.TabPage tabPage5;private System.Windows.Forms.Label label5;}
}
二、界面绘制代码Designer.cs
三、关键实现代码TabTest.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace TabTest
{public partial class TabTest : Form{public TabTest(){InitializeComponent();//全部展开导航树this.treeView1.ExpandAll();//隐藏tabPagethis.tabPage2.Parent = null;this.tabPage3.Parent = null;this.tabPage4.Parent = null;this.tabPage5.Parent = null;}private void TabTest_Load(object sender, EventArgs e){//清空控件//this.MainTabControl.TabPages.Clear();//绘制的方式OwnerDrawFixed表示由窗体绘制大小也一样this.MainTabControl.DrawMode = TabDrawMode.OwnerDrawFixed;this.MainTabControl.Padding = new System.Drawing.Point(CLOSE_SIZE, CLOSE_SIZE);this.MainTabControl.DrawItem += new DrawItemEventHandler(this.MainTabControl_DrawItem);this.MainTabControl.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MainTabControl_MouseDown);}const int CLOSE_SIZE = 15;//tabPage标签图片Bitmap image = new Bitmap("closeBlack.png");//绘制“X”号即关闭按钮private void MainTabControl_DrawItem(object sender, DrawItemEventArgs e){try{Rectangle myTabRect = this.MainTabControl.GetTabRect(e.Index); //先添加TabPage属性 //e.Graphics.DrawString(this.MainTabControl.TabPages[e.Index].Text, new Font("微软雅黑", 12), SystemBrushes.ControlText, myTabRect.X + 2, myTabRect.Y + 2);//设置笔刷SolidBrush black = new SolidBrush(Color.Black);SolidBrush white = new SolidBrush(Color.White);//居中显示StringFormat stringFormat = new StringFormat();stringFormat.Alignment = StringAlignment.Center;//绘制背景颜色e.Graphics.FillRectangle(white, myTabRect);//设置文字颜色 e.Graphics.DrawString(this.MainTabControl.TabPages[e.Index].Text, new Font("微软雅黑", 10), black, myTabRect, stringFormat);//再画一个矩形框using (Pen p = new Pen(Color.White)){myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 3), 2);myTabRect.Width = CLOSE_SIZE;myTabRect.Height = CLOSE_SIZE;e.Graphics.DrawRectangle(p, myTabRect);}//填充矩形框Color recColor = e.State == DrawItemState.Selected ? Color.Red : Color.White;using (Brush b = new SolidBrush(recColor)){e.Graphics.FillRectangle(b, myTabRect);}//画关闭符号using (Pen objpen = new Pen(Color.Black)){ //使用图片Bitmap bt = new Bitmap(image);Point p5 = new Point(myTabRect.X, 4);e.Graphics.DrawImage(bt, p5);//e.Graphics.DrawString(this.MainTabControl.TabPages[e.Index].Text, this.Font, objpen.Brush, p5);}e.Graphics.Dispose();}catch (Exception){ }}//关闭按钮功能private void MainTabControl_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){int x = e.X, y = e.Y;//计算关闭区域 Rectangle myTabRect = this.MainTabControl.GetTabRect(this.MainTabControl.SelectedIndex);myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 3), 2);myTabRect.Width = CLOSE_SIZE;myTabRect.Height = CLOSE_SIZE;//如果鼠标在区域内就关闭选项卡 bool isClose = x > myTabRect.X && x < myTabRect.Right && y > myTabRect.Y && y < myTabRect.Bottom;if (isClose == true){this.MainTabControl.TabPages.Remove(this.MainTabControl.SelectedTab);}}}/// <summary>/// 折叠与还原Panel1/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click_1(object sender, EventArgs e){string btntext = this.button1.Text;if (btntext == "<"){this.splitContainer1.Panel1Collapsed = true;this.button1.Text = ">";}else if (btntext == ">"){this.splitContainer1.Panel1Collapsed = false;this.button1.Text = "<";}}private void button1_MouseEnter(object sender, EventArgs e){ToolTip p = new ToolTip();p.ShowAlways = true;p.SetToolTip(this.button1, "点击展开和隐藏目录面版");}private void treeView1_AfterSelect(object sender, TreeViewEventArgs e){if (treeView1.SelectedNode != null){//string sn = treeView1.SelectedNode.Text;string sn = this.treeView1.SelectedNode.Name;if (sn == "node1-1"){this.tabPage2.Parent = this.MainTabControl; }else if (sn == "node1-2"){this.tabPage3.Parent = this.MainTabControl;}else if (sn == "node1-3"){this.tabPage4.Parent = this.MainTabControl;}else if (sn == "node2-1"){this.tabPage5.Parent = this.MainTabControl;}}}//双击选项卡关闭tab页面private void MainTabControl_MouseDoubleClick(object sender, EventArgs e) {MainTabControl.TabPages.Remove(MainTabControl.SelectedTab); }}
}