2016-06-23 7 views
-1

Ich habe eine Eigenschaftsseite (CPropertySheet abgeleitete Klasse) und ihre Seiten (CPropertyPage abgeleitete Klasse) in CView abgeleiteten Ansichtsklasse. Ich muss Notiz an CView abgeleitete Klasse erhalten, wenn die Eigenschaftsseite sich ändert.Wie kann ich benachrichtigt werden, wenn die Eigenschaftenseite in Ansichtsklasse geändert

In meinem Fall wird die Behandlung der PSN_SETACTIVE Benachrichtigung nicht funktionieren.

enter image description here

Das Problem besteht darin, die Seite zu ändern ich die Daten auf der Seite von einer Ressource aktualisieren müssen. Wenn diese Ressource nicht aktiv ist, muss ich die Ansicht schließen und die Ansicht erneut starten.

Antwort

2

CPropertySheet empfängt keine Informationen über Registerkartenänderungen.

PSN_SETACTIVE und PSN_KILLACTIVE wird stattdessen an CPropertyPage gesendet. Sie müssen diese Nachrichten in jeder PropertyPage behandeln, wenn die Registerkarte aktiviert oder deaktiviert ist.

In MFC Sie können damit umgehen, wie folgt:

class CMyPropertyPage: public CPropertyPage 
{ 
    BOOL OnSetActive(); 
    BOOL OnKillActive(); 
    ... 
}; 

BOOL CMyPropertyPage:OnSetActive() 
{ 
    BOOL res = CPropertyPage::OnSetActive(); 
    TRACE("CMyPropertyPage tab selected\n"); 
    return res; 
} 

BOOL CMyPropertyPage:OnKillActive() 
{ 
    BOOL res = CPropertyPage::OnKillActive(); 
    TRACE("CMyPropertyPage tab unselected\n"); 
    return res; 
} 

Siehe auch:
WinAPI property sheet
CPropertyPage::OnSetActive

Um eine Benachrichtigung zu CMyView zu senden, werden Sie den Griff zu Ihrem Ziel finden müssen und Übergeben Sie die Nachricht.

+0

PSN_SETACTIVE kann auch in CPropertySheet behandelt werden. Deine Lösung ist richtig. Aber in bestimmten Fällen funktioniert es nicht. Zum Beispiel während der Behandlung dieser Methode kann ich nicht ändern (löschen oder hinzufügen von Seiten auf dem Eigenschaftenblatt und ich kann nicht die aktuellen Frames auch.) Seiten oder Fram. –

+0

Sie haben Ihre Frage komplett so geändert, dass meine Antwort blöd aussieht. Du schreibst, dass du nicht 'PSN_SETACTIVE' ** wollen würdest ** nachdem ** ich eine Antwort gegeben habe um' PSN_SETACTIVE' zu verwenden. Sie erwähnen nicht einmal, dass Sie Ihre Frage bearbeitet haben. Sie haben weitere seltsame Anforderungen hinzugefügt, zusammen mit einer Dokumentation, die erklärt, warum 'PSN_SETACTIVE' falsch ist. –

+0

Ihre Lösung ist hilfreich für mich, aber es ist nicht für mein Problem geeignet –

Verwandte Themen