Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить иконку типа файла 16х16, иконка, ассоциированная с файлом 
V
    Опции темы
Akella
  Дата 22.9.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Есть код
Код

function GetRegistryIconHandle(FileName: string): HICON;
var
  R: TRegistry;
  Alias, //псевдвним для расширения в реестре
  IconPath,Ext: string; //путь для файла с иконкой
  IconNum, //номер иконки в файле
  QPos: Integer; //позиция запятой в записи реестра
begin
  IconNum := 0;
  Ext:=ExtractFileExt(FileName);
  if (Ext='.exe') or (ext='.EXE') then ext:='.com';

  R := TRegistry.Create;

  try
    R.RootKey := HKEY_CLASSES_ROOT;

    //чтение псевданима
    if R.OpenKey('\' + Ext, True) then
      Alias := R.ReadString('');
    R.CloseKey;

    //чтение записи об иконке
    if R.OpenKey('\' + Alias + '\DefaultIcon', True) then
      IconPath := R.ReadString('');
    R.CloseKey;

    //поиск запятой
    QPos := Pos(',', IconPath);

    //чтение номера иконки в файле если она имеется
    if QPos <> 0 then
    begin
      IconNum := StrToInt(Copy(IconPath, QPos + 1, 4));
      IconPath := Copy(IconPath, 1, QPos - 1)
    end;

  finally
    R.Free;
  end;

  //передача хендлера иконки как результат выполнения
  Result := ExtractIcon(hInstance, PChar(IconPath), IconNum);
  if result=0 then
    Result:=LoadIcon(Hinstance,'NO_FILE');
end;


Как я понимаю, что этот код возвращает слишком большую иконку, когда её рисуешь в гриде, то качество не очень. Что нужно поменять в этой функции, чтобы она возвращала иконку размером 16х16?
К сожалению, я с графикой не очень подружился.

Добавлено через 2 минуты и 37 секунд
Вот так в гриде (cxGrid) рисую в событии OnCustomDrawCell
Код

DrawIconEx(ACanvas.Handle, AViewInfo.ClientBounds.Left + 1, AViewInfo.ClientBounds.Top + 1, vIconHandle, 16, 16, 0, 0, DI_NORMAL);

PM MAIL   Вверх
Akella
Дата 22.9.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Ура. Ай да я, ай да молодец  smile 
Заменил на ExtractIconEx()  smile 
Код

function TfmEmailEdit.GetRegistryIconHandle(FileName: string): HICON;
var
  R: TRegistry;
  Alias, //псевдвним для расширения в реестре
  IconPath,Ext: string; //путь для файла с иконкой
  IconNum, //номер иконки в файле
  QPos: Integer; //позиция запятой в записи реестра
  LI, SI : HICON;
begin
  IconNum := 1;
  Ext:=ExtractFileExt(FileName);
  if (Ext='.exe') or (ext='.EXE') then ext:='.com';

  R := TRegistry.Create;

  try
    R.RootKey := HKEY_CLASSES_ROOT;

    //чтение псевданима
    if R.OpenKey('\' + Ext, True) then
      Alias := R.ReadString('');
    R.CloseKey;

    //чтение записи об иконке
    if R.OpenKey('\' + Alias + '\DefaultIcon', True) then
      IconPath := R.ReadString('');
    R.CloseKey;

    //поиск запятой
    QPos := Pos(',', IconPath);

    //чтение номера иконки в файле если она имеется
    if QPos <> 0 then
    begin
      IconNum := StrToInt(Copy(IconPath, QPos + 1, 4));
      IconPath := Copy(IconPath, 1, QPos - 1)
    end;

  finally
    R.Free;
  end;

  ExtractIconEx(PChar(IconPath), IconNum, LI, SI, 1);
  Result := SI;

  if result = 0 then
    Result := LoadIcon(Hinstance,'NO_FILE');
end;


Это сообщение отредактировал(а) Akella - 22.9.2009, 10:18
PM MAIL   Вверх
bems
Дата 29.9.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 1
Всего: 88



А зачем этот изврат? Можно же SHGetFileInfo с флагами SHGFI_ICON и SHGFI_SMALLICON


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Akella
Дата 30.9.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



А если файл физически на диске отсутствует?
PM MAIL   Вверх
Snowy
Дата 30.9.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



SHGetFileInfo в любом случае вернёт хоть какую-нибудь иконку.
Если иконки нет, то и в реестре рыться тем более бесполезно.
А SHGetFileInfo вернёт что-нибудь в любом случае. Нет иконки - вернёт дефолтовую.
PM MAIL   Вверх
bems
Дата 30.9.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 1
Всего: 88



Цитата(Akella @  30.9.2009,  10:13 Найти цитируемый пост)
А если файл физически на диске отсутствует? 
то указать SHGFI_USEFILEATTRIBUTES



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0938 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.