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
    

Anmelden zum Antworten