passendes Dateisymbol vor jeder Datei anzeigen?

Ravebaby

Erfahrenes Mitglied
Hallo,

ich möchte gerne, wie man es aus dem Startmenü oder dem Windows File Explorer kennt, passende Dateisymbole vor den Dateien anzeigen lassen. Beispielsweise das weiße Blatt mit blauem "W" für eine Worddatei. Gibt es dafür eine Routine, die es automatisch zuordnet? sowas wie "ShellExecute(GetSafeHwnd(),"open",m_filepath,NULL,NULL,SW_SHOWNORMAL);"
für die Ausführung von beliebigen Dateien...
 
Die Funktion heißt SHGetFileInfo:

Code:
SHFILEINFO sfi;             

SHGetFileInfo( strPath, // Pfad zur Datei, deren Symbol ermittelt werden soll
               NULL,
               &sfi,
               sizeof(SHFILEINFO),
               SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES );

Das Ergebnis ist ein HICON in sfi.hIcon .
 
Ich hab es nun mal mit "SHGetFileInfo" getestet. Allerdings muss ich doch, wenn ich es richtig verstanden hab, das HICON in ein Bitmap casten?!
Hab mir online einige Beispiele angeschaut, in der msdn Hilfe steht auch, dass es kein C++ Beispiel gibt. Er kennt den Dateityp "Bitmap" schonmal nicht, aber ich hab keine Header-Files gefunden, die ich importieren soll, nur Hinweise auf .dlls... Was soll ich mit denen tun?!
Hier mal mein Code. Wie muss ich da weiter verfahren?
Steh grad so n bißchen im Wald. :confused:

Code:
SHFILEINFO sfi;             

SHGetFileInfo( filepath, // Pfad zur Datei, deren Symbol ermittelt werden soll
		      NULL,
		      &sfi,
		      sizeof(SHFILEINFO),
		      SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES ); 

HICON fileicon = sfi.hIcon;

Bitmap* filebitmap = Bitmap.FromHicon(fileicon);
 
"Bitmap" ist Bestandteil von GDI+. Um damit zu arbeiten, musst du dein Projekt entsprechend vorbereiten, siehe http://www.thecodeproject.com/vcpp/gdiplus/startinggdiplus.asp

Die Zeile müsste dann übrigens so geschrieben werden:
Code:
Bitmap* filebitmap = Bitmap::FromHicon(fileicon);

Evt. meinst du auch die Klasse CBitmap der MFC? Hier ist die Umwandlung des Icons allerdings etwas aufwendiger.

In welcher Situation willst du das Icon denn anzeigen? In der Regel kann man auch direkt mit dem Icon arbeiten, ohne es erst in eine Bitmap umwandeln zu müssen.
 
Zuletzt bearbeitet:
Das wär natürlich klasse. Ich möchte es einfach in meiner OnDraw Routine an einer bestimmten Stelle meines Views ausgeben lassen. Muss ich es dafür konvertieren?!
 
Da kannst du auch die Funktion DrawIcon oder DrawIconEx benutzen, dann musst du nicht umwandeln.
 
Mit DrawIcon zeigt er mir das Icon an, allerdings ist das viel zu groß.

Mit DrawIconEx könnte ich ja die Größe angeben, wenn ich die Methode jedoch benutze, zeigt er mir gar nichts mehr an. Mein Code:
Code:
SHFILEINFO sfi;             

SHGetFileInfo( filepath, // Pfad zur Datei, deren Symbol ermittelt werden soll
		      NULL,
		      &sfi,
		      sizeof(SHFILEINFO),
		      SHGFI_ICON | SHGFI_USEFILEATTRIBUTES); 

HICON fileicon = sfi.hIcon;

pDC->DrawIcon(rect.left, rect.top, fileicon);

HDC hDC = ::GetDC(HWND(this->GetActiveWindow()));

/*DrawIconEx (hDC, // handle to dc
		     rect.left, // xLeft
		     rect.top, // yTop
		     fileicon, // HICON
		     5, // cxWidth
		     5, // cyWidth
		     NULL,
		     NULL,
		     DI_NORMAL
		     );*/
							

DestroyIcon(fileicon);

Und ich kommentiere den DrawIconEx -Aufruf dann natürlich aus ;o)
 
Gibt DrawIconEx denn einen Fehler zurück? (bzw. was sagt denn GetLastError?)

DrawIconEx hab ich eigentlich schon genauso benutzt. Was mir noch einfällt: Evtl. gibt es eine Mindestgrösse und 5x5 ist nicht besonders gross. Versuch mal etwas "Normaleres" wie 16x16.
 

Neue Beiträge

Zurück