Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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

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.

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?

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

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.

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.

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?

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?

.....

HIER STAND WAS!

....

ICH ZIEHE DIESE FRAGE ZURÜCK :)

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

ICH HASSE DAS TREECTRL!

Umständlicher hätte man das Ding nicht machen können :(

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.

Sorry, bin nur frustriert!

Ja, ich habe die Reienfolge beachtet. Und es ist nur weiß.

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

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.

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?

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.