Treeviews
-
hWindow ist der Fensterhandle des Hauptfensters, dort steht die Adresse, an dem das fenster gespeichert ist
-
Ist diese Variable auch innerhalb den Funktion sichtbar? Also: ist sie global?
-
Fehlercode und verhalten sehen eher danach aus, das hWindow *kein* gültiger Window Handle ist
probier mal ein _ASSERT(::IsWindow(hWindow))
-
Danke für den Hinweis mein Fensterhandle ist ein Nullpointer!
-
ja mein Fensterhandle ist global. Habe dsa problem aber jetzt gelöst. Wie füge ich denn jetzt items in meine treeview hinzu?! ich komm da total durcheinander habe in die msdn geschaut. weiss jetzt dass es da zwei Strukturen gibt die TVISERTSTRUCT und die TVITEM. Wie ist denn der zusammenhang vom beidem? Ich versthee auch nicht in der TCINSERTSTRUCT sind 4 Parameter wobei die letzten beiden jeweils ne Instanz von TVINSERT oder TVINSERTEX sind. wie geht denn das nun?!
-
Du verwendest TVM_INSERTITEM, und eine TVINSERTSTRUCT
Das TVITEM besteht aus dem Parent-HTREEITEM, dem HTREEITEM hinter dem man einfügen will, und einem TVITEM mit den Item-Daten.
Das du 3 siehst muß an was anderem liegen
Für normale Builds ohne
#define _WIN32_IE 0x0400
(oder kleiner) gibt es nur einen TVITEM
Für Builds, bei denen _WIN32_IE definiert und größer als 0x0400 ist (Das sind binaries, die explizit von Funktionalität abhängen die mit IE4 ausgeliefert wurde - beim System dabei ab Win98 Second Edition) gibt es eine union (Gartenzaunwink) für entweder einen TVITEM (alles wie üblich) oder einen TVITEMEX (der zusätzliche Funktionalität anbietet, die es aber nur in den seit und mit IE4 ausgelieferten comctl32.dll's gibt)
-
genau die struktur ist mein problem. Sorry wenn ich nochmal das frage was du mir wahrscheinlich grade beantwortet hast , aber ich habe es beim besten willen nicht verstanden:
aus der msdn:
typedef struct tagTVINSERTSTRUCT {
HTREEITEM hParent;
HTREEITEM hInsertAfter;
#if (_WIN32_IE >= 0x0400)
union
{
TVITEMEX itemex;
TVITEM item;
} DUMMYUNIONNAME;
#else
TVITEM item;
#endif
} TVINSERTSTRUCT, FAR *LPTVINSERTSTRUCT;wieso ist in der Struktur ein TVITEMEX und ein TVITEM drin?! wann muss ich wie was damit machen?! ich habe jetzt meine strukturen bisjetzt so:
TVITEM ti [] = { { TVIF_TEXT, hTax, TVIS_BOLD, TVIS_OVERLAYMASK , tax, 17, I_IMAGECALLBACK, I_IMAGECALLBACK, I_CHILDRENCALLBACK } }; TVINSERTSTRUCT tv [] = //diese struktur speichert die Eigenschaften des Treeview { {TVI_ROOT, TVI_LAST, 0, ti} };
-
Ich bin mir nicht sicher, ob die Konstant-Deklaration mit der Union noch so funktioniert. Im schlimmsten Fall halt direkt zuweisen.
Du kannst entweder die TVITEM oder TVITEMEX struktur mit mehr Parametern verwenden.
Ob die zusätzlichen Parameter in TVITEMEX verwendet werden, hängt von den in TVITEM(EX).mask gesetzten bits ab.
-
Naja es funktioniert jetzt so einigermaßen aber sieht scheisse aus. Die Einträge sind alle untereinander und anklicken kann man sie auch nicht. Was kann ich denn damit jetzt alles so machen?! kann vielleicht jemand mir einmal erklären wie das alles funktioniert (also worauf es ankommt) oder mir einen Link zu einem vernünftigen Tutorial geben, was auf der einen seite verständlich ist und auf der anderen Seite meine Probleme beantwortet?!
-
Item Selection
A tree-view control notifies the parent window when the selection changes from one item to another by sending the TVN_SELCHANGING and TVN_SELCHANGED notification messages. Both notifications include a value that specifies whether the change is the result of a mouse click or a keystroke. The notifications also include information about the item that is gaining the selection and the item that is losing the selection. You can use this information to set item attributes that depend on the selection state of the item. Returning TRUE in response to TVN_SELCHANGING prevents the selection from changing, and returning FALSE allows the change.Meintest du das, oder was anderes? Ansonsten schau doch einfach in die MSDN-Library, das steht alles drin
-
ja da habe ich aber auch schon reingeguckt. Ich will aber jetzt z.B. einen Eintrag haben und die anderen Einträge sollen Äste von den Einen sein und nicht von Root. Naja in der MSDN steht man soll dann den Handle des einen, an dem sie angehängt werden, angeben und nicht TVI_ROOT, aber bei mir geht das nicht
-
was heißt "geht das nicht"???
der parent ist der hParent im TVITEM...
pseudo-
TVITEM itFirst = { ... }; HTREEITEM htiFirst = (HTREEITEM) SendDlgItemMessage(..., &itFirst); TVITEM itChildOfFirst; // ... itChildOfFirst.hParent = htiFirst; HTREEITEM htiChildOfFirst = (HTREEITEM) SendDlgItemMessage(..., &itChildOfFirst);
-
was ist denn jetzt SendDlgItemMessage?! Ich nutze normalerweise immer SendMessage....
-
SendDlgItemMessage ist nur bequemer, wenn man an ein Dialog-Element was schicken will:
statt
HWND hwndTree = ::GetDlgitem(hwndDlg, IDC_TV_TREE); ::SendMessage(hwndTree, ...)
schreibst du halt
::SendMessage(hwndDlg, IDC_TV_TREE, ...)
sonst ändert sich nix
-
ja und was haben jetzt Dialoge mit TreeViews zu tun?! ich will doch nur einige Treeviewitems an nem Treeviewitem anhängen. In der Dokumentation steht man soll das handle des elterntreeviews angeben aber bei mir klappt das nicht