WinForm_初识_事件_消息提示

WinForm开发环境的使用

WinForms,作为 .NET Framework 中用于创建 Windows 应用程序的用户界面的一部分,提供了丰富的控件组件,极大地便利了桌面应用程序的开发。本篇文章将深入探讨 WinForms 中的事件驱动机制和消息提示框的使用方法,旨在帮助开发者更好地理解和运用这些基础知识,以提升开发效率和改善程序的用户体验。

本专栏会持续更新Winform相关教程,可以订阅追更 !!!

软件部署的架构

B/S 架构应用程序

  • B/S 架构应用程序(Web应用程序):浏览器/服务器(Browser/Server)
    • 浏览器将请求发送给Web服务器,Web服务器对请求进行处理,将响应的数据发回浏览器。
    • 应用程序全部部署在服务器端,客户端只有浏览器。
    • 对应各大公司的官网 Web 开发。
         ┌───────────────┐       ┌───────────────┐
         │   客户端      │       │   Web服务器   │
         │   (浏览器)    ├──────>│                │
         │               │       │   应用程序     │
         │               │       │   数据处理     │
         │               │       │   业务逻辑     │
         └───────────────┘       └───────────────┘
                               │
                               │
                               ▼
                       ┌──────────────┐
                       │   数据库     │
                       └──────────────┘
    

C/S 架构应用程序

  • C/S 架构应用程序( Windows、WinForm、桌面应用程序):客户端/服务器( Client/Server )
    • 客户端向服务器发出请求,服务器处理请求并将响应发送给客户端。
    • 应用程序全部或部分部署在客户端,数据库或部分程序在服务器端。
         ┌───────────────┐       ┌───────────────┐
         │   客户端       │       │   服务器端     │
         │   (Windows App│       │   应用程序     │
         │   或桌面App)   ├──────>│   数据处理     │
         │               │       │   业务逻辑     │
         └───────────────┘       └───────────────┘
                               │
                               │
                               ▼
                       ┌──────────────┐
                       │   数据库     │
                       └──────────────┘
                       
      

创建 Windows 应用程序

在 Visual Stuido 中创建 Windows 应用程序的步骤:

  1. 打开 VS2022 或者 其他版本

  2. 创建新项目在这里插入图片描述

  3. 项目类型: Visual C#项目

  4. 模板: Windows应用程序在这里插入图片描述

  5. 配置新项目(设置项目名称、保存的路径、以及.net framework版本)
    在这里插入图片描述

窗口介绍

  1. 菜单区域在这里插入图片描述

  2. 工具栏在这里插入图片描述

  3. 编辑区(可以根据需求,调整大小)在这里插入图片描述

  4. 工具箱(可以尝试拖几个控件到我们的编辑区)在这里插入图片描述

  5. 属性区(可以修改控件的属性和行为)在这里插入图片描述

    • 如果找不到属性窗口:视图 -> 属性窗口(W) F4
  6. 窗体的设计文件(稍后会详细讲解)在这里插入图片描述

  7. 窗体的资源文件在这里插入图片描述

  8. 应用程序的主入口点 Program.cs(将来根据需求,修改里面的代码)在这里插入图片描述

  9. 应用程序的引用在这里插入图片描述

  10. 程序集信息
    在这里插入图片描述

运行项目(可在解决方案右键在资源管理器中显示,找到 Debug 文件中的 exe 文件)。

查看设计窗体 Form1.cs 后台代码

快捷键:选择 Form1.cs + F7
快捷键:再次摁下 shift + F7 可还原窗体

窗体 Form1.cs

选择 Form1.cs + F7,打开后台代码。

冒号在 C# 中有两种特殊的含义:1.类的继承 2.接口的实现。当前类 Form1 是继承自窗体类 Form,自动的就拥有了 Form 类里面相关的属性方法

把窗体 Form1 的名字修改一下,一般主窗体命名为:FrmMain。在这里插入图片描述

FrmMain.cs 中的 partial(部分的) 和 FrmMain.Designer.cs 中的 partial
一样,不是一个类的修饰符,是限定这个类本身的组成部分,叫做部分类。当程序在编译和运行时,会把 FrmMain.cs 中的 FrmMain
类和 FrmMain.Designer.cs 中的 FrmMain 类会编译成一个类。

可以自己在资源管理上右键添加一个新的类(默认图标变成了窗体小图标,因为它就是窗体类,它是继承于 Form 类的):在这里插入图片描述

在 FrmMain.cs 的构造函数中调用窗体的设计 Form1.Designer.cs。

