Sichtbarkeit von Buttons



  • Also ich hoffe ich habe das richtige Forum für mein Problem genommen.

    Zu meinem Problem:

    Ich habe ein Dialogfenster mit einem ListCtrl und zwei Button. Meine Absicht wäre, dass wenn keine Zeile in der Liste markiert ist, dass die zwei Button deaktiviert sind. Sobald eine Zeile markiert ist sollen die Buttons wieder beklickbar sein.

    Mein Versuche mit OnNMKillfocus scheiterten:

    void CLagerverwaltungTestView::OnNMClickList2(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	m_loeschen.EnableWindow(1);
    	m_aendern.EnableWindow(1);
    	*pResult = 0;
    }
    
    void CLagerverwaltungTestView::OnNMKillfocusList2(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	m_loeschen.EnableWindow(0);
    	m_aendern.EnableWindow(0);
    	*pResult = 0;
    }
    

    Ich wäre dankbar für eure Hilfe.
    Falls ihr noch etwas braucht gebt Bescheid.

    Bis dann


  • Mod

    Das hat ja auch nichts mit dem Focus zu tun.
    LVN_ITEMCHANGED ist was Du suchst:
    http://msdn.microsoft.com/en-us/library/bb774845(VS.85).aspx

    Einen Rumpf für solchen Code habe ich mal zu einem anderen Thema in mein blog gestellt:
    http://blog.m-ri.de/index.php/2010/01/04/cdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling/



  • Martin Richter schrieb:

    Das hat ja auch nichts mit dem Focus zu tun.
    LVN_ITEMCHANGED ist was Du suchst:
    http://msdn.microsoft.com/en-us/library/bb774845(VS.85).aspx

    Einen Rumpf für solchen Code habe ich mal zu einem anderen Thema in mein blog gestellt:
    http://blog.m-ri.de/index.php/2010/01/04/cdialogsetdefid-und-dm_setdefid-des-tastaturfreunds-liebling/

    Ich weiß nicht ob du weißt was ich möchte oder ich nicht weiß was du meinst. Aber mit LVN_ITEMCHANGED tut sich bei mir gar nichts. Es kann auch daran liegen das ich die Erklärungen bei MSDN nicht verstehe. Könntest du mir villeicht ein Beispiel geben



  • Auf Martins Blog ist doch ein Sample zum Herunterladen. Nicht gesehen? Hilft dir das nicht?



  • _matze schrieb:

    Auf Martins Blog ist doch ein Sample zum Herunterladen. Nicht gesehen? Hilft dir das nicht?

    Habe mal reingeschaut und es mal in meinem Programm angewendet, aber wenn ich die Markierung aufhebe dann bleiben meine Button aktiviert. Das soll aber nicht so sein jemand noch eine Idee.

    Bisheriger Code:

    void CLagerverwaltungTestView::OnNMClickList2(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	m_loeschen.EnableWindow(1);
    	m_aendern.EnableWindow(1);
    	*pResult = 0;
    }
    
    void CLagerverwaltungTestView::OnLvnItemchangedList2(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    	*pResult = 0;
    
    	// Check who has the focus
    	CWnd *pwndFocus = GetFocus();
    
    	if (pwndFocus == &m_loeschen || pwndFocus ==  &m_aendern)
    		return;
    
    	m_loeschen.EnableWindow(0);
    	m_aendern.EnableWindow(0);
    }
    

  • Mod

    Weißt Du eigentlich was Du programmierst?
    Ich weiß nicht was Du nicht verstehst?

    Wenn Du den EnableWindow nur ausführst wenn der Focus auf löschen oder ändern ist, dann kann das nicht gehen... 👎



  • Martin Richter schrieb:

    Weißt Du eigentlich was Du programmierst?
    Ich weiß nicht was Du nicht verstehst?

    Wenn Du den EnableWindow nur ausführst wenn der Focus auf löschen oder ändern ist, dann kann das nicht gehen... 👎

    if (pwndFocus == &m_loeschen || pwndFocus ==  &m_aendern)
        return;
    
    m_loeschen.EnableWindow(0);
    m_aendern.EnableWindow(0);
    

    Also das was ich hier programmiert hab soll bedeuten, dass, wenn der Focus auf den beiden Button ist, soll er nichts machen und aus der Funktion rausgehen. Ansonsten deaktiviert er die beiden Button wieder.


  • Mod

    Und welchen Sinn soll das haben?
    Wenn der Benutzer in das List-Control klickt, dann ist der Focus dort. Also nicht bei den Buttons.

    Folgerichtig wird auch kein EnableWindow(FALSE) ausgeführt...



  • Also nochmal komplett von neu:

    Ich habe ein Dialogfenster mit einem ListCtrl und ein paar Einträge zu Artikeln mit Artikelnummer, Beschreibung usw.

    Dann habe ich zwei Button mit Löschen und Ändern. Die sind von vorne herein deaktiviert, da man diese erst benutzen darf, wenn man einen Artikel ausgewählt hat. Die Button aktivieren sich, wenn ein Artikel markiert wird. Wenn die Markierung wieder entfernt wird, sollen die Button sich wieder deaktivieren.

    Hoffe es hat jetzt jeder verstanden was ich meine.


  • Mod

    Du verstehst es nicht!

    Was hat diese Prüfung hier zu sichen?

    if (pwndFocus == &m_loeschen || pwndFocus ==  &m_aendern)
        return;
    
    m_loeschen.EnableWindow(0);
    m_aendern.EnableWindow(0);
    

    Nichts! Du möchtest wenn etwas ausgewählt ist die Buttons ein und ausschalten.

    Also?
    1. Wenn also eine Änderung passiert bekommst Du LVN_ITEMCHANGED!
    2. Richtig wäre jetzt nachzusehen ob etwas selektiert ist oder nicht!
    3. Wenn etwas selektiert ist Buttons enbaled, ansonten disablen.

    Mein Sample Code zeigt das doch zur genüge!
    Lies doch mal einfach mein Sample!

    Ich gebs auf...



  • Martin Richter schrieb:

    Du verstehst es nicht!

    Stimmt wohl.

    Martin Richter schrieb:

    Was hat diese Prüfung hier zu sichen?

    Die habe ich aus deinem Sample.

    Martin Richter schrieb:

    1. Wenn also eine Änderung passiert bekommst Du LVN_ITEMCHANGED!
    2. Richtig wäre jetzt nachzusehen ob etwas selektiert ist oder nicht!
    3. Wenn etwas selektiert ist Buttons enbaled, ansonten disablen.

    Die Vorgangsschritte kenne ich ja. Ich weiß nur nicht wie ich diese programmieren soll.

    Martin Richter schrieb:

    Mein Sample Code zeigt das doch zur genüge!
    Lies doch mal einfach mein Sample!

    Ich bekomme dein Sample nicht zum laufen also kann ich es nicht debuggen, um zu wissen wonach ich schauen soll. Kann zwar die cpp-Dateien öffnen, aber ehrlich gesagt blick ich da nicht durch. Programmiere erst seit knapp zwei Wochen Visual C++.


Anmelden zum Antworten