- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在做一个项目,其中我需要添加一个形状为圆形的控件,中间有一些文本。
我的问题是圆圈太小,当我调整它的大小时,它会与其他控件重叠。我想绘制与正方形宽度相同的圆。
否则。如何使控件的背景透明?
我正在使用下面的代码:
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();
}
}
}
最佳答案
这是一个派生自Control
的自定义控件,可以做成半透明的。
界面是一个彩色圆圈,可以包含几个数字。
控件公开了这些自定义属性:
Opacity
:控件BackGround
的不透明度级别 [0, 255]
InnerPadding
:内部矩形之间的距离,它定义了圆边界和控件边界。FontPadding
:文本与内矩形之间的距离。
透明度是通过覆盖 CreateParams 获得的, 然后设置 ExStyle |= WS_EX_TRANSPARENT;
Control.SetStyle()方法用于修改控件行为,添加这些 ControlStyles :
▶ ControlStyles.Opaque
:防止绘制控件的背景,因此不受系统管理。结合CreateParams设置Control的Extended Style为WS_EX_TRANSPARENT
,Control变得完全透明。
▶ ControlStyles.SupportsTransparentBackColor
控件接受其 BackGround
颜色的 Alpha 值。如果不同时设置 ControlStyles.UserPaint
,它将不会用于模拟透明度。我们自己正在通过其他方式做到这一点。
要在工作中查看它,请创建一个新的类文件,用此代码替换其中的所有代码保留 namespace 并构建项目/解决方案。
新的自定义控件将出现在工具箱中。将其放在表单上。根据需要修改其自定义属性。
控件的可视化表示:
注意事项及免责声明:
Segoe UI
,因为该字体有一个基线,可以简化文本在圆形区域中间的位置。using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Windows.Forms;
[DesignerCategory("Code")]
public class RoundCenterLabel : Label, INotifyPropertyChanged, ISupportInitialize
{
private const int WS_EX_TRANSPARENT = 0x00000020;
private bool IsInitializing = false;
private Point MouseDownLocation = Point.Empty;
private readonly int fontPadding = 4;
private Font m_CustomFont = null;
private Color m_BackGroundColor;
private int m_InnerPadding = 0;
private int m_FontPadding = 25;
private int m_Opacity = 128;
public event PropertyChangedEventHandler PropertyChanged;
public RoundCenterLabel() => InitializeComponent();
private void InitializeComponent()
{
SetStyle(ControlStyles.Opaque |
ControlStyles.SupportsTransparentBackColor |
ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
m_CustomFont = new Font("Segoe UI", 50, FontStyle.Regular, GraphicsUnit.Pixel);
BackColor = Color.LimeGreen;
ForeColor = Color.White;
}
protected override CreateParams CreateParams {
get {
var cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}
public new Font Font
{
get => m_CustomFont;
set {
m_CustomFont = value;
if (IsInitializing) return;
FontAdapter(value, DeviceDpi);
NotifyPropertyChanged();
}
}
public override string Text {
get => base.Text;
set { base.Text = value;
NotifyPropertyChanged();
}
}
public int InnerPadding {
get => m_InnerPadding;
set {
if (IsInitializing) return;
m_InnerPadding = ValidateRange(value, 0, ClientRectangle.Height - 10);
NotifyPropertyChanged(); }
}
public int FontPadding {
get => m_FontPadding;
set {
if (IsInitializing) return;
m_FontPadding = ValidateRange(value, 0, ClientRectangle.Height - 10);
NotifyPropertyChanged();
}
}
public int Opacity {
get => m_Opacity;
set { m_Opacity = ValidateRange(value, 0, 255);
UpdateBackColor(m_BackGroundColor);
NotifyPropertyChanged();
}
}
public override Color BackColor {
get => m_BackGroundColor;
set { UpdateBackColor(value);
NotifyPropertyChanged();
}
}
protected override void OnLayout(LayoutEventArgs e)
{
base.OnLayout(e);
base.AutoSize = false;
}
private void NotifyPropertyChanged([CallerMemberName] string PropertyName = null)
{
InvalidateParent();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
MouseDownLocation = e.Location;
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.Button == MouseButtons.Left) {
var loc = new Point(Left + (e.X - MouseDownLocation.X), Top + (e.Y - MouseDownLocation.Y));
InvalidateParent();
BeginInvoke(new Action(() => Location = loc));
}
}
private void InvalidateParent()
{
Parent?.Invalidate(Bounds, true);
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
using (var format = new StringFormat(StringFormatFlags.LineLimit | StringFormatFlags.NoWrap, CultureInfo.CurrentUICulture.LCID))
{
format.LineAlignment = StringAlignment.Center;
format.Alignment = StringAlignment.Center;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
using (var circleBrush = new SolidBrush(m_BackGroundColor))
using (var foreBrush = new SolidBrush(ForeColor))
{
FontAdapter(m_CustomFont, e.Graphics.DpiY);
RectangleF rect = InnerRectangle();
e.Graphics.FillEllipse(circleBrush, rect);
e.Graphics.DrawString(Text, m_CustomFont, foreBrush, rect, format);
};
};
}
public void BeginInit() => IsInitializing = true;
public void EndInit()
{
IsInitializing = false;
Font = new Font("Segoe UI", 50, FontStyle.Regular, GraphicsUnit.Pixel);
FontPadding = m_FontPadding;
InnerPadding = m_InnerPadding;
}
private RectangleF InnerRectangle()
{
(float Min, _) = GetMinMax(ClientRectangle.Height, ClientRectangle.Width);
var size = new SizeF(Min - (m_InnerPadding / 2), Min - (m_InnerPadding / 2));
var position = new PointF((ClientRectangle.Width - size.Width) / 2,
(ClientRectangle.Height - size.Height) / 2);
return new RectangleF(position, size);
}
private void FontAdapter(Font font, float dpi)
{
RectangleF rect = InnerRectangle();
float fontSize = ValidateRange(
(int)(rect.Height - m_FontPadding), 6,
(int)(rect.Height - m_FontPadding)) / (dpi / 72.0F) - fontPadding;
m_CustomFont.Dispose();
m_CustomFont = new Font(font.FontFamily, fontSize, font.Style, GraphicsUnit.Pixel);
}
private void UpdateBackColor(Color color)
{
m_BackGroundColor = Color.FromArgb(m_Opacity, Color.FromArgb(color.R, color.G, color.B));
base.BackColor = m_BackGroundColor;
}
private int ValidateRange(int Value, int Min, int Max)
=> Math.Max(Math.Min(Value, Max), Min); // (Value < Min) ? Min : ((Value > Max) ? Max : Value);
private (float, float) GetMinMax(float Value1, float Value2)
=> (Math.Min(Value1, Value2), Math.Max(Value1, Value2));
}
关于c# - 带文字的半透明圆形控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51396681/
我想要一个“真正的”圆形 UIView,以避免应用圆角半径的正方形 View 。 因为我使用的是重力,我的圆圈不能很好地显示,因为它们在角落里不能相互接触(屏幕来自“Debug View Hierar
所以我前段时间建了一点突破克隆 ,我想稍微升级一下,主要是为了碰撞。当我第一次制作它时,我在我的球和我的砖 block 之间进行了基本的“碰撞”检测,这实际上将球视为另一个矩形。但这造成了边缘碰撞的问
我正在尝试在矩形内创建一个椭圆形/圆形。我正在尝试在 Canvas 上对位图图像执行此操作。这是我的代码: int x = (int) (midpoint.x*xRatio); int y = (in
我想知道是否可以绘制圆形 UIButton(不是圆形矩形)。 当我在自定义类型的 UIButton 中添加圆形图像时,它看起来像一个圆形按钮。但是在按钮被点击的那一刻,按钮的边界变得可见,所以它看起来
我有this slider在我的网站上。我想将 slider 移动到 360 度。我如何更改以下脚本来执行此操作? $(document).ready(function() { /*Slide
我正在 PyQt 中使用 QGraphicsView 构建一个 GUI,它将显示互连项目的大型网络,并且我希望能够叠加一个较小的门户来显示网络的远处部分 - 有点像“画中画” “之类的事情。这本身并不
我正在尝试为个人资料图片圈出 ImageView 。在我限制 UiScreen 宽度之前它工作正常。 代码如下 import UIKit class ViewController: UIViewCon
我想创建一个如下所示的圆形 slider 。 但我还想要两个功能。 1) 我想从任意点启动 slider ,但在图 1 中。从0开始。 2) 我想在单个圆形黑色图中包含多个 slider 。 我正在分
我有一个帖子 div,它位于一个奇怪的背景之上,正如您在此屏幕截图中所见 http://i.stack.imgur.com/L5Qj0.png文字越过我想要的区域。我尝试使用 border-radiu
我想知道,如何在 ios 8 或 9 中创建圆形模糊文本输入字段和模糊按钮。我应该使用核心动画还是简单地在 ps 中绘制 png?我从来没有为 UI 使用过 Core Animation,你能推荐一个
我希望在包含在主圆圈中的圆圈底部创建一个深色蒙版。 你可以使用 css masks 来做到这一点吗? 请参阅fiddle Change Profile
我有一个带有 ImageView 的自定义表格 View 单元格。我试图使 ImageView 成为圆形,但它不是圆形的,我无法查明问题所在。 import UIKit class Legislato
最近一直在opencv里瞎折腾,一直在摸索绘图函数(cvCircle(...), cvRectangle(...), etc...)。它们可以正常工作,但我只能在之前加载的图像上绘制它们。 有没有办法
我有一个 FXML 文件、一个 CSS 文件和一个 Controller.java 文件。当鼠标悬停在 FXML 文件中的按钮上时, 例如fx:id="负载" 如何在舞台上创建圆形节点? 我目前正在这
我对圆-矩形相交有疑问。虽然是一个数字我发现了关于它的讨论,我无法得到答案。我的问题是 - 我的 View /窗口 (320 X 480) 有一个矩形下部 (100-200,0-50) .And a
假设我们有以下一组项目 View : View1 -> View2 -> View3 -> ... -> View(n-1) -> View(n) 在经典的 RecyclerView 上,View1
我可以在“didTapAt”事件中在谷歌地图上添加许多标记和圆圈,但我也想删除它们,对于标记我可以在“didTap 标记”事件中执行此操作但我如何才能删除它的形状而不是其他形状? 最佳答案 let c
我正在尝试获得一个圆形的 UIImageView 但它似乎在不同的设备上呈现不同; 在 iPhone Xr 上看起来像这样: 在 iPhone 7 上看起来像这样: 我的高度限制为 60,代码如下:
我想做一个如下图所示的圆形 slider 。jQuery 能够做到这一点吗? 我知道直 slider 的工作原理,但我想制作一个 HTML5 圆形 slider 。这是我在网上找到的 http://j
我有一个包含图像的 UIScrollView。当用户到达最后一张图片并滑动手指查看下一张图片时,我想显示第一张图片。同样,当用户在第一张图片上滑动查看上一张图片时,我想显示最后一张图片。简而言之,这将
我是一名优秀的程序员,十分优秀!