在窗体上绘制自定义图标

时间:2011-06-10 10:43:43

标签: c# winforms user-controls controls gdi

我在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 个答案:

答案 0 :(得分:0)

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

您可能应该:

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

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