• 【C# 编程笔记】 1 基本窗口应用


    一、说明

            本篇是系列文章,专门介绍如何用C#上实现窗口和界面程序。值得注意的是,与VC++不同之处在于,VC是纯粹的面向对象,而C#是基于COM接口的编程方法,因此,按照VC++面向对象的MFC的思想无法理解C#,需要建立接口的概念。本篇将实现实验展示,并叙述接口思想。

    二、简单窗口实现

    2.1 实现简单的窗口工程

    假定已经安装好VS2019,然后建立C#的窗口程序。

    1 创建新项目

     2 选择C#窗口工程

     3 给项目起名

    然后进入创建窗口,点击【创建】按钮,就可以了。

    2.2 窗口工程代码

    在 Visual Studio 中创建新表单时,设计器会在 .Designer.cs 文件中生成以下代码:

    1. /// <summary>
    2. /// Required designer variable.
    3. /// </summary>
    4. private System.ComponentModel.IContainer components = null;
    5. /// <summary>
    6. /// Clean up any resources being used.
    7. /// </summary>
    8. /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    9. protected override void Dispose(bool disposing)
    10. {
    11. if (disposing && (components != null))
    12. {
    13. components.Dispose();
    14. }
    15. base.Dispose(disposing);
    16. }

    三、以下代码是什么意思? 

    3.1  关于空窗口的代码

     private System.ComponentModel.IContainer components = null;

            它是窗体设计器自动生成的代码,作为组件的容器。当窗体上没有组建时,把它删掉, 删了也“无所谓”当窗体上有组件时就不能删了,删了会出现错误的。

            也就是:他是管理组件的一个容器。

            为了深刻理解,举个例子:
    1.新建个窗体,删除了componment,这时没问题的
    2.再往窗体拖拽个Timer组件,再看是不是有自动生成了个componment?回答是肯定的。
    3.再把componment删了,看看还有没“所谓”,出错了吧!
    4.这时其实componment已经不是null了,它已经被new了:this.components = new System.ComponentModel.Container();

        components 变量的用途是什么?我的理论是,我应该将它用于我在 Designer 之外创建的表单拥有的任何 IDisposable 类(因为 Dispose 已经由 Designer 实现)。

            因此,例如,如果我的表单拥有一种字体,我可以通过将其添加到这样的组件来确保它被处理:

    1. public partial class Form1 : Form
    2. {
    3. Font coolFont;
    4. public Form1()
    5. {
    6. InitializeComponent();
    7. this.coolFont = new Font("Comic Sans", 12);
    8. components.Add(this.coolFont);
    9. }
    10. }

    3.2 不可见组件

            当您向表单添加非 UI 组件(例如 Timer 组件)时,组件将成为这些组件的父级。设计器文件中的代码确保在处置表单时处置这些组件。如果您没有在设计时将任何此类组件添加到表单中,则组件将为空。

            由于组件是设计器生成的,并且如果您在表单上没有非 UI 组件(在设计时),它将为空,我个人会选择以其他方式管理这些组件,将它们放置在表单关闭或类似的东西上。

    3.3 其它理解

            我试图更深入地理解这一点。我曾尝试在设计时添加组件,但组件实例变量仍然始终为空。如果组件实例变量设置为 null 以外的值,我在哪里可以找到设置它的代码?

            我通过添加来自设计器的 SerialPort 组件,在设计器生成的代码中设置组件实例变量。所以我现在明白了。我希望它在不使用时不会生成组件和 Dispose 代码,这样可以避免混淆并减少代码,但是 whatchucando

            components 变量等效于表单的 Controls 变量。它跟踪表单上的所有控件。使一个窗体在关闭时可以自动处理所有控件,这是一项非常重要的清理工作。

            表单类没有等效的成员来跟踪在设计时放置在其上的所有组件,因此设计人员会自动处理它。

            请注意,将 Dispose() 方法从 Designer.cs 文件移动到主表单源代码文件是完全可以接受的。我强烈建议您这样做,没有理由以任何方式使 Form 类“特别”,它只是一个像其他任何类一样的托管类。在 base.Dispose 调用之前添加 Dispose() 调用以根据需要处理成员。

    三、基本的控件

            我们建立一个基本窗口,该窗口可以打开一个图片文件并显示;而且,可以保存成其它文件名称。如下:

     3.1 UI实现步骤

    1)首先按照第二节中建立空的窗口。

    2)进入UI设计,并从IDE开发环境选【工具】菜单

    3)选择三个按钮,改外观后,双击,自动引入空程序代码。

    4)填充代码如下:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace sharpC_first
    11. {
    12. public partial class Form1 : Form
    13. {
    14. public Form1()
    15. {
    16. InitializeComponent();
    17. }
    18. private string pathname = string.Empty;
    19. private void button1_Click(object sender, EventArgs e)
    20. {
    21. OpenFileDialog file = new OpenFileDialog();
    22. file.InitialDirectory = ".";
    23. file.Filter = "所有文件(*.*)|*.*";
    24. file.ShowDialog();
    25. if (file.FileName != string.Empty)
    26. {
    27. try
    28. {
    29. pathname = file.FileName;   //获得文件的绝对路径
    30.                     this.pictureBox1.Load(pathname);
    31. }
    32. catch (Exception ex)
    33. {
    34. MessageBox.Show(ex.Message);
    35. }
    36. }
    37. }
    38. private void button2_Click(object sender, EventArgs e)
    39. {
    40. SaveFileDialog save = new SaveFileDialog();
    41. save.ShowDialog();
    42. if (save.FileName != string.Empty)
    43. {
    44. pictureBox1.Image.Save(save.FileName);
    45. }
    46. }
    47. private void button3_Click(object sender, EventArgs e)
    48. {
    49. this.Close();
    50. }
    51. }
    52. }

     3.2 测试代码

    执行(不调试)菜单的选项,可以执行程序。如下:

    1 点击【打开】:出现文件读入对话框。

    2 显示如下 

     

     小节

            我们将以棋盘为例,实现一个可以对弈的象棋程序。下篇博文我们继续实现。

  • 相关阅读:
    通过xhr实现文件上传功能,使用jQuery实现文件上传功能
    新入职一家公司需要去实践和注意的内容
    按照前序输入创建二叉树并以前序遍历二叉树
    2022年陕西水利水电施工安全员模拟试题及答案
    Matlab-resample
    【CV】第 3 章:使用 PyTorch 构建深度神经网络
    python播放声音库playsound以及获取路径以及修改库源码
    Map和Set
    ubuntu14.04 AR5B22 无线网卡连不上 AP 问题解决
    web网页设计期末课程大作业:美食餐饮文化主题网站设计——中华美德6页面HTML+CSS+JavaScript
  • 原文地址:https://blog.csdn.net/gongdiwudu/article/details/127716335