Как установить HICON в окне (.ICO с несколькими размерами)? - PullRequest
3 голосов
/ 10 февраля 2010

Я хотел бы определить значок приложения в окне Win32, например, через вызов SetClassLong с GCL_HICON и передачу дескриптора на значок (см. Функция SetClassLong в MSDN).

Это прекрасно работает, но я не понял, как мне загрузить значок (из файла ICO), чтобы сохранить все доступные размеры (например, 16x16, 32x32, 48x48 и полноразмерный значок PNG). Когда я загружаю файл значков через LoadImage в память, чтобы получить HICON, я должен указать, какой размер я хочу (см. Мой ответ на связанный вопрос ).

Мой файл ICO содержит изображение небольшого размера, которое должно использоваться в качестве значка окна (верхний левый угол строки заголовка), и было разработано, чтобы быть очень четким, но также и более крупные варианты, которые должны отображаться в Alt-Tab диалог, но ...

  1. При загрузке значка 16x16 в строке заголовка отображается соответствующий значок, но, разумеется, это ужасно растянутая версия, когда я нажимаю Alt-Tab. И тот, который отображается на панели задач, тоже не очень хорош.

  2. Загрузка значка 48x48 показывает хорошую иконку, когда я нажимаю Alt-Tab, но значок, отображаемый в строке заголовка, размыт, поскольку это уменьшенная версия значка 48x48.

Есть ли какие-либо способы сообщить Windows, что у моего Windows есть значок разного размера? Есть какой-то очевидный API, который я пропустил?

Ответы [ 3 ]

4 голосов
/ 10 февраля 2010

файл .ICO содержит несколько изображений. но HICON - это только один из этих изображений. если вы используете LR_DEFAULTSIZE, то может быть какое-то магическое поведение, которое сохраняет ссылку на файл .ico и использует соответствующее изображение из него, но я сомневаюсь в этом.

Если этого не сделать, то ничего не получится.

HICON hicon = LoadImage(NULL, "filename.ico", IMAGE_ICON, 
                        0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);

Немного фона.

Когда файл .ico включен в ресурсы приложения, файл открывается и каждый образ из файла становится отдельным ресурсом. Заголовок файла изменяется, и он становится ресурсом ICON. Поэтому, когда LoadIcon / LoadImage передается идентификатор ресурса ресурса ICON, ему действительно передается каталог других ресурсов. Он выбирает изображение, которое соответствует запросу в этот момент времени , и превращает его в HICON. Функция, которая фактически делает это, называется LookupIconIdFromDirectory

Вот почему, когда вы GetIconInfo для HICON, вы получаете только одну структуру ICONINFO.

typedef struct _ICONINFO {
    BOOL fIcon;
    DWORD xHotspot;
    DWORD yHotspot;
    HBITMAP hbmMask;
    HBITMAP hbmColor;
} ICONINFO;
2 голосов
/ 10 февраля 2010

GCL_HICON устанавливает «большой» значок, GCL_HICONSM устанавливает маленький значок (Размеры обычно составляют 32x32 и 16x16, но вы должны использовать GetSystemMetrics с SM_CXICON и SM_CXSMICON, чтобы найти фактический размер (Для большого значка вы также можете просто передать LR_DEFAULTSIZE Загрузить изображение с размером 0))

1 голос
/ 07 июня 2013

Если файл .ico не содержит полноразмерную иконку PNG 256x256, Windows выглядит счастливой, когда я просто пишу:

var assembly = typeof (Xyz).Assembly;
var stream   = assembly.GetManifestResourceStream ("Foo.Resources.Form.ico");
var icon     = new System.Drawing.Icon (stream);

form.Icon = icon;

С этим на месте и значком Form.ico, помещенным в папку Resources моей сборки, которая имеет Foo в качестве пространства имен по умолчанию, Windows будет использовать версию изображения 32x32 для панели задач и переключение задач с помощью Alt-Tab и версия 16x16 для заголовка окна.

Итак, остерегайтесь значка PNG при использовании его с WinForms Form.Icon ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...