partial class FrmMain
{
    void test()
    {
        //如果想使用cw,在项目右键属性->应用程序输出类型->控制台应用程序
        Console.WriteLine("测试部分类");
    }
}
打开 Form1.Designer.cs 代码文件,这个文件其实就是窗体 Form1 对应的代码文件。我们在窗体 Form1 上拖拽的控件最终都要在这里生成对应的代码模块。


public FrmMain()
{
    this.test();
    InitializeComponent();
}

打开 Form1.Designer.cs 代码中 Windows窗体设计器生成的代码'这个代码块,我们看到里面有对这个窗体的代码(// Form1/FrmMain),有对按钮设计的代码(// button1)。当我们选择窗体或者按钮,在右边属性面板修改对应控件的属性时(比如:标题 Text、背景图片 Image),对应模块的代码就会发生变化。

总结:窗体由两部分构成:窗体的直接代码 Form1.cs 和设计器生成的代码 Form1.Designer.cs,一般 Form1.Designer.cs 的代码我们不需要去动它。

ps:Form1.Designer.cs 中的InitializeComponent方法,是在 Form1.cs 的构造函数中调用的。(当然你可以把 InitializeComponent 中的代码直接粘贴到 Form1.cs 的构造函数中)

窗体的常用属性

选中窗体,找到右边的属性面板。前两个按钮可以选择排序方式:按分类顺序和按字母顺序(都可以)

按字母顺序:

  • Name 属性:控件的 id,Name 属性必须唯一,不能和其他控件相冲突。
  • Text 属性:窗体的标题(win7默认靠左,win8默认在中间,win10默认靠左,可代码修改见下方)
  • MaximizeBox:控制窗体的最大化是否能被点击(双击或者在属性值框都可以修改它的值)
  • WindowState:设置窗体是否自动最大化
    • Normal:正常状态
    • Minimized:启动时窗体最小化
    • Maximized:启动时窗体最大化
  • StartPosition:确定窗体第次出现时的位置。
    • Manual:窗体的位置由location属性确定。可以自己设置相应位置,其代码如下:
      this.StartPosition = FormStartPosition.Manual;
      this.Location = new Point(100,200);//x=100,y=200
      
    • CenterScreen:窗体上当前显示居中显示,并且具有指定的窗体的大小的尺寸。适合用于一个窗口。
    • WindowsDefaultLocation:窗体定位在Windows默认位置,并且具有指定的窗体的大小的尺寸。一般默认为这个。
    • WindowsDefaultBounds:窗体定位在Windows默认位置,其边界也由Windows默认决定。
    • centerparent:窗体在其父窗体的边界内居中。适合于多个窗体,各个窗体之间嵌套。
  • FormBorderStyle:窗口的边框样式,一般在设计时就要确定下来。用户自由调节窗体的大小,会破坏窗体控件布局的美观性,所以我们要禁用窗机大小的调节。
    • None:将窗口设置为无边框、无标题栏。用户无法改变窗口的大小,也无法改变窗口显示的位置;
    • FixedSingle:将窗口设置为固定的单框(窄框),用户无法用鼠标拖动边框改变窗口的大小,但可以通过最大化按钮将窗口最大化、最小化按钮将最小化;
    • Fixed3D:将窗口设置为固定框,3D风格,用户无法用鼠标拖动边框改变窗口的大小,但可以通过最大化按钮将窗口最大化、最小化按钮将最小化。窗口的工作区具有凹陷3D效果;
    • FixedDialog:将窗口设置为固定框,对话框风格,用户无法用鼠标拖动边框改变窗口的大小,但可以通过最大化按钮将窗口最大化、最小化按钮将最小化;
    • Sizable:正常窗口样式,用户可以拖拽大小(默认选项)
    • FixedToolWindow:将窗口设置为固定框,工具窗口风格,用户无法用鼠标拖动边框改变窗口的大小;工具窗口风格的特点是:标题栏高度比较小,且只有关闭按钮
    • SizableToolWindow:和上面风格一样,只是用户可以拖拽大小
  • Icon:窗体左上角的图标。注意图片必须是 .ico 格式的图片 IconFinder
  • Size:控件的大小(以像素为单位)。有 Width 和 Height 构成(整形)
  • Font:用于显示控件中文本的字体。
  • BackgroundImage:用于该控件的背景图像。
  • BackColor:组件的背景色。

ps:选中(点击)每个属性,在下面小窗体中都有对应的解释说明。

ps:在win7和win10设置标题居中的代码方法:

public FrmMain()
{
    test();
    InitializeComponent();
    SetTitleCenter();
}

