CTreeCtrl mit Checkboxen
-
Hallo,
ich will darauf reagieren, wenn der Anwender in der TreeCtrl ein Item checked/unchecked.Habe schon folgendes versucht:
ON_NOTIFY(NM_CLICK, 1,OnClick) void TreeCtrl::OnClick(NMHDR *pNMHDR,LRESULT *){ LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); HTREEITEM hnew = pNMTreeView->itemNew.hItem; HTREEITEM hold = pNMTreeView->itemOld.hItem; }
Problem ist, das die Methode auch aufgerufen wird, wenn man irgendwo ins Ctrl klickt. Ausserdem scheint mir weder hnew noch hold sinnvoll, nachdem eine Checkbox betätigt wurde, dessen Item nicht markiert ist. Checkbox betätigen selektiert nicht das Item, so dass ein anderes noch selektiert sein kann.
Welche Message fange ich daher sinnvollerweise ab?
Wie bekomme ich das entsprechende Item?
-
Ob es eine besser geeignete Nachricht gibt weiß ich jetzt nicht, aber ich mache es auch bei NM_CLICK.
void CDialog::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) { CPoint ptMouse; GetCursorPos(&ptMouse); m_Tree.ScreenToClient(&ptMouse); UINT nFlags = 0; HTREEITEM hSelItem = m_Tree.HitTest(ptMouse, &nFlags); if(hSelItem != NULL && (nFlags & TVHT_ONITEMSTATEICON)){ // Checkbox gecklickt } *pResult = 0; }
-
Nimm TVN_ITEMCHANGED
http://msdn.microsoft.com/en-us/library/bb773526(VS.85).aspx
-
Hallo,
Danke euch beiden.@Martin: Deine Lösung funktioniert erst ab Vista (wenn ich das richtig verstehe), muss aber auch unter XP laufen.
@Source: Das funktioniert tatsächlich so. Wie soll man nur auf sowas kommen?
-
Source2702 schrieb:
Ob es eine besser geeignete Nachricht gibt weiß ich jetzt nicht, aber ich mache es auch bei NM_CLICK.
void CDialog::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) { CPoint ptMouse; GetCursorPos(&ptMouse); m_Tree.ScreenToClient(&ptMouse); UINT nFlags = 0; HTREEITEM hSelItem = m_Tree.HitTest(ptMouse, &nFlags); if(hSelItem != NULL && (nFlags & TVHT_ONITEMSTATEICON)){ // Checkbox gecklickt } *pResult = 0; }
Ich gebe zu bedenken, dass dieser Ansatz fehlschlägt, wenn das Programm mit der Tastatur bedient wird.