Hauptdialogfeld aus Unterdialogfeld aktualisieren....
-
Eine Instanz des Hauptdialoges ist schon im Unterdialog implementiert, sprich ich habe über diese Variable Zugriff auf alle Methoden des Hauptdialoges.
Nur wie schaffe ich es jetzt die Ansicht des Hauptdialoges zu aktualisieren??
UpdateData() funktioniert nicht!?!Vielleicht bin ich auch nur zu blöd.
BOOL CDlgEinbau::PreTranslateMessage(MSG* pMsg) { // ------- Instanz vom Hauptdialog CProtADMADlg m_clProtADMA; // Funktion zur Überprüfung ob Mauszeiger über Steuerelement int nID[3]; nID[0] = IDC_COMBO_POSITION; nID[1] = IDC_BUTTON_TEST; nID[2] = IDC_BUTTON_TEST1; // wurde die Maus bewegt? if (pMsg->message == WM_MOUSEMOVE) { for ( int i = 0; i < 2; i++) { if (pMsg->hwnd == GetDlgItem(nID[i])->m_hWnd) { m_clProtADMA.m_strHint = "Hinweistext!"; //--- Jetzt soll hier irgendwie der Hauptdialog AKTUALISIERT werden --> d.h. "Hinweistext" sollte im Textfeld des Hauptdialoges angezeigt werden TRACE ("Maus über Steuerelement!"); //TEST } } } return CDialog::PreTranslateMessage(pMsg);
Vielleicht wird jetzt mein Problem etwas deutlicher....
Schon Mal Danke.
Gruss
Stefan
-
Schonmal das probiert?
m_clProtADMA.UpdateData(false);Wichtig ist, dass du false nimmst, weil bei true werden die Daten aus dem Formularfeld in die Variablen geschrieben, bei false aus den Variablen in die Dialogfelder.
Schreibst du nichts in UpdateData, wird default-wert true genommen.
-
bei UpdateData(FALSE) bekomme ich ein Assertion Failed.
Deshalb bin ich ja so ratlos.....
Echt keine Ahnung wie ich den Hauptdialog aktualisieren soll.
Trotzdem Danke für den Versuch :p
Gruss
Stefan
-
GetParent() <- MSDN !
-
Hallo! Ich habe momentan ein ähnliches Problem, ich will den Hauptdialog aus einem Worker-thread raus aktualisieren. Ich übergebe einen zeiger auf den Hauptdialog, und auch bei mir crashed das UpdateData.
Kann das mit der anwendung von GetParent vielleicht jemand näher ausführen?
Danke!
-
Was mir gerade auffällt:
m_clProtADMA ist dein Hauptdialog?m_clProtADMA.m_strHint = "Hinweistext!";
Der Punkt sagt mir, dass Du keinen Pointer übergeben hast. Weil sonst wäre es ja ein Pfeil ->
Hab gerade ein Miniprogramm erstellt und es funktioniert wunderbar.
Aber die schnellste und sauberste Lösung ist wirklich GetParent()((KlasseDesHauptdialog*)GetParent())->m_variable = "text"; ((KlasseDesHauptdialog*)GetParent())->UpdateData(false);
-
Hallo,
mit GetParent() klappt es perfekt.Danke für Eure Mithilfe.
Gruss
Stefan
-
//Allgemeines: //es existieren zwei Dialoge: 1. CMainDlg, 2. CSubDlg - beide von CDialog abgeleitet.. //1. Schritt: //in CMainDlg-Klasse (MainDlg.h-File) eine Pointer-Membervariable anlegen von CSubDlg anlegen //include nicht vergessen! private: CSubDlg* m_pSubDlg; //2. Schritt: //in CSubDlg-Klasse (SubDlg.h-File) eine Pointer-Membervariable anlegen vom Typ CWnd private: CWnd* m_pParent; //3. Schritt: //in selbiger Klasse ist vom MFC-Assistenten der Konstruktor wie folgt angelegt: public: CSubDlg(CWnd* pParent = NULL); // Standardkonstruktor //4. Schritt: //ändern in: public: CSubDlg(CWnd* pParent /*= NULL*/); // Standardkonstruktor //5. Schritt: //in SubDlg.cpp den Konstruktor wie folgt ergänzen: IMPLEMENT_DYNAMIC(CSubDlg, CDialog) CSubDlg::CSubDlg(CWnd* pParent /*=NULL*/) : CDialog(CSubDlg::IDD, pParent) , m_pParent(NULL) { m_pParent = pParent; } //6. Schritt: //in der OnInitDialog-Funktion der Haupt-Klasse (CMainDlg) folgendes eingeben: m_pSubDlg = new CSubDlg(this); //7. Schritt: //in der Sub-Klasse (CSubDlg) kann man die Member-Variable m_pParent nutzen um //Nachrichten an die Haupt-Klasse zu senden. Z.B.: CSubDlg::EineFunktion() { //zu übergebende Parameter an CMainDlg WPARAM wParam; LPARAM lParam; //setze hier wParam un lParam if(m_pParent != NULL) m_pParent->PostMessage(WM_HELLO_FROM_SUB, wParam, lParam); //oder SendMessage(...) } //8. Schritt: //damit Schritt 7 funktionieren kann, muss man in CMainDlg einen "Messager" aufbauen //8a. am Ende von "stdafx.h" folgendes eingeben: #define WM_HELLO_FROM_SUB WM_USER + 5 //8b: in der Zuordnungstabelle von CMainDlg folgendes eingeben: BEGIN_MESSAGE_MAP(CMainDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_MESSAGE(WM_HELLO_FROM_SUB, OnHelloFromSub) //AUF DIESEN EINTRAG KOMMT ES AN! END_MESSAGE_MAP() //8c: im Hauptklassen-Rumpf (MainDlg.h) protected: HICON m_hIcon; // Generierte Funktionen für die Meldungstabellen virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg LRESULT OnHelloFromSub(WPARAM wParam, LPARAM lParam); //AUF DIESEN EINTRAG KOMMT ES AN! DECLARE_MESSAGE_MAP() //8d: in MainDlg.cpp folgendes eingeben: LRESULT CMainDlg::OnHelloFromSub(WPARAM wParam, LPARAM lParam) { //mach was mit wParam und lParam return 0; } //wenn Schritt 7 ausgeführt wird, dann wird eine Nachricht an CMainDlg gesendet und OnHelloFromSub //wird "automatisch" aufgerufen. Es können auch Parameter gesendet werden
-
Danke, hat mir viel weitergeholfen!
Mittlerweile versteh ich auch ein bißchen, worauf's ankommt.
Still learning...
-
q150022 schrieb:
[cpp
//3. Schritt:
//in selbiger Klasse ist vom MFC-Assistenten der Konstruktor wie folgt angelegt:
public:
CSubDlg(CWnd* pParent = NULL); // Standardkonstruktor//4. Schritt:
//ändern in:
public:
CSubDlg(CWnd* pParent /= NULL/); // Standardkonstruktor[/cpp]
Bei mir kommt dabei die Fehlermeldung:
error C2226:Syntaxfehler :Typ 'CWnd' nicht erwartet.Warum kommmt diese Meldung ?
EDIT:
habs gefunden ! es klappt wenn:
public: CSubDlg(CWnd* pParent); // Standardkonstruktor