找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1441|回复: 2

[经验分享探讨] 【尝试】在Winform中制作红警样式控件(CheckBox篇)

[复制链接]
发表于 2024-12-8 21:43:52 | 显示全部楼层 |阅读模式
本帖最后由 enderseven 于 2024-12-8 21:49 编辑

之前尝试做红警安装包,但没有使用DTA的界面库,所以一些红警样式的控件需要重制。毕竟Winform控件无法很方便的自定义,大多数情况都是继承重写居多,如果不继承重写的话也行,无非就是多搞几个变量和控件的事,但是一旦多了是真不行……所以我在此分享了CheckBox控件的制作方法:


Winform原版的CheckBox点击变颜色,然后样式不能更换,这个时候就要想办法该样式了。而做红警风格的CheckBox,只要文本和图片就行,既要方便的改样式,又可以安图片,还能够按下发出声音,还不会有不喜欢的变色效果……有了!Label!但是这玩意有个致命缺陷……那就是无法设置文字显示在图片后面……但我已经在这条路上走了太远,后续有解决办法再说吧……

首先实现选择框,我们要写一个继承Label的类,加一个Checked属性,接受鼠标点击切换,然后播放声音,类似这样:

public class MizukiLabel : Label
{

        private bool _checked;

        /// <summary>播放的声音。</summary>
        public SoundPlayer CheckSound = new SoundPlayer(文件);

        /// <summary>单纯禁止你选择,因为Enabled属性禁用会导致变灰和不接收事件。</summary>
        public bool CheckDisabled;

        /// <summary>获取或设置标签的选中状态。</summary>
        public bool Checked
        {
            get => _checked; // 返回是否已选中
            set
            {
                _checked = value;
                Image = value ? 选中图片 : 没选中图片; // 选中就放上选中的图片
            }
        }


        public MizukiLabel() : base()
        {
            AutoSize = true;
            BackColor = Color.Transparent; // 一定是透明的
            Checked = Checked; // 调用一下Checked的设置器
            MouseClick += (object sender, EventArgs e) =>
            {
                if (!CheckDisabled & Visible)
                {
                    CheckSound.Play(); // 播放声音
                    Checked = !Checked; // 切换选中状态
                }
            };
        }
}

接着做出文本,因为Label不能把文本放在图片后面,就只能往前面怼空格,而空格的宽度又和字体有关……所以换了字体怼多少空格又得改。

// 以下代码放到上面的类里面

private int _spaceNumber = 4; // 怼四个空格

private string _text;

/// <summary>预留空格数。</summary>
public int SpaceNumber
{
    get => _spaceNumber;
    set
    {
        // 安排空格上去,一定要传递到base.Text属性中,这样才能调用AutoSize的自动大小并显示。
        if (!string.IsNullOrEmpty(base.Text))
            base.Text = new string(' ', value) + Text;
        _spaceNumber = value;
    }
}



/// <summary>获取或设置标签的文本内容,自动添加空格。</summary>
public new string Text
{
    get => _text; // 得到文本
    set
    {
        _text = value;
        base.Text = new string(' ', _spaceNumber) + value;
    }
}


这样一来,只要设置好对应的图片和音频、文本,就大功告成了,快添加到你的窗口试试吧。

以下是我的效果图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2024-12-10 17:10:51 | 显示全部楼层
看不懂,但是大受震撼
回复

使用道具 举报

 楼主| 发表于 2024-12-10 22:16:50 | 显示全部楼层
wenrui124 发表于 2024-12-10 17:10
看不懂,但是大受震撼

宝宝你终于上线了
你知不知道我在家这几天有多想你(
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|Archiver|手机版|管理员邮箱|红警DIY论坛 |网站地图

GMT+8, 2026-5-13 14:46 , Processed in 0.080713 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表