private void SetTitleCenter()
{
    // 先确随便写一个标题的内容:
    string titleMsg = "Winfrom Title";
    // 获取对Graphics对象的引用:
    Graphics g = this.CreateGraphics();
    // 根据Graphics对象来计算标题的开始居中位置:
    Double startingPoint = (this.Width / 2) - (g.MeasureString(titleMsg, this.Font).Width / 2);
    // 计算一个空字符所占像素长度:
    Double widthOfASpace = g.MeasureString(" ", this.Font).Width;
    // 定义一个空字符串来用作为标题之前做占位:
    String tmp = " ";
    // 定义一个初始占位像素:
    Double tmpWidth = 0;
    // 循环遍历,将startingPoint之前的像素都用空字符代替:
    while ((tmpWidth + widthOfASpace) < startingPoint)
    {
        tmp += " ";
        tmpWidth += widthOfASpace;
    }
    // 最后将标题字符跟换:
    this.Text = tmp + titleMsg;
}

事件驱动机制

事件的应用

计算机中的事件

  • 鼠标按下、键盘按下、鼠标移入移出移动、输入框的文本内容变化…

事件的作用

  • windows系统通过事件处理来响应用户的请求,在没有用户请求之前,事件处于静止等待状态。
    在这里插入图片描述

事件的组成
在这里插入图片描述

提前设置好一个事件(.NET平台设计) ,然后根据需要添加一个事件处理程序(开发者自定义) ,最后将“事件本身”和“处理程序”连接起来(后台自动关联)当用户操作引发事件的时候(比如单击按钮、双击图标等) ,自动调用事件处理程序完成相应任务。

事件的测试

创建一个新的 Windows 窗体应用(.Net FrameWork)项目,把默认窗体 Form1.cs 更名为 FrmMain.cs。

  • 窗体的标题可以更名为:事件的测试,把窗体的位置 StartPosition 设置为屏幕的中央。

  • 打开工具箱,随便拖拽一个按钮 Button,并修改其相关属性

  • Text:修改为“测试按钮的事件”

  • Name:相当于控件的 id,必须是唯一的,修改为“btnTest”。(其实对应的就是修改了FrmMainDesigner.cs 中的代码,在 FrmMainDesigner.cs 中给我们拖拽的按钮生成了代码并定义了变量:private System.Windows.Forms.Button button1;当我们修改了 Name 属性后,对应的变量名就发生了变化:private System.Windows.Forms.Button btnTest;这就是为什么要唯一的原因了:变量名不能重复)

  • 找到属性面板中的事件标签,选中自己要实现的事件类型。比如单击事件 Click,双击 Click 属性,就能在 FrmMain.cs 代码中帮你生成事件的回调函数。

  • 如何删除这个按钮的事件:找到属性面板中的 Click 属性,右键选择重置即可。

  • 另外一种生成事件的回调函数方式:双击窗体中的按钮,默认会生成按钮 的单击 Click 事件。(其他控件基本也是一样的,通过双击一般会生成该控件常用的事件)

  • 注意:删除事件函数时,不能只单单删除 FrmMain.cs 中的事件代码,这个时候运行是会报错的。
    遇到程序报错不要害怕,一般双击第一个报错信息(原因:有时候会有一堆错误,后面的错误有可能是因为第一个主要的错误,导致后面那一系列的错误),就能找到报错的原因及报错的位置。

这里额外解释一下这句代码 this.btnTest.Click += new System.EventHandler(this.btnTest_Click);
这里的 btnTest.Click 是一个事件委托,通过 += 多播的形式,记录所有的点击事件。这里的 this.btnTest_Click 其实就是 FrmMain.cs 代码中生成的事件方法。

在 FrmMain.cs 中的 this.btnTest_Click 方法中加入:Console.WriteLine("点击了按钮"); 或者 MessageBox.Show("点击了按钮"); 点击测试。

再次体验一下 this.btnTest.Click += new System.EventHandler(this.btnTest_Click); 这句代码。

我们再拖拽一个按钮 Button。

  • Text:标题修改为“事件断开”
  • Name:修改为“BtnBreak”
    生成单击事件(双击按钮即可)
    在 BtnBreak 的事件方法中加入:this.btnTest.Click -= new System.EventHandler(this.btnTest_Click);

我们再拖拽一个按钮 Button。

  • Text:标题修改为“事件链接”
  • Name:修改为“BtnLink”在这里插入图片描述
//事件处理程序(函数)
//参数1: 绑定事件的这个控件
//参数2: 事件对象 不同的事件,拥有不同的事件对象
private void btnTest_Click(object sender, EventArgs e)
{
    Console.WriteLine("点击了按钮");
    MessageBox.Show("点击了按钮");
}

