Dialogeigenschaften beim öffnen mitgeben



  • Guten Morgen allerseits

    Da das Forum gestern genau zum falschen Zeitpunkt offline war konnte ich die Frage nicht stellen und habe selber rumgeprobt 🙂
    Leider ohne Erfolg. Es geht um folgendes:

    Ich möchte wenn man auf einen Button klickt, dass sich ein rahmenloser Dialog genau über einem meiner Editfelder öffnet. Den Dialog habe ich schon erstellt, die Klasse dazu auch. Der Button und die Funktion dazu existieren auch schon. Folgendes habe ich mir überlegt: Da das Programm wahrscheinlich nicht nur auf meiner Auflösung (1280*1024) verwendet wird muss ich das Ganze dynamischer machen damit sich das Fenster auch wirklich ÜBER dem Editfeld öffnet. Ich lese also zuerst die Bildschirmauflösung aus, soweit keine Sache. Da meine Applikation immer die gleiche Höhe und Breite hat und die drinnen platzierten Elemente ebenfalls, kann ich dafür statische Zahlen nehmen.

    Doch nun mein Problem: Ich kann diesen kleinen Dialog ja nicht einfach mit DoModal öffnen da die Position da nicht weitergegeben werden kann. Gefunden habe ich SetWindowPos() aber er hat bei irgendeinem Parameter Probleme und gibt immer wenn ich auf den Button zum öffnen klicke einen "Debug Assertion" Fehler aus. Code habe ich bisher folgenden:

    void CMeasDocEditorDlg::OnButtonOpenComment() 
    {
        UpdateData(TRUE);
    
        int		monitorWidth;
        int		monitorHeight;
        int		positionX;
        int		positionY;
    
        monitorWidth  = GetSystemMetrics(SM_CXSCREEN);
        monitorHeight = GetSystemMetrics(SM_CYSCREEN);
    
        positionX	  = (monitorWidth - 470) / 2;
        positionY	  = (monitorHeight - 370) / 2;
    
        CMeasDocCommentDlg CMDC;
    
        CMDC.SetWindowPos(&CMeasDocCommentDlg::wndTop, positionX, positionY, 133, 100, SWP_NOSIZE | SWP_NOMOVE);
    
        UpdateData(FALSE);
    }
    

    Wo liegt der Fehler? Ich denke vor allem beim ersten Element von SetWindowPos aber ich verstehe nicht was ich da übergeben muss. Ach und noch etwas: Wie kann ich, wenn jetzt dieser kleine Dialog über meinem Editfeld platziert ist, ALLE Mausklicks die auf dem GROSSEN Dialog (also dem Hauptprogramm) abfangen und ihm sagen er soll das kleine Fenster sofort schliessen? Ist verständlich was ich meine? Man klickt also auf den Button, der kleine Dialog öffnet sich und wenn man dann wieder irgendwo im alten Dialog mit der Maus draufklickt schliesst er sich wieder.

    Danke für die Aufmerksamkeit



  • Hi

    Also ich denke, dass Du sowieso Dein Dialogfeld nicht modal öffnen solltest, da Du bei einem modalen Dialogfeld den Fokus rein auf dem Dialogfeld hast und nicht in den "alten" Dialog klicken kannst...Somit kannst Du dort auch keine Nachrichten oder sonstwas abfangen, wenn Du ein modalesDialogfeld geöffnet hast...

    Ein nichtmodales Dialogfeld musst Du mit "Create" zuerst erzeugen und dann
    kannst Du die Position des Fensters mit SetWindowPos bestimmen...

    Also irgendwie sowas:

    CFenster DeinFenster;
    
            DeinFenster.Create([ID DEINES FENSTERS]);
     	//Position des Fensters
     	DeinFenster.SetWindowPos([Handle deines Fensters], positionX, positionY, grösse x, grösse y, ANZEIGEFLAGS);
     	DeinFenster.ShowWindow(SW_SHOW);
    

    Das Handle bestimmt das Fenster, welches positioniert werden soll.
    Mit ShowWindow(SW_SHOW) kannst Du dann das Fenster anzeigen lassen...

    Grüsse
    Danny



  • Danke für deinen Beitrag Danny! Aber ich habs in der Zeit in der das Forum (mal wieder) offline war hingekriegt. Hab mir das selbe überlegt wie du:

    void CMeasDocEditorDlg::OnButtonOpenComment() 
    {
    	UpdateData(TRUE);
    
    	if(commentDialogOpen == FALSE)
    	{
    		pDMDC = new CMeasDocCommentDlg;
    		pDMDC->Create(IDD_COMMENTLINES);
    		pDMDC->SetWindowPos(0, 464, 452, 200, 100, SWP_SHOWWINDOW);
    
    		commentDialogOpen = TRUE;
    	}
    	else
    	{
    		pDMDC->DestroyWindow();
    		commentDialogOpen = FALSE;
    	}
    
    	UpdateData(FALSE);
    }
    

    Die "commentDialogOpen"-Variable ist global und wird beim initialisieren des Programmes auf FALSE gesetzt. Wenn sie FALSE ist und ich auf den Button drücke dann öffnet sich mein Mini-Dialog und er setzt es auf TRUE. Dann beim nächsten Klicken auf den Button sieht er dass es TRUE ist, also schon geöffnet, und schliesst es wieder mit DestroyWindow. Klappt eigentlich ganz gut.



  • Hi

    Freut mich, wenn's funzt...Viel Spass.. 😃


Anmelden zum Antworten