Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: MFC (Visual C++) ::  CTreeCtrl deselect item     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
rgherzog
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.12.2011
Beiträge: 11
Beitrag rgherzog Mitglied 12:11:54 07.12.2011   Titel:   CTreeCtrl deselect item            Zitieren

Hallo Forums User,

habe zwei TreeCtrls. Wenn ich in der ersten TreeCtrl ein Element anklicke, möchte ich die Selektion in der zweiten aufheben.

Dies funktioniert mit folgendem Kommando aber nur augenscheinlich:

Code:
m_treeCtrl.SetItemState(hcurTreeItem, 0, TVIS_SELECTED);
Code:
m_treeCtrl.SetItemState(hcurTreeItem, 0, TVIS_SELECTED);
Code:
m_treeCtrl.SetItemState(hcurTreeItem, 0, TVIS_SELECTED);


Das Element vom zweiten Baum ist zwar nicht mehr als markiert sichtbar, kann es aber auch nicht mehr anklicken, solange ich nicht ein anderes Element im Baum angeklickt habe.

Mit welchen Befehlen kann ich Items im Baum sauber selektieren und deselektieren?

Danke und MFG Reinhart
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13520
Beitrag Martin Richter Moderator 14:51:54 07.12.2011   Titel:              Zitieren

Eigentlich müsste es gehen.

Ich benutze allerdings für das Selektieren SelectItem...
http://msdn.microsoft.com/en-US/library/w8hy20sy(v=VS.80).aspx

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
rgherzog
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.12.2011
Beiträge: 11
Beitrag rgherzog Mitglied 19:30:39 09.01.2012   Titel:   Zugriff über Membervariable            Zitieren

Hi,

danke für deine Antwort. Wenn ich SelectItem innerhalb einer von CtreeCtrl abgeleiteten Klasse aufrufe, funktioniert das - nur wenn ich über eine Member Variable versuche zu selektieren oder abzuwählen, dann funktioniert das nicht.

Muss ich da die CTreeCtrl invalidieren, damit die Selektion/Deselektion erfolgreich ist?

danke und mfg rgherzog
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13520
Beitrag Martin Richter Moderator 09:06:38 10.01.2012   Titel:              Zitieren

Nein! Das ist nicht nötig.
Und es spielt auch keine Rolle von wo man es aufruftm außer Du hast die eigentliche Implementierung durch eine eigene verdeckt.

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
rgherzog
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.12.2011
Beiträge: 11
Beitrag rgherzog Mitglied 09:32:47 10.01.2012   Titel:   Falsches Handle            Zitieren

Hallo, Guten Morgen,
ja, hab gesten noch gemerkt, dass der Wert meines vermeintlich angeklickten HTREEITEMS nicht gestimmt hat und deshalb die Selektion nicht möglich war.

Kann ich eigentlich die Selektion eines HTREEITEMS ganz entfernen - mit SetItemState(...) - oder muss ich einfach ein anderes Item Selektieren, wenn ich ein bestimmtes Item abwählen möchte?

danke und mfg
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13520
Beitrag Martin Richter Moderator 14:28:53 10.01.2012   Titel:              Zitieren

Ein Tree-Control ist vom Grundsatz her immer nur für einzelene Selelktion gebaut. D.h. ein Item zu einer Zeit.

Wen Du SelectItem(NULL) verwendest wird eine Selektion aufgehoben, SelectItem(otherItem) hebt die aktuelle Auswahl auf und setzt die neue.

Steht wie immer in der MSDN:
http://msdn.microsoft.com/en-US/library/w8hy20sy(v=VS.100).aspx
Siehe auch TVM_SELECTITEM
http://msdn.microsoft.com/en-us/library/windows/desktop/bb773736(v=vs.85).aspx

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
rgherzog
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.12.2011
Beiträge: 11
Beitrag rgherzog Mitglied 23:02:10 11.01.2012   Titel:              Zitieren

Hi,

wenn ich m_treeCtrl.SelectItem(NULL) machen, schlägt ENSURE_ARG(hItem != NULL) in wincrtl2.cpp fehl.

Was kann ich da machen?

danke und mfg
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13520
Beitrag Martin Richter Moderator 11:59:40 12.01.2012   Titel:              Zitieren

Ich habe keinen entsprechenden Test. CTreeCtrl::SelectItem führt bei mir direkt SendMessage mit TVM_SELECTITEM aus.

Dieser Code:
C/C++ Code:
ENSURE_ARG(hItem != NULL);
C/C++ Code:
ENSURE_ARG(hItem != NULL);
C/C++ Code:
ENSURE_ARG(hItem != NULL);

Kommt bei mir nur in GetItemData vor. Nicht in SelectItem.

