Рисование пользовательского значка на форме - PullRequest
3 голосов
/ 10 июня 2011

Я создаю пользовательский элемент управления в 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" в приведенном выше коде следующим образом:

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 голосов
/ 10 июня 2011

Блок «using» вокруг вашего ресурса Icon сообщит GC, что память в этом месте больше не нужна, и очистит ее.Таким образом, после первого рисования значок больше не будет действительным (если вы не загрузите его и не будете утилизировать каждый раз, когда будете его рисовать).

Вероятно, вам следует либо:*

Обработка события закрытия элемента управления и размещение ресурсов там.

Реализация шаблона Одноразовый в вашем пользовательском элементе управления для очистки ресурсов (например,ваш значок), когда ваш контроль больше не нужен.

...