添加自定义对话框,您的应用程序

介绍 对话框是最广泛使用的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

posted @ 2020-08-10 08:59  Dincat  阅读(247)  评论(0编辑  收藏  举报