添加自定义对话框,您的应用程序
介绍 对话框是最广泛使用的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