在表单上绘制自定义图标

Posted

技术标签:

【中文标题】在表单上绘制自定义图标【英文标题】:Drawing custom icon on form 【发布时间】:2011-09-12 09:51:46 【问题描述】:

我正在 C# winforms 中创建一个自定义控件。我在资源中添加了一个 ICON,然后使用下面的代码将该图标绘制到控件上:

using (Icon oIcon = Properties.Resources.DropDownCustom)

    Rectangle RectangleIcon = new Rectangle((DropDownRectangle.X + ((DropDownRectangle.Width / 2) - (oIcon.Width / 2))),
        (DropDownRectangle.Y + (((DropDownRectangle.Height / 2) - (oIcon.Height / 2)) + 1)),
        oIcon.Width,
        oIcon.Height);
    graphics.DrawIcon(oIcon, RectangleIcon);

这一切都很好,没有问题,但后来我决定在控件属性中添加一个选项,以允许开发人员加载他们自己的图标来使用,而不是使用我放置在资源中的图标。我创建了一个私有 Icon 变量:

private Icon _DropDownCustom;

将上述代码中的“使用”行改为:

using (Icon oIcon = _DropDownCustom)

然后在构造函数中添加以下行以将默认值设置为资源中的值。

_DropDownCustom = Properties.Resources.DropDownCustom;

然后我添加了一个 Icon 属性,以便开发人员可以使用他们自己的图标:

[Category("Appearance"), DisplayName("IconDropDown")]
public Icon IconDropDownCustom

    get  return _DropDownCustom; 
    set  _DropDownCustom = value; this.Invalidate(); 

所有这一切似乎都工作正常,除了现在,当我在表单上查看控件(在开发模式下)时,它会将图标绘制到控件上 - 很好,但是一旦我选择表单或控件图标消失,但其他绘画保留(即分级背景)。

有谁知道为什么它似乎没有重新绘制图标?

非常感谢。

编辑: 我刚刚删除了代码的“Using()”部分并将其更改为:

Icon oIcon = _DropDownCustom;
Rectangle RectangleIcon = new Rectangle((DropDownRectangle.X + ((DropDownRectangle.Width / 2) - (oIcon.Width / 2))),
    (DropDownRectangle.Y + (((DropDownRectangle.Height / 2) - (oIcon.Height / 2)) + 1)),
    oIcon.Width,
    oIcon.Height);
graphics.DrawIcon(oIcon, RectangleIcon);

这似乎按预期工作,所以我猜这与使用和处置有关 - 仍在尝试理解正在处置的部分 - 您能否解释一下为什么会发生这种情况?我猜我的“oIcon”基本上只是引用我的自定义 Icon 变量而不是“按值”(我来自 VB 背景)。

【问题讨论】:

【参考方案1】:

图标资源周围的“使用”块将向 GC 发出信号,表明不再需要该位置的内存并将其清理。因此,在第一次绘制后,图标将不再有效(除非您在每次绘制时加载并处理它)。

您可能应该:

处理控件的关闭事件并释放那里的资源。

在您的用户控件上实施Disposable 模式,以便在不再需要您的控件时清理资源(如您的图标)。

【讨论】:

以上是关于在表单上绘制自定义图标的主要内容,如果未能解决你的问题,请参考以下文章

创建自定义导航栏渲染器以在 xamarin 表单 IOS 项目中添加自定义后退按钮图标

Android自定义控件 芝麻信用分雷达图

Flutter 多自定义图标未显示在地图视图上

如何生成自定义webfont图标?

Android 在 google pay 中绘制自定义视图

32.QT-制作最强电压电阻表盘,可以自定义颜色,图标,文字标签(也可以用来当其它表盘)