在表单上绘制自定义图标

3

我正在使用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);
}

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

private Icon _DropDownCustom;

我已经将上述代码中的"using"行更改为以下内容:
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”基本上只是引用了我的自定义图标变量而不是“按值传递”(我来自VB背景)。

1个回答

0

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

你应该考虑:

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

  • 在用户控件上实现可处理模式以在不再需要控件时清理资源(如图标)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接