Was machst Du denn da?

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
rgherzog
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.12.2011
Beiträge: 11
Beitrag rgherzog Mitglied 09:08:19 13.01.2012   Titel:              Zitieren

Morgen,

hab mir das gestern angesehen und folgendes festgestellt:

Ich reagier auf die TVN_SELCHANGED Message. Wenn ich dann m_treeCtrl.SelectItem(NULL) aufrufe, springt er wieder in die Messagehandler Methode von TVN_SELCHANGED rein und da hab ich dann das GetItemData drinnen.

jetzt mach ich folgende Prüfung und nun funktionierts:
TVHITTESTINFO* pTVHitTest=(TVHITTESTINFO*) pNMHDR;
HTREEITEM hItem=pTVHitTest->hItem;

Danke für deine Hilfe - jetzt funktioniert die Selektion in meinen Bäumen :-)

mfg rgherzog
rgherzog
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.12.2011
Beiträge: 11
Beitrag rgherzog Mitglied 16:37:29 03.02.2012   Titel:   rechte oder linke Maustaste            Zitieren

Hallo,

eine Frage noch: Schaffe ich es irgendwie, in meiner OnTvnSelChanged(...) zu prüfen, ob die linke oder die rechte Maustaste gedrückt wurde?

Wenn ich das nicht in der OnTvnSelChanged(...) rausbekomme, wie schaffe ich das dann?

danke und lg. rherzog
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13520
Beitrag Martin Richter Moderator 21:31:50 03.02.2012   Titel:              Zitieren

GetKeyState / VK_LBUTTON / VK_RBUTTON

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
rgherzog
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.12.2011
Beiträge: 11
Beitrag rgherzog Mitglied 15:44:46 04.02.2012   Titel:              Zitieren

Servus Martin,

danke nochmal für deine Antwort!

GetKeyState(VK_LBUTTON) hat nicht immer eine 1 geliefert, wenn ich mit der linken Maustaste gedrückt habe - warum weiß ich nicht.

So hab ich es nun hingebracht:
Code:
SHORT leftMouseKlicked = GetAsyncKeyState(VK_LBUTTON);
SHORT rightMouseKlicked = GetAsyncKeyState(VK_RBUTTON);
if(leftMouseKlicked && !rightMouseKlicked)
{
    //Hier mache ich nun was Schönes
}
Code:
SHORT leftMouseKlicked = GetAsyncKeyState(VK_LBUTTON);
SHORT rightMouseKlicked = GetAsyncKeyState(VK_RBUTTON);
if(leftMouseKlicked && !rightMouseKlicked)
{
//Hier mache ich nun was Schönes
}
Code:
SHORT leftMouseKlicked = GetAsyncKeyState(VK_LBUTTON);
SHORT rightMouseKlicked = GetAsyncKeyState(VK_RBUTTON);
if(leftMouseKlicked && !rightMouseKlicked)
{
    //Hier mache ich nun was Schönes
}


danke und grüße reinhart
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13520
Beitrag Martin Richter Moderator 19:31:35 04.02.2012   Titel:              Zitieren

GetAsnchKeyState ist in jedem Falle falsch. Du willst den Status der Taste wissen, zu dem Moment, indem Du die Nachrichrt bearbeitest. Nicht ob danach die Taste dedrückt wurde!

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
rgherzog
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.12.2011
Beiträge: 11
Beitrag rgherzog Mitglied 10:37:26 05.02.2012   Titel:              Zitieren

servus Martin,

Code:
SHORT leftMouseKlicked = GetKeyState(VK_LBUTTON);
Code:
SHORT leftMouseKlicked = GetKeyState(VK_LBUTTON);
Code:
SHORT leftMouseKlicked = GetKeyState(VK_LBUTTON);


hat komisches Verhalten gezeigt.

Die Variable leftMouseKlicked war nicht immer 1, obwohl ich nur mit der linken Mausstaste auf meine TreeItems im Baum geklickt habe.

Das hat so richtig zufällig ausgesehen das Verhalten - zweimal wurde die linke Maustaste registriert und dann wieder nicht usw.

grüße Reinhart
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13520
Beitrag Martin Richter Moderator 09:25:02 06.02.2012   Titel:              Zitieren

Dir ist klar, dass Du auf <0 testen musst?

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
rgherzog
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.12.2011
Beiträge: 11
Beitrag rgherzog Mitglied 10:16:36 11.02.2012   Titel:              Zitieren

servus,

leftMouseKlicked wird bei mir nie kleiner 0.
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13520
Beitrag Martin Richter Moderator 18:33:06 11.02.2012   Titel:              Zitieren

Das kann nicht sein...

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
C/C++ Forum :: MFC (Visual C++) ::  CTreeCtrl deselect item   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.