2 Dialoge gleichzeitig, die sich gegenseitig steuern.



  • Da würde ich es mit

    pAndererDialog->SendMessage(WM_CLOSE);
    

    versuchen. 🙂
    ...Vorsicht, ich weiß grade nicht, obs so geht!



  • Gut, ich hab das nun in etwa so, wi es sein könnte.
    Allerdings hab ich nun den nächsten Angriff auf meine Geduld erlebt 🙂
    Der zeichnet zwar schön den Dialog, aber die Bestandteile des Dialogs nicht. Ich vermute ich muss dann OnInitDialog selber rufen, richtig?

    Danke, Ranger



  • Das müsste auch so aufgerufen werden.
    Ich fürchte, da wirst du auf Threads umbauen müssen. Vielleicht hilft das: http://www.c-plusplus.net/forum/viewtopic-var-t-is-139932.html



  • Wie sieht denn dein Code aus, mit dem Du die Dialoge aufrufst? Ich hab hier auch zwei Dialoge, die sich gegenseitig steuern, und meine Paint- bzw. Messageverarbeitung läuft tadellos (auch ohne Threadmodell)..

    was Estartu meint, ist, dass Deine OnInitDialog-Methode wohl ausgeführt wird, zum Schluss aber wird die Form nicht gezeichnet. Die Elemente existieren aber. Vermutlich bekommt dein einer Dialog also keine Rechenkapazität ab, um die Messageverarbeitung auszuführen.

    MSG msg; 
    
    while( ::PeekMessage( &msg, NULL, NULL, NULL, PM_NOREMOVE ) ) 
      ::AfxGetThread()->PumpMessage();
    

    das kannst Du mal nach dem Create des Dialogs, der nicht gezeichnet wird, einfügen. Aber es löst nicht das Problem, weil danach wieder alle Messages blockiert sein werden. Daher brauchts hier ein wenig geposteten Code von Dir, um dem Ganzen auf die Schliche zu kommen 😉



  • Hallo DrOetker,

    ich werde Deinem Rat bzw. Anfrage folge leisten 😃

    Hier erst die Aufrufe der Dialoge:

    CNrInputDialog dlg_Input;
    CKIDDialog dlg_NrBlock;
    
    if(!dlg_Input.Create(IDD_DIALOG_NUMBER_INPUT, this))
    {
            AfxMessageBox("Dialog 1 Fehler");
    	OnCancel();
    }
    dlg_Input.ShowWindow(SW_SHOW);
    
    if(!dlg_NrBlockn.Create(IDD_DIALOG_NRBLOCK, this))
    {
    	AfxMessageBox("Dialog 2 Fehler");
    	OnCancel();
    }
    dlg_NrBlock.ShowWindow(SW_SHOW);
    

    Das Problem ist, wenn ich in den OnInitDialog() Funktionen noch die Textgröße der Buttons anpassen möchte bekomme ich eine Unbehandelte Ausnahme wegen einem Zugriffsverweigerung.

    if(ID == IDD_DIALOG_NRBLOCK)
    {
    	calling->GetDlgItem(IDC_BUTTON_NRIN_EINS)->SetFont(&But_L);  
    	calling->GetDlgItem(IDC_BUTTON_NRIN_ZWEI)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_DREI)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_VIER)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_FUENF)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_SECHS)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_SIEBEN)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_ACHT)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_NEUN)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_NULL)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_PUNKT)->SetFont(&But_L);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_CLEAR)->SetFont(&But_S);
    	calling->GetDlgItem(IDC_BUTTON_NRIN_BACK)->SetFont(&But_S);
    }
    

    Die Fonts sind alle gesetzt und in einem Modalen Dialog funzt das auch, was mach ich falsch??

    Danke, Ranger



  • Wird das vielleicht zu früh aufgerufen?
    Also: Existieren die Fenster schon? Schau mal mit dem Debugger rein.



  • Also im Modalen Dialog funzt es genai an dieser Stelle in der OnInitDialog(). Ich hab keine Ahnung, wo er dann die einzelnen Fenster des Dialogs erstellt, die sollten doch aber gleich bei Create vorhanden sein??

    Ich schau gleich mal im Debugger, mal sehen, was ich noch rausfinden kann

    Ranger



  • dlg_Input = new CNrInputDialog;
       dlg_Input->Create(IDD_DIALOG_NUMBER_INPUT, NULL);
       dlg_Input->ShowWindow(SW_SHOW);
    

    ?



  • Auchg dieser Vorschlag hat keinen Erfolg.

    dlg_Input = new CNrInputDialog;
    if(!dlg_Input->Create(IDD_DIALOG_NUMBER_INPUT, NULL))
    {
    	AfxMessageBox("Dialog 1 Fehler");
    	OnCancel();
    }
    
    dlg_Input->ShowWindow(SW_SHOW);
    dlg_Input->OnInitDialog();
    

    Also er läuft rein in die OnInitDialog() aber kann zb die Fonts der einzelnen Buttons nicht umsetzten. Lasse ich das weg, zeigt er diesen Dialog an, mit den kleinen Beschriftungen. Der zweite Dialog wird gar nicht gefüllt, auch, wenn ich diese Fontumstellung wegnehme, dann kommen keine Fehler mehr, aber ich kann in den Dialogen auch nichts klicken, die Sanduhr wird angezeigt.

    Kann ich das mit Threads, in denen modale Dialoge laufen, beheben?

    Ranger



  • In Threads wird halt nichts blockiert werden da die Rechenleistung verteilt würde. Ich finde das aber trotzdem merkwürdig, da eben so ein Konstrukt problemlos bei mir läuft. Bist Du sicher, dass nirgends etwas in eine Endlosschleife laufen könnte?
    Außerdem musst und solltest Du die OnInitDialog nicht explizit aufrufen. Das sollte automatisch in Create erledigt werden.



  • Hallo Doc!

    Ich hab es jetzt mal mit Threads versucht. Ich werde das nochmals prüfen, wenn ich die Zeit dazu hab, irgendwas muss da schif laufen.

    Die Fehler entstehen in der Wingdi.cpp, direkt beim setzten der Schriftart.


Anmelden zum Antworten