我正在做一个项目,其中我需要添加一个控件与一些文字在中间的圆圈形状。
我的问题是圆太小了,当我调整它的大小时,它会与其他控件重叠。我想画一个和正方形一样宽的圆。
否则.我怎样才能使控件的背景透明?
我使用下面的代码:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
using (Bitmap bitmap = new Bitmap(this.Width, this.Height))
{
using (Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.Clear(this.BackColor);
using (SolidBrush brush = new SolidBrush(this._FillColor))
{
graphics.FillEllipse(brush, 0x18 - 6, 0x18 - 6, (this.Width - 0x30) + 12, (this.Height - 0x30) + 12);
}
Brush FontColor = new SolidBrush(this.ForeColor);
SizeF MS = graphics.MeasureString(Convert.ToString(Convert.ToInt32((100 / _Maximum) * _Value)), Font);
graphics.DrawString(Convert.ToString(Convert.ToInt32((100 / _Maximum) * _Value)), Font, FontColor, Convert.ToInt32((Width / 2 - MS.Width / 2) + 2), Convert.ToInt32((Height / 2 - MS.Height / 2) + 3));
bitmap.MakeTransparent(this.BackColor);
e.Graphics.DrawImage(bitmap, 0, 0);
graphics.Dispose();
bitmap.Dispose();
}
}
}
1条答案
按热度按时间yyyllmsg1#
这是一个从
Control
派生的自定义控件,它可以设置为半透明。界面是一个彩色圆圈,可以包含几个数字。
该控件公开这些自定义属性:
Opacity
:控件的不透明度级别BackGround
[0, 255]
InnerPadding
:内部矩形(定义圆边界)与控件边界之间的距离。FontPadding
:文本和内部矩形之间的距离。通过覆盖CreateParams,然后设置
ExStyle |= WS_EX_TRANSPARENT;
获得透明度Control.SetStyle()方法用于修改控件行为,添加以下ControlStyles:
▶**
ControlStyles.Opaque
:防止绘制控件的背景,因此它不受系统管理。结合CreateParams将控件的扩展样式设置为WS_EX_TRANSPARENT
,控件将变得完全透明。▶
ControlStyles.SupportsTransparentBackColor
该控件的BackGround
颜色接受Alpha值。如果不设置ControlStyles.UserPaint
,它将不会被用来模拟透明度。我们正在使用其他方法来模拟透明度。要查看它的工作情况,请创建一个新的类文件,用此代码替换其中的所有代码并保留命名空间**,然后构建项目/解决方案。
新的自定义控件将出现在工具箱中。将其拖放到窗体上。根据需要修改其自定义属性。
控件的可视化表示形式:
注意事项和免责声明:
正如这里所介绍的,它可以用来完全重叠表单或其他容器中的其他控件。在这个简化的实现中,不处理部分重叠。
Segoe UI
,因为该字体有一个基线,简化了文本在圆形区域中间的位置。其他字体具有不同的基线,这需要更复杂的处理。
有关基本数学,请参见:TextBox with dotted lines for typing。