如何在自定义绘制的复选框控件上保持透明度
How to keep transparency on a custom painted Checkbox control
我在创建所有者绘制的复选框时遇到问题,因为我不喜欢这些复选框样式。对 Winform 复选框进行子类化并不是什么大不了的事情,并且很容易重绘复选框本身。但我不喜欢文本的位置,因为没有用于定位它的属性。
基本上,清除控件的图形,按照我喜欢的方式和位置绘制复选框和文本。
只是,无法正常工作,因为清除图形会导致黑色矩形,并且您会失去透明度。但如果不清除或覆盖客户区,原始文本将始终与所有者绘制的文本重叠。
有什么解决办法吗?
我现在找到的解决方案是将控件的文本设置为 string.empty
,调用基本 OnPaint 方法并覆盖 OnTextChange 事件。而已。现在我可以准确地按照我想要的方式绘制文本并且控制仍然是透明的:
class mycheckBox
{
private string _Text;
protected override void OnTextChanged(EventArgs e)
{
// Prevent calling paint method on text change
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
_Text = this.Text;
this.Text = string.empty;
base.OnPaint(e);
Text = _Text;
// do your drawing here
}
}
我在创建所有者绘制的复选框时遇到问题,因为我不喜欢这些复选框样式。对 Winform 复选框进行子类化并不是什么大不了的事情,并且很容易重绘复选框本身。但我不喜欢文本的位置,因为没有用于定位它的属性。
基本上,清除控件的图形,按照我喜欢的方式和位置绘制复选框和文本。
只是,无法正常工作,因为清除图形会导致黑色矩形,并且您会失去透明度。但如果不清除或覆盖客户区,原始文本将始终与所有者绘制的文本重叠。
有什么解决办法吗?
我现在找到的解决方案是将控件的文本设置为 string.empty
,调用基本 OnPaint 方法并覆盖 OnTextChange 事件。而已。现在我可以准确地按照我想要的方式绘制文本并且控制仍然是透明的:
class mycheckBox
{
private string _Text;
protected override void OnTextChanged(EventArgs e)
{
// Prevent calling paint method on text change
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
_Text = this.Text;
this.Text = string.empty;
base.OnPaint(e);
Text = _Text;
// do your drawing here
}
}