treeview mit systemicons
-
Hallo,
ich habe einen funktionierenden treeview aber leider ohne Icons. Ich möchte nun keine Eigenen sondern das jewailige Systemicon vor der Datei in meinem treeview anzeigen lassen. Meine Programmierumgebung ist VC++ 6.0.
Wie bekomme ich die Systemicons in meine ImageList und wie bekomme ich den Index auf das richtige Icon zum Dateityp?
Bitte keine Links posten, die meisten kenne ich nach meiner 3tägigen Suche. Ich bin für aussagekräfitgen Quelltext dankbar.
Auszug aus meinem Quelltext:
//treeview CTreeCtrl* pTree = (CTreeCtrl*)GetDlgItem(IDC_TREE); //Imagelist mit Systemicons, keine Ahnung wie =) //hier Problem :clown: CImageList ImageList = ???; pTree->SetImageList(/*&m_ImageList*/NULL, TVSIL_NORMAL); TV_INSERTSTRUCT tvinsert; tvinsert.hParent = NULL; tvinsert.hInsertAfter = TVI_LAST; tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT; tvinsert.item.hItem = NULL; tvinsert.item.state = 0; tvinsert.item.stateMask = 0; tvinsert.item.cchTextMax = 6; tvinsert.item.iSelectedImage = 0; tvinsert.item.cChildren = 0; tvinsert.item.lParam = 0; //Arbeitszeiger auf Anfang meiner verketteten Liste setzen erunner = eanchor; char sz[MAX_PATH]; //Extensions aus der Liste (Form: .*, z.B .txt, .bmp) in den treeview einfügen while(erunner) { strcpy(sz, erunner->cExtension); tvinsert.item.pszText = sz; //hier Problem :clown: //tvinsert.item.iImage = ???; pTree->InsertItem(&tvinsert); erunner = erunner->next; } //Elemente sortieren pTree->SortChildren(NULL);---------------------------------
1000send Dank für Deine Hilfe
Tobi
-
du kannst die icons auch manuell adden:
m_iDateiDocIcon = m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_DOC)); m_iDateiTxtIcon = m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_TXT));wenn du nur eine bestimmte anzahl/art von dateitypen hast, kannst du das ja ueber die endung selbst hinzufuegen. wie das uebers system geht weiss ich allerdings nicht.
die icons oben muesstest du eben selber rauskopieren.
Esco
-
die standard systemicons befinden sich (unter win xp) in folgender dll:
system32\SHELL32.dll
Esco
-
Hallo Esco,
das mit dem selber Adden kennne ich. Mein Problem ist, daß ich alle möglichen Dateitypen, die ich vorher auch nicht kenne, darstellen muss und das mit dem entsprechendem Icon.
Hat noch jemand einen Vorschlag?
Tobi
-
SHGetFileInfo() liefert ein Handle für das Icon des jeweiligen Dateityps. Kannst Dir auch mal das IExtractIcon Interface anschaun.
[Für ein Icon einer bestimmten (existenten) Datei: ExtractAssociatedIcon()]
-
OK, danke das hilft mir schon mal weiter. Nun weiß ich welches Icon aus der Systemiconlist für den jewailigen Typ passt. Trotzdem muss ich meinen treeview noch mit der systemiconlist füttern. Nur wie ich das anstellen soll weiß ich nicht. Hat da jemand einen Tip?
Danke
Tobi
-
Problemlösung (auf meinen Quelltext bezogen):
1. Im Konstruktor Systemiconliste auslesen
CStepTwo::CStepTwo() { //m_SmallImageList (Typ: CImageList) mit Systemiconliste füttern SHFILEINFO FileInfo; m_SmallImageList.Attach( (HIMAGELIST)SHGetFileInfo( "", 0, &FileInfo, sizeof( FileInfo), SHGFI_SMALLICON | SHGFI_SYSICONINDEX )); }2. In einer Funktion Iconindex in Systemliste dateitypspezifisch auslesen
int CStepTwo::IconIndex(CString strExt) { SHFILEINFO info; DWORD result = SHGetFileInfo(strExt, 0, &info, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_DISPLAYNAME | SHGFI_USEFILEATTRIBUTES ); if (result) return info.iIcon; else return 0; }3. Alles zusammenfügen und treeview mit den heißersehnten Icons anzeigen
void CStepTwo::MakeTree() { CTreeCtrl* pTree = (CTreeCtrl*)m_pMassDeleterDlg->GetDlgItem(IDC_TREE); pTree->SetImageList(&m_SmallImageList, TVSIL_NORMAL); TV_INSERTSTRUCT tvinsert; tvinsert.hParent = NULL; tvinsert.hInsertAfter = TVI_LAST; tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT; tvinsert.item.hItem = NULL; tvinsert.item.state = 0; tvinsert.item.stateMask = 0; tvinsert.item.cchTextMax = 6; tvinsert.item.iSelectedImage = 0; tvinsert.item.cChildren = 0; tvinsert.item.lParam = 0; erunner = eanchor; char sz[MAX_PATH]; while(erunner) { strcpy(sz, erunner->cExtension); tvinsert.item.pszText = sz; //hier wird der Eintrag getätigt tvinsert.item.iImage = IconIndex(erunner->cExtension); tvinsert.item.iSelectedImage = IconIndex(erunner->cExtension); pTree->InsertItem(&tvinsert); //Ende Eintrag erunner = erunner->next; } pTree->SortChildren(NULL); }4. Im Destruktor IconList wieder freigeben
CStepTwo::~CStepTwo() { m_SmallImageList.Detach(); }So simpel iss das :p .
Danke allen für die Tipps.
Gruß Tobi
-
@ Admin
Das wär doch auch mal was für die FAQ. Dort befindet sich nur ein unvollständiger Beispielcode für BCB.
Und schick gemacht hab ich das Ganze ja nun auch
.
