Open-File-Dialog positionieren



  • Hallo,
    ich möchte gerne den mit CFileDialog verbundenen Open-File-Dialog frei positionieren können. Das klappt aber noch nicht.

    Ich habe eine eigene Klasse von CFileDialog abgeleitet und die member function OnInitDialog() überschrieben:

    class CMyFileDialog : public CFileDialog
    {
    private:
    	virtual BOOL OnInitDialog();
    public:
    	CMyFileDialog(BOOL bOpenFileDialog, 
    		LPCTSTR lpszDefExt = NULL, 
    		LPCTSTR lpszFileName = NULL, 
    		DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
    		LPCTSTR lpszFilter = NULL, 
    		CWnd* pParentWnd = NULL );
    };
    

    Die überschriebene Funktion sieht so aus:

    BOOL CMyFileDialog::OnInitDialog()
    {
    	BOOL Res = CFileDialog::OnInitDialog();
    
    	CWnd *pW = GetParent();
    
    	pW->SetWindowPos( NULL, 
    		50, 50,		// Neue Position
    		0,0,
    		SWP_NOSIZE | SWP_SHOWWINDOW
    		);
    
    	return Res;
    }
    

    Wenn ich das im Debugger laufen lasse, erscheint nach SetWindowPos() der Dialog an der gewünschten Position (50,50). Aber wenn das Programm weiterläuft, wird der Dialog "von selber" irgendwie wieder woanders hin verschoben (anscheinend immer dorthin, wo man ihn zuletzt mit der Maus hingezogen hat).

    Ist das eine "Feature" von Windows XP?

    Wie kann ich erreichen, dass der Dialog bleibt, wo er sein soll?

    Vielen Dank,
    -bep-



  • ich würde mal versuchen die funktion CWnd::OnSizing abzufangen, die funktion wird aufgerufen bevor der dialog neu positioniert wird. 😉


  • Mod

    @rT!f@Ct schrieb:

    ich würde mal versuchen die funktion CWnd::OnSizing abzufangen, die funktion wird aufgerufen bevor der dialog neu positioniert wird. 😉

    Nein! Die Nachricht kommt nur bei interaktivem Resize durch deen Anwender.
    Evtl.

    Einfach per PostMessage in OnInitDialog eine eigene Nachricht senden und das Fenster dort positionieren.
    Das Show und Resize erfolgt IMHO erst wenn OnInitDIalog abgehandlet wurde.


Anmelden zum Antworten