|
|
本帖最后由 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;
}
}
这样一来,只要设置好对应的图片和音频、文本,就大功告成了,快添加到你的窗口试试吧。
以下是我的效果图:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|