c# 笔记 多个checkbox 点击其一个设置为选择状态 其他则为非选择状态 c# WndProc方法 base.WndProc(ref m);

多个checkbox 点击其一个设置为选择状态 其他则为非选择状态

在一个 CheckBox 被选中时将其他 CheckBox 设置为未选中状态。这可以通过循环遍历 CheckBox 控件并根据当前选中的 CheckBox 来设置其状态来实现。

下面是一个示例代码,展示了如何实现这个功能:

using System;
using System.Windows.Forms;namespace CheckBoxExample
{public partial class MainForm : Form{// 定义四个 CheckBox 控件private CheckBox checkBox1;private CheckBox checkBox2;private CheckBox checkBox3;private CheckBox checkBox4;public MainForm(){InitializeComponent();// 初始化 CheckBox 控件checkBox1 = new CheckBox() { Text = "选项 1", Location = new System.Drawing.Point(50, 50) };checkBox2 = new CheckBox() { Text = "选项 2", Location = new System.Drawing.Point(50, 80) };checkBox3 = new CheckBox() { Text = "选项 3", Location = new System.Drawing.Point(50, 110) };checkBox4 = new CheckBox() { Text = "选项 4", Location = new System.Drawing.Point(50, 140) };// 订阅 CheckBox 的 CheckedChanged 事件checkBox1.CheckedChanged += CheckBox_CheckedChanged;checkBox2.CheckedChanged += CheckBox_CheckedChanged;checkBox3.CheckedChanged += CheckBox_CheckedChanged;checkBox4.CheckedChanged += CheckBox_CheckedChanged;// 将 CheckBox 控件添加到窗体的控件集合中this.Controls.Add(checkBox1);this.Controls.Add(checkBox2);this.Controls.Add(checkBox3);this.Controls.Add(checkBox4);}// CheckedChanged 事件处理程序private void CheckBox_CheckedChanged(object sender, EventArgs e){// 将 sender 转换为 CheckBox 类型CheckBox selectedCheckBox = sender as CheckBox;// 如果 CheckBox 被选中,则将其他 CheckBox 设置为未选中状态if (selectedCheckBox != null && selectedCheckBox.Checked){foreach (CheckBox checkBox in this.Controls){if (checkBox != selectedCheckBox){checkBox.Checked = false;}}}}[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MainForm());}}
}

代码解析:

  1. 定义四个 CheckBox 控件:
    MainForm 类中定义四个 CheckBox 控件。

  2. 初始化 CheckBox 控件:
    MainForm 的构造函数中,初始化每个 CheckBox 控件,设置它们的文本和位置,并将它们添加到窗体的控件集合中。

  3. 订阅事件:
    使用 CheckedChanged 事件处理程序来处理每个 CheckBox 的状态变化。

  4. 事件处理程序:
    CheckBox_CheckedChanged 方法中,将 sender 参数转换为 CheckBox 类型。如果当前 CheckBox 被选中,则遍历窗体中的所有 CheckBox 控件,并将其他 CheckBox 设置为未选中状态。

  5. 运行程序:
    使用 Application.Run(new MainForm()); 启动应用程序,并显示 MainForm 窗体。

通过这种方式,当一个 CheckBox 被选中时,其他 CheckBox 会自动取消选中状态。这可以确保在任何时候只有一个 CheckBox 被选中。

c# WndProc方法

在 C# 中,WndProc 方法是一个可以重写的方法,用于处理 Windows 消息。它允许你自定义处理各种窗口消息,如鼠标点击、键盘事件等。

以下是一个详细的示例,展示了如何在自定义控件或窗口中重写 WndProc 方法,并处理鼠标点击事件。同时,我们会确保每次点击只处理一次,避免重复执行。

示例代码

using System;
using System.Windows.Forms;public class MyForm : Form
{private bool isMouseClicked;public MyForm(){// 设置表单的大小和标题this.Text = "WndProc 示例";this.Size = new System.Drawing.Size(400, 300);}// 重写 WndProc 方法protected override void WndProc(ref Message m){const int WM_LBUTTONDOWN = 0x0201; // 左键按下消息const int WM_LBUTTONUP = 0x0202;   // 左键抬起消息switch (m.Msg){case WM_LBUTTONDOWN:// 处理左键按下事件Console.WriteLine("鼠标左键按下");isMouseClicked = true;break;case WM_LBUTTONUP:// 处理左键抬起事件Console.WriteLine("鼠标左键抬起");if (isMouseClicked){HandleFileClick();isMouseClicked = false;}break;}base.WndProc(ref m);}private void HandleFileClick(){// 处理文件点击逻辑Console.WriteLine("文件被点击一次");// 在这里添加处理文件点击的逻辑,例如获取文件路径}[STAThread]public static void Main(){Application.Run(new MyForm());}
}

代码解释

  1. 常量定义

    • WM_LBUTTONDOWNWM_LBUTTONUP 是 Windows 消息常量,分别表示鼠标左键按下和抬起。
  2. 重写 WndProc 方法

    • WndProc 方法接收一个 Message 参数,用于表示接收的 Windows 消息。
    • switch 语句根据 m.Msg 的值判断消息类型。
  3. 处理鼠标事件

    • 在处理 WM_LBUTTONDOWN 消息时,设置 isMouseClicked 标志为 true
    • 在处理 WM_LBUTTONUP 消息时,如果 isMouseClicked 标志为 true,则调用 HandleFileClick 方法处理点击逻辑,并将 isMouseClicked 标志重置为 false
  4. 自定义方法 HandleFileClick

    • HandleFileClick 方法用于处理实际的文件点击逻辑,例如获取文件路径。此方法在 WM_LBUTTONUP 消息处理时调用。
  5. 应用程序入口

    • Main 方法是应用程序的入口,调用 Application.Run 方法启动应用程序并显示表单。

防止重复执行

通过使用 isMouseClicked 标志,我们可以确保每次鼠标点击只处理一次,而不会因为多次触发 WM_LBUTTONUP 消息而重复执行文件点击逻辑。这种方法可以有效防止短时间内多次触发同一事件的情况。

进一步改进

如果需要进一步防止短时间内的多次点击处理,可以使用计时器或其他机制。例如,使用 Timer 控件来设置一个最小处理间隔时间:

using System;
using System.Windows.Forms;public class MyForm : Form
{private Timer clickTimer;private bool canHandleClick;public MyForm(){// 设置表单的大小和标题this.Text = "WndProc 示例";this.Size = new System.Drawing.Size(400, 300);// 初始化计时器clickTimer = new Timer();clickTimer.Interval = 300; // 设置为300毫秒,防止短时间内多次点击clickTimer.Tick += (s, e) => canHandleClick = true;canHandleClick = true;}// 重写 WndProc 方法protected override void WndProc(ref Message m){const int WM_LBUTTONUP = 0x0202; // 左键抬起消息if (m.Msg == WM_LBUTTONUP && canHandleClick){HandleFileClick();canHandleClick = false;clickTimer.Start();}base.WndProc(ref m);}private void HandleFileClick(){// 处理文件点击逻辑Console.WriteLine("文件被点击一次");// 在这里添加处理文件点击的逻辑,例如获取文件路径}[STAThread]public static void Main(){Application.Run(new MyForm());}
}

通过这种方式,您可以确保在指定的时间间隔内只处理一次文件点击事件,进一步防止重复执行的问题。

c# base.WndProc(ref m);

base.WndProc(ref m); 是调用基类(在这种情况下是 Form 类)的 WndProc 方法。WndProc 是处理 Windows 消息的一个方法,每当窗口接收到一条消息时,都会调用这个方法。通过调用 base.WndProc(ref m);,你确保了基类的消息处理逻辑得到了执行,不会因重写 WndProc 而丢失原有的消息处理功能。

详细解释

在 Windows 应用程序中,每个窗口(包括表单)都会接收到来自操作系统的各种消息,例如键盘输入、鼠标点击、窗口重绘等。这些消息通过 WndProc 方法进行处理。WndProc 方法有一个参数 ref Message m,其中 Message 是一个结构体,包含消息的类型、参数等信息。

代码示例

假设你有一个自定义的 Form 类,并且需要处理某些特定的消息,例如鼠标点击:

using System;
using System.Windows.Forms;public class MyForm : Form
{protected override void WndProc(ref Message m){const int WM_LBUTTONDOWN = 0x0201; // 鼠标左键按下消息// 检查消息类型是否为鼠标左键按下if (m.Msg == WM_LBUTTONDOWN){// 处理鼠标左键按下事件Console.WriteLine("Mouse left button down detected.");}// 调用基类的 WndProc 方法,确保默认消息处理逻辑的执行base.WndProc(ref m);}[STAThread]public static void Main(){Application.Run(new MyForm());}
}

工作原理

  1. 定义消息常量

    • WM_LBUTTONDOWN 是 Windows 消息的一个常量,表示鼠标左键按下。
  2. 重写 WndProc 方法

    • 使用 if (m.Msg == WM_LBUTTONDOWN) 检查消息类型是否为鼠标左键按下。
    • 如果是,则执行自定义的处理逻辑,例如在控制台输出一条消息。
    • 最后,调用 base.WndProc(ref m);,将消息传递给基类进行默认处理。

为什么要调用 base.WndProc(ref m);

调用 base.WndProc(ref m); 的原因是确保基类的默认消息处理逻辑能够执行。例如,Form 类的 WndProc 方法处理许多基本的窗口操作,如移动、调整大小、关闭等。如果不调用 base.WndProc(ref m);,则这些默认的行为可能会被你的重写方法阻断,从而导致窗口无法正常工作。

总结

base.WndProc(ref m); 是确保在自定义消息处理逻辑之后,基类的默认消息处理逻辑仍然能够执行的重要调用。这对于维护应用程序的正常运行是至关重要的。在重写 WndProc 方法时,始终要记得在适当的位置调用 base.WndProc(ref m);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 基础面试300题 (171- 200)

Java 基础面试300题 (171- 200) 171.什么是同步? 当多个线程试图同时访问共享资源时,那么他们需要以某种方式让资源一次只能由一个线程访问。实现这一目标的过程被称为同步。Java提供了一个名为synchronized的关键字实现这一目标…

CSS选择器的常见用法

大家好,本期博客整理了前端语言 CSS 中选择器的入门级常见用法,希望能对大家有所帮助 CSS 选择器的主要功能就是选中⻚⾯指定的标签元素,选中了元素,才可以设置元素的属性。 那么,css选择器有哪几种呢? 以…

全面理解渗透测试

揭秘网络安全的秘密武器:全面理解渗透测试 在数字化时代,网络安全已成为人们关注的焦点。网络攻击和数据泄露事件频发,给个人、企业和国家带来了巨大的损失。为了应对这一挑战,渗透测试作为一种重要的网络安全评估手段&#xff0…

Docker-----emqx部署

emqx通过Docker容器化部署流程 1.创建持久化挂载目录 mkdir -p /home/emqx/etc ------挂载emqx的配置文件目录 mkdir -p /home/emqx/data ------挂载emqx的存储目录 mkdir -p /home/emqx/log ------挂载emqx的日志目录 [root home]# mkdir -p /home/emqx/etc [root home]# mkd…

【Redis】 使用Java操作Redis的客户端

文章目录 🍃前言🌴项目的创建🎋引入依赖🌳配置端⼝转发🌲更改 Redis 配置文件🎄连接 Redis Server⭕总结 🍃前言 我们使用 Java 操作 Redis 客户端时我们需要进行以下操作。 注意:J…

Wormhole勒索病毒的最新威胁:如何恢复您的数据?

导言 随着互联网的飞速发展,网络安全问题愈发凸显其重要性。近年来,勒索病毒成为了网络安全领域的一大威胁,其中.Wormhole勒索病毒因其独特的传播方式和强大的破坏性,引起了全球范围内的广泛关注。本文91数据恢复旨在深入探讨.Wo…

Linux上部署和安装MinIO

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法,大数据,深度学习 💒 公众号…

架构师如何以打游戏的心态做开发?

为什么打游戏可以很好玩,能够自发学习,从青铜到黄金很简单。换个角度思考🤔,以打游戏的心态如何进行架构开发,可以采用以下策略: 设定目标和里程碑: 就像游戏中的任务和关卡一样,为…

2024年6月1日 (周六) 叶子游戏新闻

Embracer探讨单机游戏大作涨价超过70美元的可能性在Embracer集团等待公布新公司名称的同时,他们对游戏大作的价格上涨做出了评论。几年来,游戏大作的价格已经达到了70美元的门槛。Embracer集团的CEO Lars Wingefors在采访中表示,电子游戏行业…

vulnhub靶场之FunBox-10

一.环境搭建 1.靶场描述 As always, its a very easy box for beginners. This works better on VitualBox rather than VMware 2.靶场下载 Funbox: Under Construction! ~ VulnHub 3.靶场启动 靶场IP地址我们不知道,但是网段我们知道是192.168.2.0/24 二.信息…

stack学习

std::stack 类是一种容器适配器,它给予程序员栈的功能——特别是 FILO(先进后出)数据结构。该类模板用处为底层容器的包装器——只提供特定函数集合。栈从被称作栈顶的容器尾部推弹元素。 operator 赋值给容器适配器 (公开成员函数) 元素访问…

Base64码转换

title: Base64码转换 date: 2024-06-01 20:30:28 tags: vue3 后端图片前端显示乱码 现象 后端传来一个图片,前端能够接收,但是console.log()后发现图片变成了乱码,但是检查后台又发现能够正常的收到了这张图片。 处理方法 笔者有尝试将图…

Java关键字详解

文章目录 什么是关键字?数据类型(10个)byte、char、boolean、short、int、float、long、double、void、enum 流程控制(12个)if、else、do、while、for 、switch、case、assertbreak(跳出循环)co…

Orchestrator 记录

Orchestrator 安装 Orchestrator cd /usr/local/orchestrator nohup ./orchestrator --configorchestrator.conf.json http >> orchestrator.log 2>&1 & tailf orchestrator.log访问 http://10.XX.36.216:30000实例管理命令 discover forget begin-maintena…

STM32(八):独立看门狗 (标准库函数)

前言 上一篇文章介绍了STM32单片机中的USART串口通信,这篇文章我们来介绍一下如何用STM32单片机中的独立看门狗来实现检测按键点灯的程序。 一、实验原理 单片机系统会由于受到外界的干扰,而造成程序执行紊乱,系统无法正常运行。为了防止这…

STL:stack和queue

文章目录 stack的介绍和使用stack的介绍stack的使用stack的模拟实现 queue的介绍和使用queue的介绍queue的使用queue的模拟实现 priority_queue的介绍和使用priority_queue的介绍priority_queue的使用优先级队列的模拟实现 deque的介绍deque的结构deque的缺陷为什么选择deque作…

Django ORM魔法:用Python代码召唤数据库之灵!

探索Django ORM的神奇世界,学习如何用Python代码代替复杂的SQL语句,召唤数据库之灵,让数据管理变得轻松又有趣。从基础概念到高级技巧,阿佑带你一步步成为Django ORM的魔法师,让你的应用开发速度飞起来! 文…

golang线程池ants-四种使用方法

目录 1、ants介绍 2、使用方式汇总 3、各种使用方式详解 3.1 默认池 3.2 普通模式 3.3 带参函数 3.4 多池多协程 4、总结 1、ants介绍 众所周知,goroutine相比于线程来说,更加轻量、资源占用更少、无线程上下文切换等优势,但是也不能…

前端Vue小兔鲜儿电商项目实战Day06

一、本地购物车 - 列表购物车 1. 基础内容渲染 ①准备模板 - src/views/cartList/index.vue <script setup> const cartList [] </script><template><div class"xtx-cart-page"><div class"container m-top-20"><div…

React@16.x(15)PureComponent 和 memo

目录 1&#xff0c;什么是 PureComponent2&#xff0c;什么是 memo3&#xff0c;举例3.2&#xff0c;优化13.1&#xff0c;优化2-函数位置 4&#xff0c;注意点4.1&#xff0c;为了提升效率&#xff0c;应该尽量使用 PureComponent4.2&#xff0c;不要直接改变之前的状态&#…