Gå til innhold

Bruke Explorers filikoner


Anbefalte innlegg

Kan noen si meg om det er mulig gjennom Win32 API å få tak i ikonene som Explorer bruker for å indikere filtype, for Python-filer for å nevne et eksempel? Har en Qt-widget for å inspisere visse filer, men skulle gjerne hatt noen passende ikoner også.

Lenke til kommentar
Videoannonse
Annonse

Ikonene finnes i den såkalte system image list som er en HIMAGELIST med ikonene til hele shellet. Listen henter du ved å bruke SHGetFileInfo som ligger i shell32.dll.

 

For å hente system image list for små ikoner kan du gjøre følgende:

HIMAGELIST GetSmallSystemImageList()
{
 SHFILEINFO sfi;
 HIMAGELIST sysImgList;
 
 ZeroMemory(&sfi, sizeof(sfi));
 sysImgList = (HIMAGELIST) SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
 
 return sysImgList;
}

 

Deretter bruker du SHGFI_SYSICONINDEX flagget for å hente ut indeksen fra listen. F.eks slik:

 

SHGetFileInfo(_T("c:\\minfil.py"), FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX);
int iconIndex = sfi.iIcon;

 

Du kan også kopiere iconet til sfi.hIcon ved å bruke SHGFI_ICON flagget. Men vanligvis bruker man listen direkte slik at du slipper å kopiere ressursene når man viser filer i f.eks. en listekontroll.

 

SHGetFileInfo har mange muligheter så jeg anbefaler deg å ta en titt på MSDN :).

Lenke til kommentar
Ikonene finnes i den såkalte system image list som er en HIMAGELIST med ikonene til hele shellet. Listen henter du ved å bruke SHGetFileInfo som ligger i shell32.dll.

 

For å hente system image list for små ikoner kan du gjøre følgende:

HIMAGELIST GetSmallSystemImageList()
{
 SHFILEINFO sfi;
 HIMAGELIST sysImgList;
 
 ZeroMemory(&sfi, sizeof(sfi));
 sysImgList = (HIMAGELIST) SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
 
 return sysImgList;
}

 

Deretter bruker du SHGFI_SYSICONINDEX flagget for å hente ut indeksen fra listen. F.eks slik:

 

SHGetFileInfo(_T("c:\\minfil.py"), FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX);
int iconIndex = sfi.iIcon;

 

Du kan også kopiere iconet til sfi.hIcon ved å bruke SHGFI_ICON flagget. Men vanligvis bruker man listen direkte slik at du slipper å kopiere ressursene når man viser filer i f.eks. en listekontroll.

 

SHGetFileInfo har mange muligheter så jeg anbefaler deg å ta en titt på MSDN :).

6434610[/snapback]

Ikke kommet så langt som til å prøve ennå, men mange takk!

Lenke til kommentar
  • 2 uker senere...
  • 3 uker senere...
kan også "enkelt" gjøres med i registry, men hvis dere har funnet en løsning og er fornøyd med den, så tar jeg ikke den nå...

6581702[/snapback]

 

Det er riktig at registeret holder denne informasjonen. SHGetFileInfo og andre funksjoner i Shell API bruker registeret for å hente ut dataene.

 

Men det blir en ganske omfattende jobb å gjøre dette manuelt. Du må lese og tolke opp til flere verdier i registeret + åpne fila og hente ut den ønskede ressursen fra respektiv fil. Det ville være mildt sagt klønete og på grensen til et hack å regne i forhold til det ene API-kallet som er nødvendig. Det er heller ingen garanti for at registeret vil ha dagens struktur og funksjon i fremtidige utgaver av Windows.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...