Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Расплывчатые иконки, и как с ними бороться. [D7, XP]


AlexanderMS ©   (2006-10-23 19:59:00) 

Скажите, пожалуйста, почему при использовании иконок, содержащих в себе несколько изображений разного размера, в некоторых случаях прорисовываются изображения не того размера?

В моей программе есть одна иконка. В ней - несколько изображений (32x32, 16x16 и т. д.) Эта иконка есть в заголовке окна (я её указал в свойствах проекта). Она выглядит чётко (в заголовке окна иконки 16x16). В системный трей помещается эта же иконка. В трее иконки 16x16. Но иконка моей программы в трее выглядит как сжатая 32x32 и, как следствие, - она расплывчатая.

Почему в трее отображается именно иконка 32x32, хотя в комплекте есть и иконка 16x16? Это притом, что Handle иконки, отображающейся в трее равен Application.Icon.Handle.


#0FFFF   (2006-10-25 20:13:00) [1]


> AlexanderMS ©   (24.10.06 14:40) [3]
> как из файла "вытащить" иконку и добавить её в ImageList,
>  но чтобы там оказалось изображение 16x16?


uses
  ShellAPI, ShlObj

function GetIcon(const FileName: string): TIcon;
var
 FileInfo: TShFileInfo;
 ImageList: TImageList;
begin
 Result := TIcon.Create;
 ImageList := TImageList.Create(nil);
 FillChar(FileInfo, SizeOf(FileInfo), #0);
 ImageList.ShareImages := true;
 ImageList.Handle := SHGetFileInfo(
   PChar(FileName),
   SFGAO_SHARE,
   FileInfo,
   SizeOf(FileInfo),
   SHGFI_SMALLICON or SHGFI_SYSICONINDEX
   );
 ImageList.GetIcon(FileInfo.iIcon, Result);
 ImageList.Free;
end;

...

ImageList1.AddIcon(GetIcon(FileName));


Gero   (2006-10-25 15:38:00) [2]

> [5] DVM ©   (25.10.06 10:23)


> в win2000 там только 16-цветные вроде как только.

256 тоже можно.


Ketmar   (2006-10-25 11:08:00) [3]

>[5] DVM(c) 25-Oct-2006, 10:23
>Кстати насчет иконок в области уведомлений: в win2000 там
>только 16-цветные вроде как только.
не могу точно утверждать, ибо shell не explorer, но начиная с SP4 -- не только.
могу ошибиться.


DVM   (2006-10-25 10:23:00) [4]


> изображение 16х16 выносится в отдельную иконку, которая
> и помещается в трей :)

Кстати насчет иконок в области уведомлений: в win2000 там только 16-цветные вроде как только.


guav   (2006-10-24 15:19:00) [5]

SHGetFileInfo


AlexanderMS   (2006-10-24 14:40:00) [6]

Большое спасибо! В трее (где часики) отображается то, что нужно!

Последнее:

как из файла "вытащить" иконку и добавить её в ImageList, но чтобы там оказалось изображение 16x16?

У меня так:

             Icon := ExtractAssociatedIcon(hInstance,
               PChar(LBActions[n].LBIconLocation), LBActions[n].LBIconIndex);

             if Icon <> 0
               then
                 begin
                   ListIcon := TIcon.Create;
                   try
                     ListIcon.Handle := Icon;
                     ImageIndex := LBImageList.AddIcon(ListIcon)
                   finally
                     ListIcon.Free;
                   end
                 end;


Этот ImageList содержит иконки, которые потом отображаются на кнопках ToolBar... расплывчато. :( Снова программа глупо сжимает картинки 32x32 до 16x16.


guav   (2006-10-23 23:03:00) [7]

Можно загружать LoadImage и явно указать какой размер нужен.
"в трее" - это на кнопке на панели задач или "там ге часики" ?
С первым глюков не наблюдалось, со вторым - LoadImage(hInstance, 'MAINICON', IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); спасёт.


Agent13   (2006-10-23 22:31:00) [8]

Сталкивался когда-то с подобным глюком. Глубокого философского смысла в таком поведении иконок не нашёл, но топорным способом проблема решается элементарно: изображение 16х16 выносится в отдельную иконку, которая и помещается в трей :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо