Treeview SelectItem
-
vor ein paar minuten hatte ichs endlich hinbekommen
std::wstring CTreeview::GetItemText(HTREEITEM Item){
TVITEM item;
item.hItem = Item;
item.mask = TVIF_TEXT;
std::wstring str;
item.pszText = (LPTSTR)str.c_str();
item.cchTextMax = (int)str.capacity();
::SendMessage(m_Handle, TVM_GETITEM, NULL, (LPARAM)&item);
return str.c_str();
}ps. mit macros arbeite ich nicht, makros doof und boese #gg
bin grad dabei meine methoden neu zu implementieren - also alles neu aufzubauen ohne die listen - nicht so einfach den gesammten baum zu durchsuchen - und wie ich doppelte namen handel weiss ich noch nicht {wenn ich sag add item und den string das parent angeb, das ich weiss zu welchem item es added werden soll}
-
Ist das mit den Makros auf mein Code bezogen? Da sind keine Makros drinne.
Ja das mein ich ja mit den Namen das ist ne schlechte Implementierung weil du nix eindeutiges hast. Mach es wie einer meiner Vorredner gesagt hat und nimm das LPARAM vom ITEM da kannst ja soviele Informationen reinpacken wie du willst.MfG schirrmie
-
Doch TreeView_GetItem ist ein Makro!
Allerdings kann ich diese Meinung nicht teilen. Diese Art Makros helfen immens beim korrekten Umgang mit den entsprechenden Fensterklassen!
-
Achso stimmt ja daran hab ich garnicht gedacht. Naja ob da nun nen SendMessage oder nen Makro steht ist mir Relativ. Ich find die Makros nur übersichtlicher beim lesen. Beim Überfliegen erkennt man halt sofort was gemacht wird was bei SendMessage meist nicht sooo schnell der Fall ist aber naja das ist geschmackssache.
MfG schirrmie
-
Martin Richter schrieb:
Allerdings kann ich diese Meinung nicht teilen. Diese Art Makros helfen immens beim korrekten Umgang mit den entsprechenden Fensterklassen!
das ist bei mir ein vorurteil wo ich keine lust habe das abzulegen - hast schon recht aber egal #gg
das mit den namen - mein ziel ist ja das man das tree nur mit namen handeln kann, das man spaeter beim benutzen die id oder soetwas nicht kennen braucht
wie ich "AddItem(std::wstring Name, std::wstring Parent)" implementiere sobald ein name mehrmals auftaucht weiss ich noch nicht, denk da schon den ganzen tag drueber nach
-
Mr Evil schrieb:
ps. mit macros arbeite ich nicht, makros doof und boese #gg
Kann ich unterstützen, ABER wenn Du schon keine Makros nutzt (wie das in C++ ja üblich ist), dann nimm doch auch C++ Casts und keine C - Casts
.
-
ja ich weiss, bloede angewohnheit - komme wie so viele aus der c schiene und bin da vorbelastet
bei den casts
reinterpret_cast<>()
dynamic_cast<>()
static_cast<>()und welche es noch gibt {?} blick ich zZt nicht ganz durch welches wann am besten zu gebrauchen ist
-
Ich denke ohne eine Entsprechende Id oder so wirst du nicht weit kommen oder du legst fest das ein Name nur einmal vorkommen darf aber ka was du vor hast und es so gehen kann?
Versteh aber nicht ganz dein Problem mit den Namen. Wenn ein User in nem TreeView später was selektiert oder so da brauchst du doch keine Namen oder so dann hast doch das Item also ich versteh dein Problem nicht wirklich. Was hast du denn mit dem TreeView vor das es Nur über Namen ansprechbar sein soll? Also ich hab bis jetzt immer mit der Maus draufgeklickt oder mit der Tastatur navigiert und nich Probleme gehabt
MfG schirrmie
-
es geht darum das man durch den code auch items hinzufuegen kann ohne das man vorher was selectieren muss oder aehnliches
ich hab mir das nu so gedacht das man bei add noch die id uebergibt und wenn man es nicht weiss kann man holen, mit der bedingung das wenn man die id holt immer das erste vorkommende item benutzt wird - also
BOOL AddItem(std::wstring Name, int ParentId=-1);
.
.
.// add auf root
BOOL ret = m_TreeView.AddItem(_T("First"));
subitem auf "First"
ret = m_TreeView.AddItem(_T("Next"), 1);
wenn man die ID des objektes nicht kennt
ret = m_TreeView.AddItem(_T("Next"), m_TreeView.GetItemId(_T("First")));ob die objekt id und parent id uebergeben wird, oder nur das parent, da muss ich noch ueberlegen wie ich das loes, ich denk mir das ich wahrscheinlich beides uebergeben lass also
BOOL AddItem(std::wstring Name, UINT ItemId, int ParentId=-1);
-
Also ähm, hab mal ne kleine Übersicht gemacht
:[u][b]static_cast<>():[/b][/u] 1. Type << static_cast<Type>(OtherType); // einfacher Typ-Cast 2. Type* << static_cast<Type*>(OtherType*); // nur wenn sicher, sonst dynamic_cast [u][b]reinterpret_cast<>():[/b][/u] 1. Type << static_cast<Type>(OtherType); // aber dann lieber static_cast 2. Type* << static_cast<Type*>(OtherType); // sollte man aber vermeiden [u][b]dynamic_cast<>():[/b][/u] Prüft, ob eine Konvertierung gültig ist. Beispiel: class CBase { public: int GetWas(); /* ... */ }; class CDerived : CBase { public: int GetNochWas(); /* ... */ }; CBase* pbManage = new CDerived(...); int iResult; if(dynamic_cast<CDerived*>(pbManage)) iResult = dynamic_cast<CDerived*>(pbManage)->GetNochWas(); [u][b]const_cast<>():[/b][/u] Damit lassen sich die Schlüsselworte [i]const[/i], oder [i]volatile[/i] (und [i]__unaligned[/i])(weg-)casten. Sowas sollte man aber gründsätzlich vermeiden (bz. nur durchführen wenn es sicher ist)!Hier hast Du nochmal ne genauere Übersicht mit Erklärungen und Beispielen:
Casting Operators
.
-
hei vielen dank, sehr nett {=
-
jetzt hab ich erstmal das problem
HTREEITEM CTreeview::GetItem(UINT id){ TVITEM item; item.mask = TVIF_HANDLE|TVIF_TEXT|TVIF_PARAM; item.lParam = id; ::SendMessage(m_Handle, TVM_GETITEM, NULL, reinterpret_cast<LPARAM>(static_cast<TV_ITEM *>(&item))); return NULL; }wie komme ich an das HTREEITEM wenn ich nur die id (lParam) habe,
-
Ich denke da bleibt dir nichts anderes übrig als alle Items durchzugehen und zu Prüfen ob sie die gesuchte Id hat. Wenn ja hast du ja so gut wie das HTREEITEM.
MfG schirrmie
-
das problem ist - GetItem moechte ein TV_ITEM - ich kann eines erstellen welches ich die id zuweise, dann der aufruf, aber ich erhalte nichts wirklich zurueck
HTREEITEM CTreeview::GetItem(UINT id){ TVITEM item; item.mask = TVIF_HANDLE|TVIF_TEXT|TVIF_PARAM; item.lParam = id; ::SendMessage(m_Handle, TVM_GETITEM, NULL, reinterpret_cast<LPARAM>(static_cast<TV_ITEM *>(&item))); return NULL; }
-
Falsche Anwendung!
hItem mit Item Handle füllen.
pszText mit Zeiger setzen.
Größe nach cchTextMax.
mask auf TVIF_HANDLE|TVIF_TEXT!
-
irgendwie mag mich das treeview nicht
HTREEITEM CTreeview::GetItem(UINT id){ // get the first root item HTREEITEM item = reinterpret_cast<HTREEITEM>(::SendMessage(m_Handle, TVM_GETNEXTITEM, NULL, TVGN_ROOT)); // for store the item TV_ITEM tviTemp; tviTemp.mask = TVIF_HANDLE|TVIF_PARAM; tviTemp.hItem = item; // add the first root item // get the root item attributes - after this lParam = 0 (correct) ::SendMessage(m_Handle, TVM_GETITEM, NULL, reinterpret_cast<LPARAM>((static_cast<TV_ITEM *>(&tviTemp)))); // get next item HTREEITEM NextItem = reinterpret_cast<HTREEITEM>(::SendMessage(m_Handle, TVM_GETNEXTITEM, TVGN_NEXT, reinterpret_cast<LPARAM>(static_cast<HTREEITEM>(item)))); // put the next item elements to the temp item tviTemp.hItem = NextItem; // get the item attributes - after this lParam = 0 (false) ::SendMessage(m_Handle, TVM_GETITEM, NULL, reinterpret_cast<LPARAM>((static_cast<TV_ITEM *>(&tviTemp)))); return item; }egal was ich mach, lParam ist immer 0, ein vergleich bringt nie etwas
hinzugefuegt hab ich die elemente so:BOOL CTreeview::AddItem(DString Name, UINT ItemId, int ParentId){ TV_ITEM item; item.mask = TVIF_TEXT; item.pszText = (LPTSTR)Name.c_str(); item.lParam = ItemId; TV_INSERTSTRUCT inserter; inserter.item = item; inserter.hParent = (ParentId != -1) ? GetItem(ParentId) : TVI_ROOT; inserter.hInsertAfter = TVI_SORT; ::SendMessage(m_Handle, TVM_INSERTITEM, NULL, reinterpret_cast<LPARAM>(static_cast<LPTVINSERTSTRUCT>(&inserter))); return TRUE; } . . . m_Treeview.AddItem(_T("First"), 0); m_Treeview.AddItem(_T("Second"), 1); m_Treeview.AddItem(_T("Third"), 2);ich werd langsam gefrustet
//DString == std::wstring
//dazuedit - ich habs, ich hab vergessen beim hinzufuegen das mask TVIF_PARAM zu setzen, die id's wurden gar nicht mitgespeichert
nu muss ich nur ueberlegen wie ich alle items durchgehen kann, auch subitems usw