Problem mit Dialog der andere Klasse anspricht



  • Mir ist keine bessere Überschrift eingefallen.

    Es geht darum, dass ich in meinem Hauptdialog einen anderen Dialog
    anzeigen lasse.

    Das mache ich so:

    MeineKlasse gothere;
    gothere.DoModal();
    

    Nun kann man in dem sich öffnenden Fenster einen Button drücken,
    der aus der Hauptanwendung eine Funktion aufruft. Und zwar die,
    die kommt wenn man dort direkt den Button IDC_BUTTON2 gedrückt hätte.

    Das mache ich so:

    MessageBox("es wird gerufen..."); // bis hier alles ok
    CHauptKlasseDlg zeige;
    zeige.OnBnClickedButton2();
    

    Die MessageBox kommt auch. Aber dann schließt sich das Programm
    einfach ohne jede weitere Aktion oder Meldung.

    Bin noch sehr in den Anfängen der MFC. Wo liegt mein Fehler?

    Hintergrund warum ich das mache:

    Das Hauptfenster ist sehr groß. Es soll also im Tray über das Menü
    dieses viel kleinere Unterfenster gerufen werden und das bleibt immer
    OnTop. So kann ich meine Anwendung weiter bedienen auch wenn nun mein
    ganzer Bildschirm von einer Vollbildanwendung überlagert wird!



  • Tssssssss.... Ich hab erlich gesagt nich verstanden was du willst...

    Auf einen Dialog den du Modal aufrufst kannst du nicht von außen zugreifen! ...

    Aber versuchs mal anders zu erklären dann kann man dir auch helfen 😉



  • Wie kann ich meine Anwendung ins Tray minimieren und von dort ein
    kleines Fenster aufrufen, das mir entsprechende Funktionen der
    Anwendung aufruft?

    Ich muss den Inhalt von Button2 aufrufen.

    Im Tray liegt die Anwendung schon. Ist also erledigt. Aber wie komme ich
    nun an die enstprechenden Aufrufe der Funktion?! Ich will NICHT im Tray
    immer auf das Icon klicken und dann aus dem Rechtsklick-Menü die Funktion
    rufen! Das würde zwar gehen, ABER meine Startleiste ist während der Arbeit
    IMMER von einer Vollbildanwendung verdeckt! Ich brauche also ZWINGEND ein
    immer vorhandenes KLEINES Fenster das mir schnell und problemlos eine
    Funktion meiner Anwendung aufruft!

    Oki 😕 😃

    Kurz:

    1.Meine Anwendung im Tray versenkt

    2.Klick auf Meine Anwendung im Tray erzeugt nicht Aufruf der Anwendung selbst,
    sondern eines kleinen Minibedienfensters->hier also Unter-Dialog mit einem
    einzigen Button für eine Funktion die aber im Hauptdialog steckt und dort
    gerufen werden soll!!

    3.Ich klick auf den kleinen Button des Unter-Dialog wann immer ich will, um die gewünschte Aktion zu starten (Screenshot erzeugen).

    4.Freue mich dass ich nun nicht mehr das Vollbildprogramm minimieren muss um
    an die Taskleiste zu kommen, um mein Programm aufzurufen um etwas zu machen.



  • Hmm... mit doppelklick auf das Icon oder einzellklick? Doppelklick fängst de einfach die WM die de beim erstellen des Icons mit angegeben hast ab und rufst dann deinen Dialog auf... rufst noch setwindowpos auf und verschiebst ihn an die richtige stelle

    PS: Sry. ich bin müde und garantiere nicht für meine Aussagen.



  • Hmm...ich brauch nur nen Unterdialog aus meiner Anwendung.
    Den Krieg ich ja auch. Aber der Funktionsaufruf ist müll,
    weil die Funktion im Hauptdialog liegt. Alles andere ist kein Problem.

    Knackpunkt:

    CHauptKlasseDlg fuehreaus; //CHauptKlasseDlg ist mein Hauptdialog
    fuehreaus.OnBnClickedButton2(); // ne wird nix. Programm beendet sich!
                                    //ich will aber im Hauptdialog den Aufruf für dessen Button2 haben ich ruf das ausm Unterdialog auf!
    


  • wenn du von einem unterdialog des hauptdialogs ne funktion ansprechen willst geht das nur wenn du im hauptdialog die PreTranslateMessage(MSG* pMsg) funktion setzt und dort nachrichten abfängst die der unterdialog per PostMessage an den hauptdialog sendet dann stürzt auch dein prog nicht einfach so ab.

    von der PreTranslateMessage(MSG* pMsg) funktion im Hauptdialog verweist du dann auf die gewünschte funktion.

    Hauptdialog

    BOOL .....::PreTranslateMessage(MSG* pMsg) 
    {
    
    	switch(pMsg->message)
    	{
    		case IDC_MACHWAS:
                       OnFunktionImHauptdialog()
    		break;
    	}	
    	return CDialog::PreTranslateMessage(pMsg);
    }
    

    unterdialog in irgendeiner funktion

    void ....::OnBottunKlick()
    {
    	CHauptDlg *pHDlg = new CHauptDlg();
    	pHDlg->PostMessage(IDC_MACHWAS,0,0);
    }
    

    hoffe das ich dich richtig verstanden hab, schreibst ein bischen wirr 😉

    ach ja die headerdatei des haupdialogs nicht vergessen im Unterdialog unterhalb der header includanweisung (des Unterdialogs) zu includen

    und die IDC_MACHWAS muste in der resourcen.h noch definieren

    mfg
    LowFly



  • Hö öhm... wenn wir mal davon ausgehen das du das meinst was LowFly schrieb... dafür legt man in der MessageMap nen Eintrag ein... nix PreTranslateMessage 😉 ... aja.. die Message sollte man sich vorher natürlich definieren...



  • Hallo (D)evil. Wenn man sich eine Message definieren will, was muss man da machen?
    In die MessageMap eintragen..und weiter?

    Vermute mal ein

    #define myMessage
    

    und

    BEGIN_MESSAGE_MAP(...)
    ON_COMMAND(myMessage,Funktion)
    

    ??

    Und dann mit

    PostMessage(myMessage,0,0)
    

    aufrufen??



  • Nee... nicht ganz 😉

    Also:

    #define WM_MYMESSAGE WM_USER+101
    

    Damit haben wir eine eigene Nachricht.

    Dann gehen wir in die MessageMap und fügen dort nen ON_MESSAGE Eintry...

    Aja... dafür müssen wir natürlich erstmal ne Function einführen die dann aufgerufen werden soll:

    class CMyClass // ...
    protected:
        LRESULT OnMyMessage(LPARAM lParam, WPARAM wParam); // Kann sein das ich lParam und wParam vertauscht habe... ich arbeite ausm Brain ;)
    // ...
    
    BEGIN_MESSAGE_MAP(/*... */)
        ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
        // ...
    

    Die Nachricht schickst du dann mit PostMessage oda SendMessage ...



  • Na cool. Dann glaub ich hab ich zumindest das schonmal verstanden.

    Ich kann damit dann aber ja noch nicht aus nem andren Dialog,
    der Modal ist, mit

    hauptklasse.PostMessage(WM_MYMESSAGE,0,0);
    

    ne Funktion starten??

    Würde das mit nem nicht modalen Dialog dann gehen?



  • Hmm aus einem Modalen Dialog heraus sollte es gehen... nur anderes herum nicht... Aja... wenn deine hauptklasse, der MainDialog ist... also den du in der InitInstance angegeben hast... dann kannst de nen Pointer auf den mit AfxGetMainWnd holen... dann einfach PostMessage aufrufen...



  • Na super. Da hast du mir echt geholfen 👍 Jetzt versteh ich den
    Sinn dahinter viel besser! Man muss halt nur WM_MYMESSAGE per #define
    nochmal in dem modalen Dialog zusätzlich anlegen.



  • Schön das ich dir helfen konnte 🙂


Log in to reply