#delphi #winapi #resources #icons
#delphi #winapi #Ресурсы #Значки
Вопрос:
Я хочу загрузить значок (из другого файла), в который не встроено несколько значков (это не группа значков). Я не знаю его размер. Теперь я использую этот код для извлечения дескриптора значка и использования его с помощью TIcon.Обрабатывать:
function ResourceToIconHandle(hFile: hModule; IDname: PChar): HICON;
var
hGicon1,
hLoadIcon1: THandle;
pGIcon1: Pointer;
begin
hGicon1 := FindResource(hFile, IDName, RT_ICON);
if hGicon1 <> 0 then
begin
hLoadIcon1 := LoadResource(hFile, hGicon1);
pGicon1 := LockResource(hLoadIcon1);
Result := CreateIconfromResource(pGicon1,
SizeofResource(hFile, hGicon1),
True,
$00030000);
end;
end;
Да, это только часть кода (если хотите, я покажу все).
Это работает только с одной проблемой: функция CreateIconFromResource выдает мне любой значок размером 32×32:
Но я хочу получить значки в их исходном разрешении:
Я знаю, что CreateIconFromResource предназначен для получения их с одинаковым разрешением, поэтому я ищу другую функцию. Спасибо за вашу помощь.
Комментарии:
1. Вы пробовали вызывать
CreateIconFromResourceEx
передачу соответствующего размера? Я также не понимаю, почему вы не используете группу значков, но, я думаю, это не суть вопроса.2. @David Heffernan Я знаю о CreateIconFromResourceEx, но я не знаю, как найти их разрешение, потому что я загружаю их из другого EXE-файла. В этом exe может быть группа значков или просто значок. Я решил проблему с группой значков, используя CreateIconFromResourceEx, но мне нужно загружать отдельные значки в их исходном разрешении.
3. @David Heffernan Да, ваша идея с CreateIconFromResourceEx была хорошей, мне просто нужно было правильно настроить параметры. Спасибо.
4. Кстати, теперь у вас достаточно репутации, чтобы голосовать и принимать ответы.
5. Да, я заметил, и я проголосовал. Спасибо, что рассказали мне.
Ответ №1:
Используйте CreateIconFromResourceEx
вместо CreateIconFromResource
.
CreateIconFromResourceEx
позволяет указать желаемую ширину / высоту, в то время CreateIconFromResource
как для них используются системные параметры по умолчанию (например, объясненные для LR_DEFAULTSIZE
):
Использует ширину или высоту, заданные значениями системных метрик для курсоров или значков, если значения cxDesired или cyDesired установлены равными нулю. Если этот флаг не указан и cxDesired и cyDesired установлены в ноль, функция использует фактический размер ресурса. Если ресурс содержит несколько изображений, функция использует размер первого изображения.
Комментарии:
1. Спасибо. Я использовал с / без LR_DEFAULTSIZE и нуля для cxDesired и cyDesired, но все равно получаю 32×32 для всех. У меня нет значений для cxDesired и cyDesired, чтобы передать их функции, потому что я не знаю ширину и высоту значков (я загружаю их из другого файла).
2. API требует, чтобы вы либо (а) запрашивали определенный размер (б) разрешали API загружать системный размер по умолчанию (в) указывали на чтение значка с размером первого значка в группе. Если вас это не устраивает (как, возможно, и есть), вы должны сначала перечислить доступные размеры значков. Для этого вам необходимо заблокировать данные ресурсов и получить к ним прямой доступ. Смотрите эти ссылки на формат данных ресурсов для значков: msdn.microsoft.com/en-us/library/ms997538.aspx , msdn.microsoft.com/en-us/library/windows/desktop /…
3. Проверьте это для перечисления доступных размеров значков: codeproject.com/KB/DLL/ICON_Resources.aspx?display=Print
4. Я понял, спасибо. Но, похоже, проблема была в другом месте, и установка 0 для последних 3 параметров действительно работает. Большое вам спасибо за вашу помощь. Я отмечу ваш ответ как хороший.
5. Скорее всего, это сработало, потому что самый большой значок идет первым, см. (c) в комментарии выше.
Ответ №2:
Роман Р., вероятно, прав, но я также добавлю, что вы должны установить правильные размеры объекта TIcon, прежде чем устанавливать его дескриптор.
Комментарии:
1. Спасибо. Фактический код работает для RT_GROUP_ICON без установки правильных размеров объекта TIcon перед установкой его дескриптора. В любом случае, я не знаю, как установить правильные размеры (вы говорите о ширине и высоте?) потому что я не знаю ширину и высоту значка.
2. Настройка ширины и высоты необходима перед загрузкой из потока. Загрузка из дескриптора, вероятно, будет в порядке без них. Извините, я забыл об этом. Прошло почти два года с тех пор, как я заглянул в источники TIcon: (