WinForm真入门(7)——Button控件详解
WinForm Button 控件详解
Button(按钮)是 WinForm 中最基础的交互控件,用于触发操作(如:点击登录按钮进入系统)或提交数据(如:写好请假申请后,点击提交,把申请提交给上一级)。以下是其核心功能、高级用法及实践技巧的全面解析:
一、基础属性与事件
属性/事件 | 描述 |
---|---|
基础属性 | |
Text | 按钮显示的文本(支持 & 符号定义快捷键,如 &Save 对应 Alt+S)。 |
Enabled | 是否启用按钮(false 时按钮灰显且无法点击)。 |
Visible | 控制按钮是否可见(隐藏时保留布局空间)。 |
BackColor | 按钮背景色(需结合 FlatStyle 使用)。 |
FlatStyle | 按钮样式:Flat(扁平)、Popup(悬浮效果)、Standard(3D默认)。 |
FlatAppearance | 在FlatStyle 设置为Flat时才生效,BorderColor:边框颜色 ,BorderSize:边框宽度,MouseDownBackColor:当在控件边框内按下鼠标时,控件工作区的颜色MouseOverBackColor:鼠标指针位于控件边框内时,按钮工作区的颜色 |
Dock | 停靠方式(如 DockStyle.Right 将按钮固定在父容器右侧)。 |
Anchor | 锚定边缘(如 Top, Left, Right 保持与父容器左右间距)。 |
DialogResult | 设置对话框结果(如 DialogResult.OK,点击后自动关闭模态窗口)。 |
autoellipsis | 文字超出控件大小,在文字末尾用三个点来表示 省略号 |
Margin | 指定它与其他控件的间距, |
TabIndex | 指示控件的焦点 |
TabStoptabstop | 为true时,tab键可以控制焦点;为false时,tab键无法将焦点落到button上 |
常用事件 | 描述 |
---|---|
Click | 点击事件(最常用,支持鼠标左键或空格键触发)。 |
MouseEnter/Leave | 鼠标进入/离开时触发(用于动态样式)。 |
KeyDown/KeyUp | 按键事件(如监听回车键触发按钮点击)。 |
PreviewKeyDown | 在KeyDown事件触发之前触发 |
二、高级功能与技巧
1. 动态创建按钮
通过代码生成按钮并绑定事件:
Button dynamicBtn = new Button();
dynamicBtn.Text = "动态按钮";
dynamicBtn.Location = new Point(20, 50);
dynamicBtn.Size = new Size(100, 30);
dynamicBtn.Click += (sender, e) => {MessageBox.Show("动态按钮被点击!");
};
this.Controls.Add(dynamicBtn);
2. 自定义按钮样式
圆角按钮:覆盖 OnPaint 方法实现自定义绘制:
public class RoundButton : Button {private int _radius = 10; // 圆角半径private Color _baseColor = Color.FromArgb(51, 161, 224); // 基色protected override void OnPaint(PaintEventArgs e) {GraphicsPath path = new GraphicsPath();path.AddArc(new Rectangle(0, 0, _radius, _radius), 180, 90); // 左上角path.AddArc(new Rectangle(Width - _radius, 0, _radius, _radius), -90, 90); // 右上角path.AddArc(new Rectangle(Width - _radius, Height - _radius, _radius, _radius), 0, 90); // 右下角path.AddArc(new Rectangle(0, Height - _radius, _radius, _radius), 90, 90); // 左下角path.CloseFigure();this.Region = new Region(path);e.Graphics.FillPath(new SolidBrush(_baseColor), path);TextRenderer.DrawText(e.Graphics, Text, Font, ClientRectangle, ForeColor, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);}
}
带图标的按钮:使用 Image 和 ImageAlign 属性:
button1.Image = Image.FromFile("icon.png");
button1.ImageAlign = ContentAlignment.MiddleLeft;
button1.TextAlign = ContentAlignment.MiddleRight;
3. 防止重复点击
在异步操作中禁用按钮,避免重复提交:
private async void button1_Click(object sender, EventArgs e) {button1.Enabled = false;await Task.Run(() => {// 模拟耗时操作Thread.Sleep(2000);});button1.Enabled = true;
}
4. 快捷键绑定
通过 Text 属性:使用 & 符号定义快捷键(如 &Save 对应 Alt+S)。
全局快捷键:监听窗体键盘事件:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {if (keyData == (Keys.Control | Keys.S)) {buttonSave.PerformClick();return true;}return base.ProcessCmdKey(ref msg, keyData);
}
三、性能优化与最佳实践
1、批量操作优化
动态生成多个按钮时,使用 SuspendLayout() 和 ResumeLayout() 减少重绘:
private void GenerateDynamicButtons() {flowLayoutPanel1.SuspendLayout(); // 暂停布局更新:ml-citation{ref="7" data="citationList"}for (int i = 0; i < 5; i++) {var btn = new RoundButton {Text = $"任务 {i + 1}",Size = new Size(120, 40),Tag = i // 标记按钮索引};btn.Click += (sender, e) => {var button = (RoundButton)sender;StartTaskAsync((int)button.Tag); // 启动异步任务};flowLayoutPanel1.Controls.Add(btn);}flowLayoutPanel1.ResumeLayout(); // 恢复布局更新:ml-citation{ref="7" data="citationList"}
}
2、避免高频事件阻塞
在 Click 事件中避免同步耗时操作,改用异步方法或后台线程。
3、线程安全更新
在非 UI 线程中操作按钮属性时,必须通过 Invoke:
this.Invoke((MethodInvoker)delegate {button1.Text = "更新完成";
});
四、常见问题与解决方案
问题场景 | 解决方案 |
---|---|
按钮点击无响应 | 检查 Enabled 是否为 true,确认事件是否绑定,确保按钮未被其他控件遮挡。 |
动态按钮无法显示 | 确认已调用 Controls.Add() 添加到父容器,检查 Visible 是否为 true。 |
自定义样式导致闪烁 | 在自定义控件中启用双缓冲:SetStyle(ControlStyles.OptimizedDoubleBuffer, true);。 |
快捷键与其他控件冲突 | 调整 ProcessCmdKey 逻辑或使用 KeyPreview 属性优先处理窗体按键事件。 |
相关文章:
WinForm真入门(7)——Button控件详解
WinForm Button 控件详解 Button(按钮)是 WinForm 中最基础的交互控件,用于触发操作(如:点击登录按钮进入系统)或提交数据(如:写好请假申请后,点击提交,把申…...
035-Windows抓屏-GDI
Windows抓屏-GDI 一、技术原理 GDI(Graphics Device Interface)抓屏基于Windows系统提供的图形设备接口,通过设备上下文(DC) 实现屏幕内容捕获。核心流程如下: 获取桌面窗口句柄:通过 //获取…...
复古优雅感涂鸦手绘喷漆街头艺术字体 Enter Sonic Graffiti
Enter Sonic Graffiti 是 Rvq Typefoundry 的新字体,具有优雅感的字符集。要创建漂亮的组合,只需混合大写和小写,然后与其他字符形混合即可。新的 Graffiti 字体样式和 .我将这款字体献给我正在与癌症作斗争的母亲。我希望我的母亲和所有受癌…...
4.4 代码随想录第三十五天打卡
121. 买卖股票的最佳时机 (1)题目描述: , (2)解题思路: class Solution { public:int maxProfit(vector<int>& prices) {int len prices.size();if (len 0) return 0;vector<vector<int>> dp(len, vector<int>(2));dp[0][0] - pr…...
PyTorch 深度学习实战(34):神经架构搜索(NAS)实战
在上一篇文章中,我们探讨了联邦学习与隐私保护技术。本文将深入介绍神经架构搜索(Neural Architecture Search, NAS)这一自动化机器学习方法,它能够自动设计高性能的神经网络架构。我们将使用PyTorch实现基于梯度优化的DARTS方法&…...
【python】速通笔记
Python学习路径 - 从零基础到入门 环境搭建 安装Python Windows: 从官网下载安装包 https://www.python.org/downloads/Mac/Linux: 通常已预装,可通过终端输入python3 --version检查 配置开发环境 推荐使用VS Code或PyCharm作为代码编辑器安装Python扩展插件创建第…...
简易Minecraft python
废话多说 以下是一个基于Python和ModernGL的简化版3D沙盒游戏框架。由于代码长度限制,这里提供一个核心实现(约500行),您可以通过添加更多功能和内容来扩展它: python import pygame import moderngl import numpy a…...
Linux信号处理解析:从入门到实战
Linux信号处理全解析:从入门到实战 一、初识Linux信号:系统级的"紧急电话" 信号是什么? 信号是Linux系统中进程间通信的"紧急通知",如同现实中的交通信号灯。当用户按下CtrlC(产生SIGINT信号&…...
2025-04-04 Unity 网络基础5——TCP分包与黏包
文章目录 1 分包与黏包2 解决方案2.1 数据接口2.2 定义消息2.3 NetManager2.4 分包、黏包处理 3 测试3.1 服务端3.2 客户端3.3 直接发送3.4 黏包发送3.5 分包发送3.6 分包、黏包发送3.7 其他 1 分包与黏包 分包、黏包指在网络通信中由于各种因素(网络环境、API …...
Ubuntu 安装 JMeter:为你的服务器配置做好准备
Apache JMeter 是一个开源的负载测试工具,可以用于测试静态和动态资源,确定服务器的性能和稳定性。在本文中,我们将讨论如何下载和安装 JMeter。 安装 Java(已安装 Java 的此步骤可跳过) 要下载 Java,请遵…...
swift-oc和swift block和代理
一、闭包或block 1.1、swift 闭包表达式作为参数的形式 一、闭包的定义 func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) { print(fn(v1, v2)) } 二、调用 exec(v1: 10, v2: 20, fn: { (v1: Int, v2: Int) -> Int in return v1 v2 }) 1.2、swift 闭包表达式作为…...
【数据结构】_队列
hello 友友们~ 今天我们要开始学习队列啦~ 话不多说,让我们开始吧!GO! 1.队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。 队列具有先进先出FIFO(First In First Out) 入队列&#x…...
【软考中级软件设计师】数据表示:原码、反码、补码、移码、浮点数
数据表示 一、数据表示1、整数的表示(1) 原码(2) 反码(3) 补码:(4) 移码 2、浮点数的表示(IEEE 754标准) 一、数据表示 计算机使用的是二进制,也就是0和1的组合。所有的数据,无论是数字、文字还是图片、声音ÿ…...
Linux(十二)信号
今天我们就要来一起学习信号啦!!!还记得小编在之前的文章中说过的ctrlc吗?之前小编没有详细介绍过,现在我们就要来学习啦!!! 一、信号的基本介绍 首先,小编带领大家先一…...
迪杰斯特拉+二分+优先队列+拓扑+堆优化(奶牛航线Cowroute、架设电话线dd、路障Roadblocks、奶牛交通Traffic)
原文地址 https://fmcraft.top/index.php/Programming/2025040402.html 主要算法 迪杰斯特拉Dijkstra 题目列表 P1:奶牛航线Cowroute 题目描述 题目描述 Bessie已经厌倦了农场冬天的寒冷气候,她决定坐飞机去更温暖的地方去度假。不幸的是…...
【数据结构】树的介绍
目录 一、树1.1什么是树?1.2 树的概念与结构1.3树的相关术语1.4 树形结构实际运用场景 二、二叉树2.1 概念与结构2.2 特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 个人主页,点击这里~ 数据结构专栏,点击这里~ 一、树 1.1什么是树࿱…...
【CF】Day24——Codeforces Round 994 (Div. 2) D
D. Shift Esc 题目: 思路: 典DP的变种 如果这一题没有这个变换操作,那么是一个很典型的二维dp,每一个格子我们都选择上面和左边中的最小值即可 而这题由于可以变换,那我们就要考虑变换操作,首先一个显然…...
Python 字典
Python 字典 字典的介绍 字典不仅可以保存值,还能对值进行描述使用大括号来表示一个字典,不仅有值 value ,还有值的描述 key字典里的数据都是以键值对 key-value 的形式来保留的key 和 value 之间用冒号 : 来连接多个键值对之间用逗号 , 来…...
yolov12检测 聚类轨迹运动速度
目录 分割算法api版: 分割算法: yolo_kmean.py 优化版: 第1步,检测生成json 第2步骤聚类: 分割算法api版: import json import os from glob import globimport cv2 import imageio import numpy as np from scipy.ndimage import gaussian_filter1d from scipy.s…...
【Lua】pcall使用详解
目录 基本语法核心作用基础示例示例 1:捕获一个简单错误示例 2:调用不存在的函数 高级用法1. 传递多个参数和接收多个返回值2. 捕获带 error 主动抛出的错误3. 匿名函数与 pcall 使用场景注意事项总结 在 Lua 中,pcall(Protected …...
Floyd 算法 Java
图论算法实践:使用 Floyd 求任意两点最短路(Java 实现) 在图论算法中,Floyd-Warshall 算法是一个经典的动态规划算法,用于在一个加权图中寻找所有点对之间的最短路径。 场景描述 假设我们有一个包含 n 个点的无向图&…...
List结构之非实时榜单实战
像京东、淘宝等电商系统一般都会有热销的商品榜单,比如热销手机榜单,热销电脑榜单,这些都是非实时的榜单。为什么是非实时的呢?因为完全实时的计算和排序对于资源消耗较大,尤其是当涉及大量交易数据时。 一般来说&…...
OCR的备份与恢复
1.简介 在Oracle RAC环境中,ASM(Automatic Storage Management)管理的OCR(Oracle Cluster Registry)是集群的关键组件,存储集群配置和状态信息。 OCR的备份一般指物理备份,系统默认每4个小时自…...
算法思想之双指针(一)
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之双指针(一) 发布时间:2025.4.4 隶属专栏:算法 目录 双指针算法介绍对撞指针:快慢指针: 例题移动零题目链接题目描述算法思路代码实现 复写零题目链接题目描…...
Pascal语言的设备管理
Pascal语言的设备管理 引言 在计算机科学中,设备管理是操作系统的重要组成部分之一。设备管理指的是操作系统对外部设备的控制和协调,实现对各种设备的有效利用。Pascal语言作为一种教育性编程语言,虽然最初并不是为了直接进行设备管理而设…...
【MySQL】DML:添加-修改-删除数据 (数据操作语言) 学习笔记
DML (数据操作语言) 学习笔记 1. 数据表结构 首先创建员工表 employee: CREATE TABLE employee (id int unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) NOT NULL COMMENT 用户名,password varchar(32) DEFAULT 123456 COMMENT 密码,name va…...
React编程高级主题:背压(Backpressure)处理
文章目录 **5.1 背压(Backpressure)概述****5.1.1 缓冲(Buffer)****1. 基本概念****2. 缓冲的实现方式****3. 适用场景****4. 潜在问题** **5.1.2 丢弃(Drop)****1. 基本概念****2. 丢弃的实现方式****3. 适…...
Spring IoCDI
IoC容器 前⾯我们提到IoC控制反转, 就是将对象的控制权交给Spring的IOC容器 ,由IOC容器创建及管理对 象。 也就是bean的存储. 在类上⾯添加 RestController 和 Controller 注解, 就是把这个对象交给Spring管理 , Spring 框架启动时就会加载该类. 把对象…...
COBOL语言的数据库交互
COBOL语言的数据库交互 引言 随着信息技术的不断发展,数据库管理系统(DBMS)已经成为现代应用程序中不可或缺的组成部分。在众多编程语言中,COBOL(Common Business-Oriented Language)以其在商业应用中的稳…...
【C++11(中)】—— 我与C++的不解之缘(三十一)
一、可变参数模版 基本语法: C11支持可变参数模版,简单来说就是支持可变数量参数的函数模版或者类模版; 可变数目的参数被称为参数包,存在两种参数包:模版参数包(表示0个或者多个模版参数),函数参数包(表示…...
JavaScript学习19-事件类型之鼠标事件
1. 2. 3....
文件或目录损坏且无法读取:数据恢复的实战指南
在数字化时代,数据的重要性不言而喻。然而,在日常使用电脑、移动硬盘、U盘等存储设备时,我们难免会遇到“文件或目录损坏且无法读取”的提示。这一提示如同晴天霹雳,让无数用户心急如焚,尤其是当这些文件中存储着重要的…...
python爬虫:小程序逆向实战教程
根据我之前发表的文章,我们进行延伸实战https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序,我们进行搜索 2. 找到我们vx小程序的文件地址,我们就可以进行破解 破解步骤强看…...
第二十节课:python实例五:身体质量指数BMI计算
python实例五:身体质量指数BMI计算 一、问题分析 BMI计算公式: BMI 体重(kg) / 身高(m)^2国际与国内标准对比 分类国际标准国内标准偏瘦<18.5<18.5正常18.5-2518.5-24偏胖25-3024-28肥胖≥30≥28 二、实现要点 输入处理 # 同时接收身高体重…...
八、重学C++—动态多态(运行期)
上一章节: 七、重学C—静态多态(编译期)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146999362?spm1001.2014.3001.5502 本章节代码: cpp/dynamicPolymorphic.cpp CuiQingCheng/cppstudy - 码云 - 开源中…...
思维链 Chain-of-Thought(COT)
思维链 Chain-of-Thought(COT):思维链的启蒙 3. 思维链 Chain-of-Thought(COT)存在问题?2. 思维链 Chain-of-Thought(COT)是思路是什么?1. 什么是 思维链 Chain-of-Thoug…...
React框架的Fiber架构
以下是关于 Fiber 架构 的系统梳理: 一、Fiber 架构的出现背景 React 15 及之前的问题 同步递归渲染:虚拟DOM的diff过程不可中断,导致主线程长时间阻塞。掉帧问题:复杂组件树渲染时,用户交互无法及时响应。无法实现增量渲染:无法拆分任务优先级,无法利用浏览器空闲时间。…...
PCI与PCIe接口的通信架构是主从模式吗?
PCI(Peripheral Component Interconnect)总线在通信架构上本质是主从模式,但其具体实现和角色分配在不同版本(如传统PCI与PCI Express)中存在差异。以下是详细分析: 传统PCI总线的主从模式 (1) 基本架构 主…...
【2011】【论文笔记】THz保护文化遗产——
前言 类型 太赫兹 + 文化保护 太赫兹 + 文化保护 太赫兹+文化保护 期刊 I E E E T R A N S A C T I O N S O N T E R A H E R...
状态机思想编程练习
状态机实现LED流水灯 本次实验,我们将利用状态机的思想来进行Verilog编程实现一个LED流水灯,并通过Modelsim来进行模拟仿真,再到DE2-115开发板上进行验证。 首先进行主要代码的编写。 module led (input sys_clk,input sys_…...
三部门新政力推智能家居 居然智家数智化转型迎利好东风
2025年3月,工业和信息化部、教育部、市场监管总局联合印发《轻工业数字化转型实施方案》,明确提出重点培育智能家居、智能穿戴、智能骑行、智慧养老等消费端场景,深化人工智能技术在家电、家具等领域的应用,推动产业链供应链智能化…...
CCF GESP C++编程 七级认证真题 2025年3月
C 七级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 B A B C B B B A D D A C B B D 一、单选题 第 1 题 下列哪个选项是C中的关键字? A. function B. class C. method D. object 第 2 题 下面代码输出的是() int main()…...
【MySQL】navicat16 result字段识别不了
在mysql里面使用result字段 打印出来为空 之后换了个字段命名 使用outcome 成功能打印出来了。。 不知道是不是版本的问题...
【教学类-102-02】自制剪纸图案(留白边、沿线剪)02——Python+PS自动化添加虚线边框
背景需求: 01版本实现了对透明背景png图案边界线的扩展,黑线实线描边 【教学类-102-01】自制剪纸图案(留白边、沿线剪)01-CSDN博客文章浏览阅读974次,点赞15次,收藏7次。【教学类-102-01】自制剪纸图案(留白边、沿线剪)01https://blog.csdn.net/reasonsummer/article…...
CExercise_05_1函数_1.1素数(要对键盘录入的数据做参数校验)
题目: 编写函数实现以下功能: 键盘录入一个正整数,请判断它是否是一个素数,然后控制台输出对应的结果。要对键盘录入的数据做参数校验,素数是一个大于1的自然数,它仅能被1和自身整除。 关键点 分析…...
运算放大器(五)电压比较器
比较器在最常用的简单集成电路中排名第二,仅次于排名第一的运算放大器。 电压比较器是一种用来比较输入信号电压与参考电压大小,并将比较结果以高电平或低电平形式输出的一种信号处理电路,广泛应用于各种非正弦波的产生和变换电路中…...
蓝桥杯_PCF8591
目录 一 前言 二 引言 三 PCF8591介绍 (1)I2C通信 (2)原理图中的8591 四 代码层面 (1)根据题目所给的示范代码,实现ADC 1 为什么需要返回值,同时返回值是unsigned char&#x…...
Windows修改hosts文件让向日癸软件联网
Windows修改hosts文件让向日癸软件联网 前言一、查看向日葵软件使用的网址及IP1.清除dns记录2.打开向日葵软件并将dns记录导出txt 二、修改Windows服务器的hosts文件1.winx选择Windows PowerShell(管理员)2.在Windows PowerShell中输入如下内容:3.在hosts文件最后添…...
[MySQL初阶]MySQL数据类型
MySQL数据类型 1. 数据类型分类2. 数值类型2.1 tinyint类型2.2 bit类型2.3 float类型2.4 decimal类型3. 字符串类型3.1 char3.2 varchar3.3 日期和时间类型3.4 enum和set1. 数据类型分类 数据库中的类型决定了在存储位置中,占据的空间大小以及如何识别的问题。 2. 数值类型 2…...
JS用ES6和ES5分别实现:8字节长整数和字节数组的互转
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...