Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Получить иконку типа файла 16х16


Автор: Akella 22.9.2009, 08:48
http://forum.sources.ru/index.php?showtopic=126092&view=findpost&p=981950
Код

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);

Автор: Akella 22.9.2009, 10:16
Ура. Ай да я, ай да молодец  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;

Автор: bems 29.9.2009, 16:30
А зачем этот изврат? Можно же SHGetFileInfo с флагами SHGFI_ICON и SHGFI_SMALLICON

Автор: Akella 30.9.2009, 10:13
А если файл физически на диске отсутствует?

Автор: Snowy 30.9.2009, 10:36
SHGetFileInfo в любом случае вернёт хоть какую-нибудь иконку.
Если иконки нет, то и в реестре рыться тем более бесполезно.
А SHGetFileInfo вернёт что-нибудь в любом случае. Нет иконки - вернёт дефолтовую.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)