Как загрузить маленькую системную иконку? - PullRequest
7 голосов
/ 26 ноября 2010

Мне нужно отображать иконки 16x16 пикселей для ошибок / предупреждений / информации.К сожалению, LoadIcon(0, IDI_*) и LoadImage(0, OIC_*, IMAGE_ICON, 16, 16, LR_SHARED) всегда дают мне версию значка 32x32.

Я читал о ShGetStockIconInfo, но это доступно только в Vista и далее, и мне все еще нужно поддерживать XP.

Есть идеи?

Я использую Delphi 2010 с компонентом TImage, если это имеет значение.

1 Ответ

16 голосов
/ 26 ноября 2010

Проблема в том, что когда вы делаете это таким образом, вы получаете кешированную версию иконки, первую, которую система загрузила.Это будет иконка большого размера, обычно 32x32.Не имеет значения, какой размер вы указали.

Что вы можете сделать, это найти идентификатор нужного ресурса в user32.dll и использовать что-то вроде этого:

LoadImage(GetModuleHandle('user32'), MAKEINTRESOURCE(103), IMAGE_ICON,
    16, 16, LR_DEFAULTCOLOR);

Вам лучшепозвоните GetSystemMetrics(SM_CXSMICON), чтобы узнать размер значка, а не жесткий код 16, но вы, вероятно, уже знаете это.

Я не уверен, откуда вы берете идентификаторы ресурсов для ресурсов в user32, илидаже если они являются какой-либо гарантией того, что они будут постоянными в разных версиях Windows.Я думаю, что они будут, потому что слишком много программ сломалось бы, но это просто догадки.

...