Zum Inhalt springen

? CTreeCtrl ?


Filou

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...