tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
3244
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    JanZmus JanZmus ist offline Grünschnabel
    Registriert seit
    Jun 2004
    Beiträge
    2
    Hallo,
    ich habe einen CTreeCtrl mit Checkboxen vor jedem Eintrag (TVS_CHECKBOXES -Style). Jetzt suche ich ein Event, dass mir angibt, bei welchem Item ich gerade die Checkbox geklickt habe, aber so ein Event scheint es nicht zu geben.
    Ich kann doch nicht jedesmal, wenn ich in meinem TreeView klicke ALLE Einträge durchgehen und mir CTreeCtrl->GetCheck() ausgeben lassen (und mir auch noch alle states merken um zu sehen, ob sich was an der Checkbox geändert hat) ?

    vielen Dank,
    Jan Zmus
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Es gibt tatsächlich keinen Event dafür. Du musst einen Handler für OnClick... beim CTreeCtrl einfügen und dort prüfen, ob auf eine Checkbox geklickt wurde.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    // Inhalt des OnClick-Handlers
    // m_tree ist das CTreeCtrl-Objekt
     
    NMTREEVIEW *pNM  = (NMTREEVIEW *)pNMHDR;
    POINTS     pts   = MAKEPOINTS(::GetMessagePos());
    UINT       nFlags;
     
    HTREEITEM hItem = m_tree.HitTest(CPoint(pts.x, pts.y), &nFlags);
     
    if( hItem && (nFlags & TVHT_ONITEMSTATEICON) )
    {
        if( m_tree.GetCheck(hItem) )
        {
            // ...
        }    
    }
     
    *pResult = 0;
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  3. #3
    JanZmus JanZmus ist offline Grünschnabel
    Registriert seit
    Jun 2004
    Beiträge
    2
    Danke für die schnelle Antwort, funktioniert super !

    Jan Zmus
     

  4. #4
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    Moin Moin, Ich mal wieder,

    hab gerade das selbe Problem gehabt wie JanZmus, und bin dankbar für die Antwort.

    zwar jetzt allerdings nicht ohne Probleme.
    1)
    Code :
    1
    
    POINTS     pts   = MAKEPOINTS(::GetMessagePos());
    muss ich als
    Code :
    1
    2
    
    DWORD r=::GetMessagePos();
        POINTS pts = MAKEPOINTS(::GetMessagePos());
    schreiben
    sonst erhalte ich den Fehler
    "error C2102: '&' erwartet L-Wert"

    2)
    Ich bekomme die Koordinaten als Screen Koordinaten und muss die einmal noch durch die ScreentoClient Funktion jagen.

    Daher meine Fragen: Wo ist der Sinn bei 1) den verstehe ich mal garnicht. Und ist die Transformation der Koordinaten wirklich nötig?

    Gruß Michael
     

  5. #5
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Du hast recht, in der Form konnte es nicht funktionieren. Da hatte ich Murks zusammengeschrieben .
    Man muss das Ergebnis von "GetMessagePos()" erst in einer Variablen speichern, bevor man MAKEPOINTS vewendet. Und die Koordinatentransformation hatte ich glatt unterschlagen.
    Alternativ zu MAKEPOINTS kann man auch mit LOWORD, HIWORD die X/Y-Positionen herauslösen.
    Der folgende Code sollte jetzt aber richtig funktionieren:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    NMTREEVIEW *pNM  = (NMTREEVIEW *)pNMHDR;
     
    DWORD      dwPos = ::GetMessagePos();
    CPoint     pt(LOWORD(dwPos), HIWORD(dwPos));        
     
    m_tree.ScreenToClient(&pt);
     
    HTREEITEM hItem = m_tree.HitTest(pt, &nFlags);
    UINT      nFlags;
     
    if( hItem && (nFlags & TVHT_ONITEMSTATEICON) )
    {
        if( m_tree.GetCheck(hItem) )
        {
            // ...
        }    
    }
     
    *pResult = 0;

    Der OnClick-Event wird ausgelöst, wenn irgendwo auf dem Item geklickt wird. Um speziell die Checkbox zu testen, müssen daher die genauen Maus-Koordinaten beim Auslösen des Events bestimmt werden. Das ist der Sinn der GetMessagePos()-Geschichte.

    Die Koordinatentransformation ist nötig, weil HitTest (stellt fest, auf welchen Bereich des Items denn nun geklickt wurde) mit Client-Korrdinaten arbeitet, GetMessagePos() aber Screen-Koordinaten liefert.

    Kleine Ergänzung: Gemeinerweise wird die Checkbox erst geändert, wenn der OnClick-Code "durch" ist. Daher muss bei GetCheck() immer "andersherum" getestet werden.
    Geändert von MCoder (15.09.05 um 10:14 Uhr)
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  6. #6
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    Danke für die Erklärung. Hatte das auch so gelöst. Mich hatte es nur gewundert, wieso es bei JanZmus ****te und ich da noch was ändern musste. Nach den Änderungen funktioniert es bei mir aber auch super...
    Die Erklärung dürfte auf jeden Fall anderen weiterhelfen.

    Gruß Michael
     

  7. #7
    Typhlosion Tutorials.de Gastzugang
    Gibt es denn auch eine Möglichkeit, die Checkbox abzufragen, wenn der Benutzer anstatt die Maus zu bewegen die Tastatur verwendet (Leertaste)?
    Weil das Click-Event ja dann nicht ausgelöst wird...
     

  8. #8
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Man müsste auf die TVN_KEYDOWN-Message reagieren und kann dann die CheckBox des jeweiligen Items abfragen.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

Ähnliche Themen

  1. CTreeCtrl
    Von CodeFatal im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 08.06.06, 08:38
  2. CTreeCtrl
    Von CodeFatal im Forum VisualStudio & MFC
    Antworten: 5
    Letzter Beitrag: 01.12.05, 10:30
  3. CTreeCtrl
    Von CodeFatal im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 06.10.05, 15:04
  4. CTreectrl
    Von Rettig im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 24.06.05, 14:05
  5. CTreeCtrl
    Von gehrti im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 28.04.05, 08:56