在表单上绘制自定义图标
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 模式,以便在不再需要您的控件时清理资源(如您的图标)。
【讨论】:
以上是关于在表单上绘制自定义图标的主要内容,如果未能解决你的问题,请参考以下文章