生成单击事件(双击按钮即可)

ps:可以多点几次测试多播。

测试事件的级联响应

重点理解:sender 参数的含义及作用。

在窗体中再拖拽一个按钮 Button,命名Name为:BtnTestEvent,Text:测试事件的响应。

// FrmMain.cs
public partial class FrmMain : Form
{
    public FrmMain()
    {
        InitializeComponent();
        // 该方法可以直接从 FrmMain.Designer.cs 中剪切过来
        // 将按钮的单击事件和事件响应方法结合起来
        this.btnTest.Click += new System.EventHandler(this.btnTest_Click);
    }
    // 事件的响应方法
    private void btnTest_Click(object sender, EventArgs e)
    {
        Console.WriteLine("点击了按钮");
        MessageBox.Show("点击了按钮");
    }
    private void BtnBreak_Click(object sender, EventArgs e)
    {
        this.btnTest.Click -= new System.EventHandler(this.btnTest_Click);
    }
    private void btnLink_Click(object sender, EventArgs e)
    {
        this.btnTest.Click += new System.EventHandler(this.btnTest_Click);
    }
}

ps:在窗体上按住 Ctrl + 拖拽某个控件,可以快速生成控件。

再生成三个按钮:

  • 命名Name为:btnAndy,Text:Andy老师
  • 命名Name为:btnCarry,Text :Carry老师
  • 命名Name为:btnCoco,Text:Coco老师

自己来实现一个单击事件:
给三个按钮添加同一个事件响应方法。

常用控件的事件

  • 窗体的重要事件:
    • Load :窗体加载事件(应用较少)
    • FormClosing:窗体关闭之前发生的事件
    • FormClosed:窗体关闭以后发生的事件
  • 文本框的重要事件:
    • TextChanged :文本框内容改变事件
    • KeyPress :用户按下某键并释放的时候发生的事件
    • MouseLeave :当鼠标离开文本框的时候发生
  • 下拉框的重要事件:
    • SelectedIndexChanged :当用户选择的下拉项改变的时候发生

事件响应的公共方法

private void btnTeacher_Click(object sender,EventArgs e)
{
    // sender
    // string text = (sender as Button).Text;
    string text = ((Button)sender).Text;
    MessageBox.Show(text);
}
public FrmMain()
{
    InitializeComponent();
    // 该方法可以直接从 FrmMain.Designer.cs 中剪切过来
    // 将按钮的单击事件和事件响应方法结合起来
    this.btnTest.Click += new System.EventHandler(this.btnTest_Click);
    // 给三个按钮添加同一个事件响应方法
    this.btnAndy.Click += new System.EventHandler(this.btnTeacher_Click);
    this.btnCarry.Click += new System.EventHandler(this.btnTeacher_Click);
    this.btnCoco.Click += new System.EventHandler(this.btnTeacher_Click);
}

消息提示的用法

为什么要使用消息框

  • 显示消息
  • 向用户请求信息。在这里插入图片描述在这里插入图片描述

合理使用消息提示框,因为每次弹出都需要用户去做处理,弹出的频率和次数过高,用户也是会感觉很反感的。现在大多数的提示后可以在界面上直接提示,比如:登录注册时,直接在文本框的后面显示红色小字提示。

使用

在窗体上拖拽一个按钮(在控件上直接右键找到属性菜单转到设置面板):Name: Text:测试消息框。
双击按钮,生成事件的响应方法: btnTestMsg_Click。方法内写上:MessageBox.Show(“Test”);

参数格式

MessageBox.Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton)

官方: MessageBox.Show 官方文档

MessageBoxButtons 属性 样式

在这里插入图片描述

MessageBoxIcon属性 样式

在这里插入图片描述

示例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _03_消息提示
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 参数1: 提示信息
            // MessageBox.Show("弹出框");
            // 参数2:设置弹出框的标题
            // MessageBox.Show("弹出框", "窗口标题");
            // 参数3:设置一个MessageBoxButtons类型的枚举
            // 参数4:设置图标
            // 参数5:设置默认第几个按钮是默认选中的
            // MessageBox.Show("弹出框", "窗口标题", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button2);
            // 返回值
            // 返回值是枚举类型,可以通过判断枚举的类型来进行下一步操作
            DialogResult res = MessageBox.Show("弹出框", "窗口标题", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button2);
            if (res == DialogResult.Cancel)
            {
                // 取消操作
            }
            else
            {
                // 确认操作
            }
            Console.WriteLine(res);
        }
    }
}

觉得本篇文章写的还不错可以点赞,收藏,关注。主页还有21天速通C#教程欢迎订阅!!!在这里插入图片描述

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值