zoukankan      html  css  js  c++  java
  • 添加自定义对话框,您的应用程序

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

  • 相关阅读:
    Java并发之ThreadPoolExecutor
    Java并发之同步工具类
    em和i , b和Strong 的区别
    OS应用架构谈(二):View层的组织和调用方案(中)
    iOS应用架构谈(二):View层的组织和调用方案(上)
    java(List或Array数组)求交集、并集、差集, 泛型工具类
    AES/DES 可逆性加密算法 -- java工具类
    用xtrabackup实现mysql的主从复制 阿里云rds到自己创建mysql
    java 生成二维码工具
    XDU 1022 (数论筛法+前缀和)
  • 原文地址:https://www.cnblogs.com/Dincat/p/13467718.html
Copyright © 2011-2022 走看看