在winform下實(shí)現(xiàn)左右布局多窗口界面的方法之續(xù)篇
在上篇文章在winform下實(shí)現(xiàn)左右布局多窗口界面的方法已經(jīng)實(shí)現(xiàn)了左右布局多窗口界面,今天本來是研究基于winform的插件編程,沒想到順便又找到了另一種實(shí)現(xiàn)方案,這種實(shí)現(xiàn)方案更簡單,要寫的代碼也很少,具體實(shí)現(xiàn)如下。
可視化設(shè)計(jì)部份:
1.父窗口:ParentForm的IsMdiContainer 設(shè)置為 true,即:this.IsMdiContainer=true;
2.在父窗口中添加一個(gè)頂部菜單:menuStrip1,并新增一個(gè)菜單項(xiàng):Windows,且將menuStrip1的MdiWindowListItem設(shè)置為該Windows菜單對象,即: this.menuStrip1.MdiWindowListItem = this.windowsToolStripMenuItem;
3.在父窗口中添加一個(gè)樹形菜單:treeView1,并將其Dock設(shè)為左靠齊,即:this.treeView1.Dock = System.Windows.Forms.DockStyle.Left;且將margin設(shè)為0;
4.在父窗口中添加一個(gè)Panel:panel1,且將其width設(shè)為3;
以下是設(shè)計(jì)后自動(dòng)生成的代碼:
namespace WinFormTest { partial class ParentForm { /// <summary> /// 必需的設(shè)計(jì)器變量。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的資源。 /// </summary> /// <param name="disposing">如果應(yīng)釋放托管資源,為 true;否則為 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows 窗體設(shè)計(jì)器生成的代碼 /// <summary> /// 設(shè)計(jì)器支持所需的方法 - 不要 /// 使用代碼編輯器修改此方法的內(nèi)容。 /// </summary> private void InitializeComponent() { this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.windowsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.treeView1 = new System.Windows.Forms.TreeView(); this.panel1 = new System.Windows.Forms.Panel(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // // menuStrip1 // this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.windowsToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.MdiWindowListItem = this.windowsToolStripMenuItem; this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(684, 25); this.menuStrip1.TabIndex = 0; this.menuStrip1.Text = "menuStrip1"; // // windowsToolStripMenuItem // this.windowsToolStripMenuItem.Name = "windowsToolStripMenuItem"; this.windowsToolStripMenuItem.Size = new System.Drawing.Size(73, 21); this.windowsToolStripMenuItem.Text = "Windows"; // // treeView1 // this.treeView1.Dock = System.Windows.Forms.DockStyle.Left; this.treeView1.Location = new System.Drawing.Point(0, 25); this.treeView1.Margin = new System.Windows.Forms.Padding(0); this.treeView1.Name = "treeView1"; this.treeView1.Size = new System.Drawing.Size(228, 380); this.treeView1.TabIndex = 3; this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseDoubleClick); // // panel1 // this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); this.panel1.BackColor = System.Drawing.Color.Red; this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.panel1.Cursor = System.Windows.Forms.Cursors.VSplit; this.panel1.Location = new System.Drawing.Point(230, 28); this.panel1.Margin = new System.Windows.Forms.Padding(0); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(3, 100); this.panel1.TabIndex = 5; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(684, 405); this.Controls.Add(this.panel1); this.Controls.Add(this.treeView1); this.Controls.Add(this.menuStrip1); this.IsMdiContainer = true; this.MainMenuStrip = this.menuStrip1; this.Name = "Form1"; this.Text = "Form1"; this.Load += new System.EventHandler(this.Form1_Load); this.Resize += new System.EventHandler(this.Form1_Resize); this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.MenuStrip menuStrip1; private System.Windows.Forms.ToolStripMenuItem windowsToolStripMenuItem; private System.Windows.Forms.TreeView treeView1; private System.Windows.Forms.Panel panel1; } }
編碼部份:
其實(shí)上面的設(shè)計(jì)后,如果通過以下定義的方法打開一個(gè)子窗口,則直接實(shí)現(xiàn)了左右布局且包含多子窗口的界面。
private void ShowChildForm<TForm>() where TForm : Form, new() { Form childForm = new TForm(); childForm.MdiParent = this; childForm.Name = "ChildForm - " + DateTime.Now.Millisecond.ToString(); childForm.Text = childForm.Name; childForm.Show(); }
當(dāng)然仍然有不完美的地方,那就是左邊菜單欄寬度不能動(dòng)態(tài)調(diào)整,而又沒有用到splitContainer,故我們只有自己來實(shí)現(xiàn),其實(shí)也很簡單,步驟如下:
1.在父窗口構(gòu)造函數(shù)中加入初始化panel1(用作分割器)位置及訂閱相關(guān)事件,代碼如下:
public ParentForm() { InitializeComponent(); panel1.MouseDown += panel1_MouseDown; panel1.MouseUp += panel1_MouseUp; panel1.MouseMove += panel1_MouseMove; panel1.Top = menuStrip1.Height; panel1.Left = treeView1.Left + treeView1.Width; panel1.Height = panel1.Parent.Height; }
上述代碼的作用是:1.保證panel1的高度與位置與左側(cè)樹形菜單控件相匹配;2.訂閱的三個(gè)Mouse事件主要是為了后面實(shí)現(xiàn)移動(dòng)panel1。
2.實(shí)現(xiàn)訂閱的三個(gè)Mouse事件所對應(yīng)的方法,分別為鼠標(biāo)按下、鼠標(biāo)移動(dòng)、鼠標(biāo)松開,代碼如下:
private bool startMove = false; //用于標(biāo)記是否在移動(dòng)中 void panel1_MouseMove(object sender, MouseEventArgs e) { if (startMove) { panel1.Left += e.X; } } void panel1_MouseUp(object sender, MouseEventArgs e) { if (startMove) { panel1.Left += e.X; startMove = false; this.treeView1.Width = panel1.Left; } } void panel1_MouseDown(object sender, MouseEventArgs e) { startMove = true; }
上述代碼作用:按下鼠標(biāo)標(biāo)記為開始移動(dòng),然后移動(dòng)鼠標(biāo),若是標(biāo)記移動(dòng)中,說明是要移動(dòng)panel1,故直接將鼠標(biāo)當(dāng)前的X坐標(biāo)位置累加到panel1.Left屬性上,從而實(shí)現(xiàn)移動(dòng),當(dāng)鼠標(biāo)彈起后,則將樹形菜單的寬度設(shè)置為panel1.Left,從而實(shí)現(xiàn)樹形菜單隨panel1的移動(dòng)而改變大小。
同時(shí)為了保證panel1的高度始終與樹形菜單相同,在父窗口的Resize方法加入動(dòng)態(tài)調(diào)整panel1的高度,代碼如下:
private void ParentForm_Resize(object sender, EventArgs e) { panel1.Height = panel1.Parent.Height; }
到此就完成了整個(gè)的實(shí)現(xiàn)方案,為了便于模擬在樹形菜單中雙擊打開子窗口的效果,同時(shí)也添加了如下代碼:
private void ParentForm_Load(object sender, EventArgs e) { LoadMenuNodes(); } private void LoadMenuNodes() //實(shí)現(xiàn)情況應(yīng)該是從數(shù)據(jù)庫及用戶權(quán)限來進(jìn)行動(dòng)態(tài)創(chuàng)建菜單項(xiàng) { this.treeView1.Nodes.Clear(); var root = this.treeView1.Nodes.Add("Root"); for (int i = 1; i <= 10; i++) { var section = root.Nodes.Add("Section-" + i); int maxNodes = new Random(i).Next(1, 10); for (int n = 1; n <= maxNodes; n++) { section.Nodes.Add(string.Format("Level-{0}-{1}", i, n)); } } } private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Node.Nodes.Count <= 0)//當(dāng)非父節(jié)點(diǎn)(即:實(shí)際的功能節(jié)點(diǎn)) { ShowChildForm<ChildForm>(); } }
附上完整的實(shí)現(xiàn)代碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WinFormTest { public partial class ParentForm : Form { private bool startMove = false; public ParentForm() { InitializeComponent(); panel1.MouseDown += panel1_MouseDown; panel1.MouseUp += panel1_MouseUp; panel1.MouseMove += panel1_MouseMove; panel1.Top = menuStrip1.Height; panel1.Left = treeView1.Left + treeView1.Width; panel1.Height = panel1.Parent.Height; } void panel1_MouseMove(object sender, MouseEventArgs e) { if (startMove) { panel1.Left += e.X; } } void panel1_MouseUp(object sender, MouseEventArgs e) { if (startMove) { panel1.Left += e.X; startMove = false; this.treeView1.Width = panel1.Left; } } void panel1_MouseDown(object sender, MouseEventArgs e) { startMove = true; } private void ParentForm_Load(object sender, EventArgs e) { LoadMenuNodes(); } private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Node.Nodes.Count <= 0)//當(dāng)非父節(jié)點(diǎn)(即:實(shí)際的功能節(jié)點(diǎn)) { ShowChildForm<ChildForm>(); } } private void ParentForm_Resize(object sender, EventArgs e) { panel1.Height = panel1.Parent.Height; } private void LoadMenuNodes() //實(shí)現(xiàn)情況應(yīng)該是從數(shù)據(jù)庫及用戶權(quán)限來進(jìn)行動(dòng)態(tài)創(chuàng)建菜單項(xiàng) { this.treeView1.Nodes.Clear(); var root = this.treeView1.Nodes.Add("Root"); for (int i = 1; i <= 10; i++) { var section = root.Nodes.Add("Section-" + i); int maxNodes = new Random(i).Next(1, 10); for (int n = 1; n <= maxNodes; n++) { section.Nodes.Add(string.Format("Level-{0}-{1}", i, n)); } } } private void ShowChildForm<TForm>() where TForm : Form, new() { Form childForm = new TForm(); childForm.MdiParent = this; childForm.Name = "ChildForm - " + DateTime.Now.Millisecond.ToString(); childForm.Text = childForm.Name; childForm.Show(); } } }
最終效果如下圖示:
說明:我這里為了體現(xiàn)分割器,故將其背景色設(shè)為紅色,便于大家觀察,這種解決方案與之前的解決方案功能上是相同的,但有一點(diǎn)小小區(qū)別,之前的解決方案中子窗口的標(biāo)題欄是在父窗口的容器內(nèi),而本文的解決方案中子窗口在最大化后,子窗口的標(biāo)題欄會與父窗口合并,如下圖示,至于大家用哪種依實(shí)際場景。
關(guān)于在winform下實(shí)現(xiàn)左右布局多窗口界面的方法之續(xù)篇的相關(guān)知識就給大家介紹到這里,后續(xù)時(shí)間我會繼續(xù)研究winform關(guān)于插件式編程(近期工作任務(wù)要求),到時(shí)候同樣會分享給大家,也歡迎大家一起交流,當(dāng)然高手可以無視。
欄 目:C#教程
下一篇:C#使用SqlDataAdapter對象獲取數(shù)據(jù)的方法
本文標(biāo)題:在winform下實(shí)現(xiàn)左右布局多窗口界面的方法之續(xù)篇
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6655.html
您可能感興趣的文章
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新聞效果的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法
- 01-10C#實(shí)現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10winform實(shí)現(xiàn)創(chuàng)建最前端窗體的方法
- 01-10WinForm實(shí)現(xiàn)自定義右下角提示效果的方法
- 01-10.net2.0+ Winform項(xiàng)目實(shí)現(xiàn)彈出容器層
- 01-10winform 實(shí)現(xiàn)控制輸入法
- 01-10C#實(shí)現(xiàn)將窗體固定在顯示器的左上角且不能移動(dòng)的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置