Змінюй хід війни! Допомагай ЗСУ!

Вопрос по C#. Как изменить иконку у окна? this.Icon = а дальше?

🔴 11:35 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 17.08.2005
Повідом.: 48736
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #1
Вопрос по C#. Как изменить иконку у окна? this.Icon = а дальше?

Собственно сабж - где искать иконку и как её вызвать.
В файл resx - добавлена.
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #2
В Property Editor'е кликни на свойстве формы Icon и загрузи нужную икону...

Если тебе в рантайме нужно, тогда myform.Icon = new Icon(@"C:\myicon.ico");
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #3
В Property Editor'е кликни на свойстве формы Icon и загрузи нужную икону...

эммм... Я ж сказал, что она в resx. Неужели найдя тудой дорогу я всё ещё создаю впечатление человека, который поле Icon у формы не нашел?

уточняю - поменять иконку надо в РАБОТАЮЩЕМ приложении. Например по кнопке, или по любому другому событию.
Поменять - программно.

В общем-то в конструкторе оно объявлено вот так:
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
Но при попытке что-то сделать из обработчика - студия говорит, что resources не существует в этом контексте.
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #4
так сделай его:
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));

в ресурсы формы пихай иконку и получай таким же образом.

можно ж и из файла отдельного брать

--------
хотя все проще, как всегда - все уже сделано:
this.Icon = icon.Properties.Resources.ИмяИконки;
 
Останнє редагування:
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #5
так сделай его:


в ресурсы формы пихай иконку и получай таким же образом.

можно ж и из файла отдельного брать
Спс. Только хотел сам себе ответить. но опередили.
действительно
Создать экземпляр ресурсов
Код:
System.ComponentModel.ComponentResourceManager[B] resources[/B] = new System.ComponentModel.ComponentResourceManager(typeof(MyForm));

И потом из этого экземпляра тянуть

Код:
 this.Icon = ((System.Drawing.Icon)([B]resources[/B].GetObject("$name_of_icon")));

--------
хотя все проще, как всегда - все уже сделано:
this.Icon = icon.Properties.Resources.ИмяИконки;

Вот эта конструкция не работает.

После =icon.--- - не видно Properties.
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #6
а ссори, "icon" у меня здесь это пространство имен приложения .)
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #7
а зачем тебе resx? Добавь икону как Embedded Resource в сборку и грузи через ManifestResourceStream...

Код:
            Stream iconStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProjectNamespace.MyIcon.ico");
            if (iconStream == null)
                MessageBox.Show("Embedded resource file not found!");
            else
                Icon = new Icon(iconStream);
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #8
а ссори, "icon" у меня здесь это пространство имен приложения .)
эээм.. всё равно не будет.
project.Properties - нету такого. Или кто такой у тебя Properties?

а зачем тебе resx? Добавь икону как Embedded Resource в сборку и грузи через ManifestResourceStream...

Код:
            Stream iconStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProjectNamespace.MyIcon.ico");
            if (iconStream == null)
                MessageBox.Show("Embedded resource file not found!");
            else
                Icon = new Icon(iconStream);

resx мне затем. что я # только начал ковырять и другого не увидел.
Сорри, а чем оно лучше? По количеству кода - де-то одинаково.
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #9
Resources.resx в сs файле смотри имя неймспейса
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #10
Сорри, а чем оно лучше? По количеству кода - де-то одинаково.

по удобству навигации по проекту, по удобству компиляции и т.п. Например надо икону MyAppIcon.ico подправить - без проблем: открыл файл MyAppIcon.ico, подредактировал, сохранил, перекомпилил проект, все...
А с resx тебе прийдется еще долго долбаться вытягивая эту икону из ресурсного файла, а потом еще вставляя ее назад в ресурсный файл...
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #11
по удобству навигации по проекту, по удобству компиляции и т.п. Например надо икону MyAppIcon.ico подправить - без проблем: открыл файл MyAppIcon.ico, подредактировал, сохранил, перекомпилил проект, все...
А с resx тебе прийдется еще долго долбаться вытягивая эту икону из ресурсного файла, а потом еще вставляя ее назад в ресурсный файл...

Хорошая тема.
А где тут в
Код:
  Stream iconStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProjectNamespace.MyIcon.ico");
            if (iconStream == null)
                MessageBox.Show("Embedded resource file not found!");
            else
                Icon = new Icon(iconStream);
Путь к иконке? Или где она там должна валяться?
Я начинающий и мне в этой конструёвине них...чего не понятно. Вижу поток, в котором создается объект длее - гетманифест возвращает указатель на файл в сботке, который и присуждается победителю конкурса - Icon. Вернее икона создается как экземпляр.

Я видимо не совсем понимаю суть понятия "сборка". Что она включает, или грубо говоря - куда засунуть саму картинку, чтобы её нашло? (варианты " а засунь её..." не предлагать - там .NET не установлен.).
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #12
добавляешь иконку к проекту, открываешь свойства иконы и устанавливаешь тип Build Action как Embedded resource. При компиляции этот файл будет внедрен в сборку как ресурсный файл, доступ к содержимому этого файла можно получить через объект стрима возвращаемый методом GetManifestResourceStream у сборки в которой он находится. Чтобы получить текущую сборку (из которой вызван код) можно использовать Assembly.GetExecutingAssembly() - этот метод вернет сборку в которой выполнен этот вызов.

Путь к иконке указывается в качестве аргумента GetManifestResourceStream(путь к иконке). Путь к иконке включает в себя нэймспейс проекта и если иконка покладена в папку, то относительный путь к файлу плюс собственно имя иконки, но вместо разделителя \ ставится точка. Например нэймспейс сборки (задается в свойствах проекта): MyAssemby, иконка MyIcon.ico лежит в папке MyIcons, тогда методу GetManifestResourceStream нужно передать такое имя иконки: "MyAssemby.MyIcons.MyIcon.ico".
Вызов этого метода возвращает объект Stream (стрим) из которого ты можешь читать данные как из файла.

Этот стрим передается в конструктор иконы, который создает новую икону и загружает в нее картинку из переданного потока.

вот пример с картинкой (джипег был под рукой):
 

Вкладення

  • resource.png
    resource.png
    642.2 КБ · Перегляди: 1337
Останнє редагування:
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #13
Вот спасибо большое всем кто отозвался. Очень конструктивненько получилось.
 
  • 🔴 11:35 Повітряна тривога в Харків.обл.
  • #14
для спасибо кнопка есть ;)
 
Назад
Зверху Знизу