新增自定義對話方塊,您的應用程式
介紹 對話方塊是最廣泛使用的UI視窗型別之一。人們很難想象沒有對話方塊的Windows應用程式。其中一些很簡單,比如帶有幾個按鈕的訊息框。它們的功能在。net MessageBox類中已經基本涵蓋了。有些比較複雜,比如檔案儲存/載入對話方塊或印表機設定。它們也有相應的。net類。但是,如果我們需要一些其他形式的對話方塊,而不是MessageBox或標準對話方塊控制元件所包含的對話方塊呢?在實際應用程式中,定製對話方塊的需求經常出現。當然,這很簡單,只需在表單上新增必要的控制元件,新增OK和Cancel按鈕,瞧!但是為什麼要一遍又一遍地做同樣的事情呢?讓我們建立基對話方塊類,並通過繼承重用它。這難道不是OOP的全部意義嗎? BaseDialog類 在開始的時候,讓我們問自己,我們想從基本的對話中得到什麼。 首先,我們需要它有OK和Cancel按鈕。讓我們把它們放在表單的左下角。 其次,讓我們畫一條線將它們與表單的其餘部分分開。噢,。net中沒有行控制。沒關係,我們將自己建立這個控制元件,並在過程中學習自定義控制元件建立的基礎知識。 第三,我們需要更新這些控制元件的佈局,以應對繼承窗體的大小調整。隱藏,複製Code
protected override void OnLoad(EventArgs e) { base.OnLoad (e); OnResize(e); } protected override void OnResize(EventArgs e) { base.OnResize (e); Line1.Location = new Point(6, this.Size.Height - 64); Line1.Size = new Size(this.Size.Width - 18, 2); int okx = this.Size.Width - cbOk.Size.Width - 14; if(cbCancel.Visible && this.Visible) okx -= cbCancel.Size.Width + 4; cbOk.Location = new Point(okx, this.Size.Height - cbOk.Size.Height - 32); cbCancel.Location = new Point(this.Size.Width - cbCancel.Size.Width - 14, this.Size.Height - cbCancel.Size.Height - 32); }
最後,也是最重要的一點。當對話方塊完成時,繼承程式應該能夠新增一些自定義操作,或者使用DialogResult。好或DialogResult.Cancel。這些可能是一些驗證操作,具有防止對話方塊完成的能力。返回值為布林值的受保護虛擬方法可以很好地達到這個目的。隱藏,收縮,複製Code
private void cbOk_Click(object sender, System.EventArgs e) { ExitOk(); } private void cbCancel_Click(object sender, System.EventArgs e) { ExitCancel(); } protected void ExitOk() { if(cbOk.Enabled==true) { if(OnOk()) { this.DialogResult = DialogResult.OK; this.Close(); } } } protected void ExitCancel() { if(cbCancel.Enabled==true) { if(OnCancel()) { this.DialogResult = DialogResult.Cancel; this.Close(); } } } protected virtual bool OnOk() { return true; } protected virtual bool OnCancel() { return true; }
線路控制 這個很簡單。 從System.Windows.Forms.Control繼承。 把它漆成自己。隱藏,Copy Codeprotected override void OnPaint(PaintEventArgs e) { base.OnPaint (e); 重繪(e.Graphics); } 在調整大小時重新繪製。隱藏,複製程式碼保護覆蓋void OnResize(EventArgs e) { base.OnResize (e); //身高不改變,只改變長度 這一點。身高= 6; 重繪(this.CreateGraphics ()); } 畫在這裡:藏起來複制Code
private void Redraw(Graphics g) { // drawing dark edge of line Pen pen = new Pen(SystemColors.ControlDark, 1); Point p1 = new Point(1, 2); Point p2 = new Point(this.Width - 2, 2); g.DrawLine(pen, p1, p2); // drawing bright edge of line pen = new Pen(SystemColors.ControlLightLight, 1); p1 = new Point(1, 3); p2 = new Point(this.Width - 2, 3); g.DrawLine(pen, p1, p2); p1 = new Point(this.Width - 2, 2); g.DrawLine(pen, p1, p2); }
如何使用 現在建立對話方塊變成了一種樂趣。將繼承的表單新增到專案中(選擇BaseDialog來繼承)。新增必要的控制元件和程式碼。不要忘記對新增的控制元件充分使用錨屬性。將窗體大小調整為首選大小。如果需要,重寫OnOk和OnCancel方法來新增驗證程式碼。 將呼叫程式碼新增到應用程式表單。例如:隱藏,複製Code
private void button1_Click(object sender, System.EventArgs e) { SampleDialog sd = new SampleDialog(); if(sd.ShowDialog()==DialogResult.OK) { // ... } }
現在一些練習: 試著做一個沒有取消按鈕的對話方塊。 試著做一個“是”/“不是”的對話。 嘗試隱藏一條線,並將控制元件放在groupbox中。 所有這些都可以在不修改BaseDialog的情況下完成。 歷史 2005年10月16日-文章已提交。 本文轉載於:http://www.diyabc.com/frontweb/news8301.html