1. 程式人生 > 實用技巧 >新增自定義對話方塊,您的應用程式

新增自定義對話方塊,您的應用程式

介紹 對話方塊是最廣泛使用的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