在窗体上绘制自定义图标

本文关键字:自定义 图标 绘制 窗体 | 更新日期: 2023-09-27 17:58:46

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

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);
}

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

private Icon _DropDownCustom;

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

using (Icon oIcon = _DropDownCustom)

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

_DropDownCustom = Properties.Resources.DropDownCustom;

然后我添加了一个图标属性,这样开发者就可以使用他们自己的图标:

[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背景)。

在窗体上绘制自定义图标

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

你可能应该:

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

  • 在用户控件上实现一次性模式,以便在不再需要控件时清理资源(如图标)。