Checkbox im CTreeView
-
void CMyTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
UINT uFlags=0;
HTREEITEM hItem = HitTest(point,&uFlags);if (uFlags & TVHT_ONITEM) CDOCloseDlg::instance->onTreeItem(hItem);
}
-
Vielen Dank,
Er reagiert mir jetzt aber trotzdem immer noch ein Klick im Tree.
Ich weis nicht genau wohin mit
// TVHT_ONITEMSTATEICON in der Struktur TVHITTESTINFO
void CAuswahlDialog::OnNMClickListe2(NMHDR *pNMHDR, LRESULT *pResult) { DWORD dw = GetMessagePos(); CPoint point(GET_X_LPARAM(dw), GET_Y_LPARAM(dw)); m_TreeListe.ScreenToClient(&point); UINT uFlags=0; hPermanent = m_TreeListe.HitTest(point,&uFlags); if((hPermanent != NULL) && (TVHT_ONITEM & uFlags)) { // Macht was..... AfxMessageBox("Hallo"); } *pResult = 0; }Gruß
andy_mann
-
CTreeCtrl hat noch eine andere HitTest-Funktion:
HTREEITEM HitTest( TVHITTESTINFO* pHitTestInfo);
Aber mit deiner HitTest-Funktion müsste es auch gehen:
Probier' mal
[cpp]
if((hPermanent != NULL) && (uFlags & (TVHT_ONITEM | TVHT_ONITEMSTATEICON)))[/cpp]
-
MMMhhhhhh,
danke Dir, aber leider kein Unterschied.
Er springt immer in die IF anweisung, egal wo ich drauf klicke....Gruß
andy_mann
-
naja, evtl sind die koordinaten nicht so ganz optimal
machmal in deine treectrl klasse nen onLDown
bei mir gehts so nämlich ganz gut
-
Sorry mein Fehler!
Der Abschnitt
uFlags & (TVHT_ONITEM | TVHT_ONITEMSTATEICON)fragt, nur ab, ob eines der beiden Flags gesetzt ist,
wir sind aber an beiden interessiert, also:UINT checkflags = TVHT_ONITEM | TVHT_ONITEMSTATEICON; if((hPermanent != NULL) && ((TVHT_ONITEM & checkflags) == checkflags)) ...
-
Vielen Dank....
Gruß
andy_mann
-
Hallo,
jetzt habe ich aber noch einmal eine Frage,
wie oben beschrieben funkt das ganz ziemlich gut.
Jetzt habe ich alledings unter einem Item immer die selbe Struktur.
Item1
|_Alles
|_Gruppen
Item2
|_Alles
|_GruppenJetzt muß ich natürlich wissen, ob er auf alles Item1 oder Item2 gedrückt hat.
Mit meiner Funktion krige ich nur immer beide...
// In der .h std::vector<HTREEITEM> m_hItem; std::vector<HTREEITEM> m_hItemAlles; std::vector<HTREEITEM> m_hItemGruppe; void CStatistik::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. DWORD dw = GetMessagePos(); // retrieve mouse cursor position when msg was sent CPoint p(GET_X_LPARAM(dw), GET_Y_LPARAM(dw)); // ..and put into point structure m_Tree.ScreenToClient(&p); // make coords local to tree client area UINT htFlags = 0; HTREEITEM it = m_Tree.HitTest(p, &htFlags); // See where the click was on if (it != NULL && ( htFlags & TVHT_ONITEMSTATEICON)) { for(unsigned i = 0; i < m_hItem.size(); i++) { if(m_Tree.GetItemText(it) == m_Tree.GetItemText(m_hItem[i])) { // macht was..... } if(m_Tree.GetItemText(it) == m_Tree.GetItemText(m_hItemAlles[i])) { // macht was..... } if(m_Tree.GetItemText(it) == m_Tree.GetItemText(m_hItemGruppe[i])) { // macht was..... } } } *pResult = 0; }Kann mir da jemand weiter Helfen ??
Ich weiß zwar warum er immer auf beide reagiert, finde aber keine Lösung.Gruß
andy_mann
-
Ich glaub das hier könnte dir weiterhelfen:
http://www.cherea.de/bitbucket/checktree/checktree.html
-
Hallo,
vielen Dank, für eure Tips, die Seite kannte ich schon, habe auch ein paar Sachen daraus nehmen können.
Habs zwar nicht ganz so hin bekommen wie ich wollte, funktionieren tut es aber.
Gruß
andy_mann