Filou Geschrieben 8. Juli 2004 Geschrieben 8. Juli 2004 Hallo Klotzkopp! Ich hoffe, Du kannst mir wiedermal hefen ... wie schon so oft!! Da ich das mit der MMC nicht hin bekomme, bau ich mir halt meine eigene Console. Hab mal 2 Fragen zurm CTreeCtrl. 1) Wie bekomme ich 16x16 Bildchen in die Liste? Geht das mit einer CImageList? Und auch mit Icons oder nur mit Bitmaps? 2.) Wie erzeuge ich die Baumstruktur in der TreeCrtl? Bei mir sind alle Einträge nur untereinander. Danke wie immer, LG, Filou Zitieren
Klotzkopp Geschrieben 8. Juli 2004 Geschrieben 8. Juli 2004 Ich hoffe, Du kannst mir wiedermal hefen Andere hier sind auch hilfreich, ist ja keine Ein-Mann-Show Geht das mit einer CImageList?Ganz genau. Wenn die Bilder schon zur Compilezeit bekannt sind, lädst du die Imagelist am einfachsten aus einer einzigen Bitmapressource, die alle Bilder nebeneinander enthält. Wie erzeuge ich die Baumstruktur in der TreeCrtl? Bei mir sind alle Einträge nur untereinander.Du musst bei InsertItem das HTREEITEM des Elternknotens angeben. Tust du das nicht, wird TVI_ROOT genommen, damit wird das neue Item unterhalb des (unsichtbaren) Wurzelknotens eingefügt. Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 Guten Morgen!! Du schläfst wohl nie Also, es können ja auch andere auf meine frage antworten. Aber bis jetzt hast Du mir immer zu 99% weiter geholfen! Und dafür ein dickes fettes DANKE an den besten C++ Freak hier im Forum!!! :uli Also das mit der ImageList funkioniert irgendwie nicht... Aber mal davon abgesehen, hab ich ein großes Problem mit den Registerkarten. Ich will nämlich ein Fenster "Eigenschaften von..." machen. Habe es soweit, dass ich Registerkarten anzeigen kann. Aber ich hab keinen schimmer, wie man die Inhalte der einzelnen Karteikarten ein- bzw. ausblendet. Oder sollte ich hierfür einen neuen Thread auf machen? Gruß, Filou Zitieren
Klotzkopp Geschrieben 9. Juli 2004 Geschrieben 9. Juli 2004 Und dafür ein dickes fettes DANKE an den besten C++ Freak hier im Forum!!!Den "besten" wage ich zu bezweifeln, den "Freak" nehme ich dir übel (), und die multiplen Satzzeichen finde ich furchtbar Also das mit der ImageList funkioniert irgendwie nicht..."Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung. Sag, was du gemacht hast - wenn möglich, mit Code - und beschreib genau, wie sich der Fehler äußert. Aber mal davon abgesehen, hab ich ein großes Problem mit den Registerkarten. ... Oder sollte ich hierfür einen neuen Thread auf machen? Ja bitte. Ein Thema - ein Thread, ein Thread - ein Thema. Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 Ok, also zurück zu ImageList. So hab ich sie die Baumstruktur angelegt: 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.cchTextMax = 6; tvinsert.item.cChildren = 0; tvinsert.item.lParam = 0; //* SERVER tvinsert.item.pszText = "SERVER"; HTREEITEM hWurzel = m_CtrlTree.InsertItem(&tvinsert); Und die ImmageList so: CImageList m_imagelist; m_imagelist.Create(IDI_S_SERVER,16,16,ILC_COLOR16,1); m_imagelist.Add(IDI_S_SERVER); Bekomme die Fehlermeldung: error C2664: 'int __thiscall CImageList::Add(struct HICON__ *)' : Konvertierung des Parameters 1 von 'const int' in 'struct HICON__ *' nicht moeglich Wie muss ich das Icon der Liste hinzufügen? Und wie bekomme ich die Liste mit den Bildern dann in meiner baumstruktur? Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 UPDATE!! Hinzugefügt zur ImageList habe ich es jetzt so: m_imagelist.Add(HICON(IDI_S_SERVER)); Aber ich kann nicht testen, ob es fuktioniert, weil ich es ja nicht anzeigen lassen kann. zumindest bekomme ich keine Fehlermeldung mehr. Wie bekomme ich das Icon jetzt in mein TreeCtrl? InsertItem will ein Typ LPCTSTR als icon?? Vertseh ich net!! Zitieren
Klotzkopp Geschrieben 9. Juli 2004 Geschrieben 9. Juli 2004 Wenn du beim Anlegen der Items TVIF_IMAGE angibst, musst du auch tvinsert.item.iImage und tvinsert.item.iSelectedImage zuweisen. Das sind die Indizes auf die ImageList. Wie schon gesagt, ich empfehle, alle Item-Bilder nebeneinander in eine Bitmap-Ressource zu packen. Dann brauchst du gar kein Add mehr. Auch in deinem Beispiel ist Add unnötig, weil das Icon schon durch den Create-Aufruf in der ImageList landet. Wenn du wirklich mehrere Icons einzeln mit Add hinzufügen willst, dann schau dir LoadImage an. Zitieren
Klotzkopp Geschrieben 9. Juli 2004 Geschrieben 9. Juli 2004 m_imagelist.Add(HICON(IDI_S_SERVER)); Das ist ganz böse, das solltest du dir schnellstens abgewöhnen. Mit dem Cast stellst du den Compiler ruhig, damit sagst du quasi: "Halt den Mund, ich weiß es besser als Du". Der Compiler ist brav und denkt sich, Filou wird schon wissen, was er tut. Das ist aber nicht der Fall Also: Casts nur dann, wenn es einen guten Grund gibt. Nicht, um Compilerfehlermeldungen loszuwerden. Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 Ok, ich habe jetzt alles auf Bitmap umgestellt. Und es scheint auch zu funktionieren. Aber wie bekomme ich aus meiner ImageList ein TVIF_IMAGE? Oder geht das noch irgendwie anders? Zitieren
Klotzkopp Geschrieben 9. Juli 2004 Geschrieben 9. Juli 2004 Aber wie bekomme ich aus meiner ImageList ein TVIF_IMAGE? Die Frage verstehe ich nicht. TVIF_IMAGE ist ein Flag für die Maske. Dieses Flag hast du in deinem ersten Beitrag bereits benutzt. Du hast nur die Indexwerte für die Bilder nicht gesetzt: TV_INSERTSTRUCT tvinsert; tvinsert.hParent = NULL; tvinsert.hInsertAfter = TVI_LAST; tvinsert.item.mask = [b]TVIF_IMAGE[/b] | TVIF_SELECTEDIMAGE | TVIF_TEXT; tvinsert.item.hItem = NULL; tvinsert.item.state = 0; tvinsert.item.cchTextMax = 6; tvinsert.item.cChildren = 0; tvinsert.item.lParam = 0; [b]tvinsert.item.iImage = 1; tvinsert.item.iSelectedImage = 2;[/b] //* SERVER tvinsert.item.pszText = "SERVER"; HTREEITEM hWurzel = m_CtrlTree.InsertItem(&tvinsert); [/CODE] Damit wird für den Server, wenn er nicht ausgewählt ist (iImage), das zweite Bild aus der ImageList verwendet, und wenn er ausgewählt ist (iSelectedImage), das dritte Bild. Wenn du keine unterschiedlichen Bilder für ausgewählt/nicht ausgewählt brauchst, setzt du einfach beide auf denselben Wert. Hast du überhaupt dem Tree Control die ImageList zugewiesen, mit CTreeCtrl::SetImageList? Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 ..... HIER STAND WAS! .... ICH ZIEHE DIESE FRAGE ZURÜCK Zitieren
Guybrush Threepwood Geschrieben 9. Juli 2004 Geschrieben 9. Juli 2004 Schau mal hier. Vielleicht hilft dir ein Beispiel Programm einen bessern Überblick über die Funktionsweise zu bekommen. Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 Ich könnte verzeifeln.... Danke, ich habe es so gemacht, wie es da steht. ich habe jetzt auch den Platzhalter für ein image. Aber es ist weiß Nochmal zu den Registerkaten. Das hat sich erledigt. Hab ne super geile Anleitung gefunden, die sogar ich verstehe Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 ICH HASSE DAS TREECTRL! Umständlicher hätte man das Ding nicht machen können Zitieren
Klotzkopp Geschrieben 9. Juli 2004 Geschrieben 9. Juli 2004 Danke, ich habe es so gemacht, wie es da steht. ich habe jetzt auch den Platzhalter für ein image. Aber es ist weiß Hast du die Reihenfolge beachtet? 1. ImageList erstellen 2. ImageList dem TreeCtrl zuweisen 3. Items einfügen ICH HASSE DAS TREECTRL! Umständlicher hätte man das Ding nicht machen können Mal davon abgesehen, dass dieser Ausbruch niemandem weiterhilft, ich finde CTreeCtrl eigentlich ganz gut gelungen. Nur eine MoveItem-Funktion habe ich vermisst, aber die konnte ich recht einfach selbst schreiben. Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 Sorry, bin nur frustriert! Ja, ich habe die Reienfolge beachtet. Und es ist nur weiß. Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen /////////////////////////////////////////////////////////// // DIE BAUMSTRUCKTUR DES TREECTRL'S /////////////////////////////////////////////////////////// // Imagelist anlegen CImageList m_imagelist; //BILD, AUFLÖSUNG, FARBEN m_imagelist.Create(IDB_S_SERVER, 16, 16, ILC_COLOR32); //ImageList dem TreeCtrl hinzufügen m_CtrlTree.SetImageList (&m_imagelist, 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.cchTextMax = 6; tvinsert.item.cChildren = 0; tvinsert.item.lParam = 0; tvinsert.item.iImage = 0; tvinsert.item.iSelectedImage = 0; // SERVER tvinsert.item.pszText = "SERVER"; HTREEITEM hWurzel = m_CtrlTree.InsertItem(&tvinsert); Zitieren
Filou Geschrieben 9. Juli 2004 Autor Geschrieben 9. Juli 2004 Was ich eben herrausgefunden habe, die Größe des weißen Platzhalter ändert sich, entsprechent der Größe des ausgewählten Bildes. Habe eben ein 32x32 Bild eingesetzt und das weiß war größer. Zitieren
Klotzkopp Geschrieben 9. Juli 2004 Geschrieben 9. Juli 2004 Deine ImageList ist eine lokale Variable, das heißt, sie wird zerstört, wenn die Funktion beendet ist. Mach die ImageList zu einem Member der Klasse, zu der auch m_CtrlTree gehört. Zitieren
Filou Geschrieben 12. Juli 2004 Autor Geschrieben 12. Juli 2004 Guten Morgen!! Danke, das hat jetzt funktioniert :-) Allerdingst hat das Bild nur 16 Farben. Selbst wenn ich ILC_COLORDDB oder ILC_COLOR32 angebe. Woran könnte denn das liegen? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.