基于.NET的Windows窗体编程之WinForms事件简介 事件分类控件通过基类 Control提供 60 多个事件。 其中包括 Paint 导致绘制控件的事件、与显示窗口相关的事件如 Resize 和 Layout 事件以及低级别鼠标和键盘事件。 某些低级别事件由Control合成为语义事件例如Click和DoubleClick。 大多数事件属于以下类别鼠标事件鼠标输入是用户与 Windows 窗体应用程序交互的主要方式。 所有控件都提供与鼠标相关的基本事件MouseClick鼠标单击事件可以获取鼠标更多点击信息MouseDoubleClick鼠标双击事件双击由用户操作系统的鼠标设置决定。 用户可以设置两次单击鼠标按钮之间的时间以便将这两次单击认为是双击而不是两次单击。MouseDown鼠标按下事件MouseEnter鼠标指针进入控件时触发事件MouseHover鼠标放上去事件MouseLeave鼠标离开事件MouseMove鼠标移动事件MouseUp鼠标弹起事件MouseWheel鼠标滚动事件Click鼠标单击事件它仅表示鼠标点击了控件从而触发此事件如果需要更多鼠标信息请使用MouseClick事件。键盘事件如果控件响应用户输入如 TextBox 或 Button 控件则会为控件引发相应的输入事件。 控件需要聚焦才能接收键盘事件。 某些控件如 Label 控件无法聚焦且无法接收键盘事件。 下面是键盘事件的列表KeyDown键盘上的键被按下时触发此事件。KeyPress当控件具有焦点时按下字符、空格或反空间键时发生。它在KeyDown之后触发可以用来阻止字符的输入。KeyUp键盘上的键按下弹起时触发此事件。属性更改事件Windows 窗体对于包含更改事件的属性遵循PropertyNameChanged模式。 Windows 窗体提供的数据绑定引擎可识别此模式并与之很好地集成。 如果属性名称为FirstName则属性更改事件具有如下命名格式将属性命名为FirstName。使用模式PropertyNameChanged为属性创建事件FirstNameChanged。使用模式OnPropertyNameChanged创建私有或受保护的方法OnFirstNameChanged。如果修改了FirstName属性集的后备值则将调用OnFirstNameChanged方法。 该方法OnFirstNameChanged引发FirstNameChanged事件。常见的属性变更事件主要有以下几种BackColorChanged 当 BackColor 属性的值发生更改时触发。BackgroundImageChanged 当 BackgroundImage 属性的值发生更改时触发。BindingContextChanged 当 BindingContext 属性的值发生更改时触发。DockChanged 当 Dock 属性的值发生更改时触发。EnabledChanged 在 Enabled 属性值更改后发生。FontChanged 当 Font 属性值更改时发生。ForeColorChanged 当 ForeColor 属性值更改时发生。LocationChanged 在 Location 属性值更改后发生。SizeChanged 当 Size 属性值更改时发生。VisibleChanged 当 Visible 属性值更改时发生。其他事件控件还会根据控件的状态或其他与控件的交互引发事件。 例如 HelpRequested 如果控件具有焦点并且用户按下 F1 键则会引发该事件。 如果用户在窗体上按下上下文相关的帮助按钮然后按控件上的帮助光标也会引发此事件。另一个示例是当控件更改、移动或调整大小时会引发 Paint 事件。 此事件为开发人员提供了绘制控件和更改其外观的机会。关于事件还有以下两点补充说明每次双击控件时都会引发Click事件。 例如如果控件具有的Click 和 DoubleClick 事件的事件处理程序则双击窗体并调用这两种方法时将引发DoubleClick和Click事件。 如果双击某个控件并且该控件不支持该 DoubleClick 事件则可能会引发 Click 事件两次。在用户按下键盘键时发生两个事件在用户释放键盘键时发生一个事件。KeyDown 事件发生一次。KeyPress 事件当用户按住同一个密钥时可能会多次发生该事件。当用户释放密钥时KeyUp 事件发生一次。窗体的事件顺序了解Windows 窗体应用程序中事件被引发的顺序有助于依次处理每个事件。 当出现需要谨慎处理事件的情况时例如在重绘窗体的某些部件时有必要了解运行时引发事件的确切顺序。Form 和 Control 类公开了一组与应用程序启动和关闭相关的事件。 Windows 窗体应用程序启动时主窗体的启动事件将按照以下顺序引发Control.HandleCreated在为控件创建句柄时触发此事件。Control.BindingContextChanged当 BindingContext 属性的值更改时发生。Form.Load在第一次显示窗体前发生。Control.VisibleChanged当 Visible 属性值更改时发生。Form.Activated当使用代码激活或用户激活窗体时发生。Form.Shown只要窗体是首次显示就发生。应用程序关闭时主窗体的关闭事件将按照以下顺序引发Form.Closing当窗体关闭时发生。此事件已过时请采用 FormClosing 事件。Form.FormClosing当窗体关闭时发生。Form.Closed关闭窗体时发生。此事件已过时请采用 FormClosed事件。Form.FormClosed关闭窗体时发生。Form.Deactivate当窗体失去焦点并不再是活动窗体时发生。在主窗体关闭事件后将引发Application类的ApplicationExit事件。窗体中的坐标Windows 窗体的坐标系基于设备坐标在 Windows 窗体中绘制时的基本度量单位是设备单位通常为像素。 屏幕上的点由 x 坐标和 y 坐标对描述x 坐标向右增加y 坐标从上到下增加。 原点相对于屏幕的位置会有所不同具体取决于是指定屏幕还是客户端坐标。屏幕坐标Windows 窗体应用程序以屏幕坐标指定窗口在屏幕上的位置。 对于屏幕坐标原点为屏幕左上角。 窗口的整个位置通常由一个 Rectangle 结构描述该结构包含两个点的屏幕坐标用于定义窗口的左上角和右下角。客户端坐标Windows 窗体应用程序使用客户端坐标指定窗体或控件中点的位置。 客户端坐标的原点是控件或窗体的客户区左上角。 客户端坐标可确保应用程序可以在窗体或控件中绘图时使用一致的坐标值而不管窗体或控件在屏幕上的位置如何。客户区的尺寸也由一个包含该区域客户端坐标的 Rectangle 结构进行描述。 在所有情况下矩形的左上角坐标包含在客户区中而右下角坐标则不包括在内。 图形操作不包括工作区的右边缘和下边缘。 例如FillRectangle 方法将填充到指定矩形的右边缘和下边缘但不包括这些边缘。有时可能需要从屏幕坐标映射到客户端坐标。 可以使用 PointToClient 类中提供的 PointToScreen 和 Control 方法轻松实现此目的。 例如MousePosition 的 Control 属性是以屏幕坐标表示的但可能需要将其转换为客户端坐标。事件示例在Windows窗体编程中最常用的就是Button(按钮)控件它允许用户通过单击来执行某项操作。Button控件可以同时显示文本和图像。 单击该按钮时看上去它像是被按下并释放。每当用户单击按钮时 就会调用Click事件处理程序 我们可以在 Click 事件处理程序中放置代码以执行您选择的任何操作。Button按钮关键属性与事件Name按钮控件的唯一标识它在一个Form窗体中具有唯一性。Text用于设置按钮上显示的文本内容如果文本超过按钮的宽度它将换行到下一行。 但是如果控件不能容纳其整体高度则会将其剪裁。TextAlign按钮上文本的对齐方式。Image,可以为控件设置图标。ImageAlign按钮上图像的对齐方式。Click事件又称为“点击”事件通过Click事件可以在单击按钮时运行一些代码。如果用户尝试双击Button控件将单独处理每次单击;也就是说该控件不支持双击事件。TextImageRelation文本图像的相对位置它的值类型是一个枚举类型共有5个值Overlay(默认重叠)ImageBeforeText(左图右字)TextBeforeImage(左字右图)ImageAboveText(上图下字)TextAboveImage(上字下图)。为Button按钮添加Click事件具体步骤如下1. 在Form窗体中添加一个按钮控件并命名为btnOk设置Text属性为OK,如下所示2. 在属性窗口切换到事件Tab页⚡️在Click事件右侧的框中双击VisualStudio设计器会自动生成btnOk_Click事件处理方法如下图所示3. 切换到Form窗体对应的类文件便可以看到自动生成的事件处理方法它包含两个参数object sender它表示用户点击的控件本身在这里表示btnOk按钮。EventArgs e它表示点击事件包括的参数数据。默认btnOk_Click方法是空的可以在其中编写需要被执行的代码如弹出一个对话框提示点击了按钮如下所示namespace Okcoder.WinForm.Demo{public partial class FrmEvent: Form{public FrmEvent(){InitializeComponent();}private void btnOk_Click(object sender, EventArgs e){//点击事件被执行的代码MessageBox.Show(你点击了OK按钮);}}}通过Visual Studio调试运行程序当点击按钮时弹出一个带有“你点击了OK按钮”字样的对话框如下所示