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

本文主要是介绍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);

这篇关于c# 笔记 多个checkbox 点击其一个设置为选择状态 其他则为非选择状态 c# WndProc方法 base.WndProc(ref m);的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022586

相关文章

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

电脑不小心删除的文件怎么恢复?4个必备恢复方法!

“刚刚在对电脑里的某些垃圾文件进行清理时,我一不小心误删了比较重要的数据。这些误删的数据还有机会恢复吗?希望大家帮帮我,非常感谢!” 在这个数字化飞速发展的时代,电脑早已成为我们日常生活和工作中不可或缺的一部分。然而,就像生活中的小插曲一样,有时我们可能会在不经意间犯下一些小错误,比如不小心删除了重要的文件。 当那份文件消失在眼前,仿佛被时间吞噬,我们不禁会心生焦虑。但别担心,就像每个问题

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码,修改这两个地方 3.之后直接运行即可

操作系统实训复习笔记(1)

目录 Linux vi/vim编辑器(简单) (1)vi/vim基本用法。 (2)vi/vim基础操作。 进程基础操作(简单) (1)fork()函数。 写文件系统函数(中等) ​编辑 (1)C语言读取文件。 (2)C语言写入文件。 1、write()函数。  读文件系统函数(简单) (1)read()函数。 作者本人的操作系统实训复习笔记 Linux