CFileDialog nur alter Style?



  • Hi Leute,
    Ich hab ein kleines Problem mit der Klasse CFileDialog. Ich bekomm unter XP immer den alten Dialog, den es auch schon unter Win9x gegeben hat, ich will aber den neuen, den es seit Win2K gibt, der mit der Auswahlleiste auf der linken Seite. Ich glaub ich hatte dafür schon mal eine Lösung, ich find sie aber leider nciht mehr 😞
    Würde mich freuen, wenn mir da jemand weiterhelfen könnte ...
    Danke



  • Habe sowas mal bei Codeguru gesehen. Mit Vorschau.



  • hö?
    Ich will keine eigene Klasse, sondern es mit CFileDialog lösen ...



  • Hast du das neue SDK
    Das Problem hatte ich mal mit der Transparentfunktion. Bei den standardlibs ist das nicht dabei. ert seid sdk 07/2000 oder so.

    [ Dieser Beitrag wurde am 24.02.2003 um 21:46 Uhr von Unix-Tom editiert. ]



  • Jo ... Naja, so neu ist es nicht, aber ich denke, es ist neu genug. Ist glaub November 2001 oder so ...



  • Was hat das mit der SDK Version zu tun? nüx. Kann man da nicht irgendwelche Flags setzen? OFN_EXPLORER oder so. 🙄



  • Gibt es dazu nicht eine msdn in der sdk. vielleicht verwendest du die standardlib und nicht die neue.

    Edit:
    Habe mich mit dem Filedialog noch nicht befasst da ich den so noch nie gebraucht habe. Aber die MSDN ist immer hilfreich. Ich traue aber dEus zu das er das schon gecheckt hat.

    Habe mal das in der msdn von VSNET gefunden
    To use a CFileDialog object, first create the object using the CFileDialog constructor. After the dialog box has been constructed, you can set or modify any values in the m_ofn structure to initialize the values or states of the dialog box's controls. The m_ofn structure is of type OPENFILENAME. For more information, see the OPENFILENAME structure in the Platform SDK.

    [ Dieser Beitrag wurde am 24.02.2003 um 21:56 Uhr von Unix-Tom editiert. ]



  • @Unwissender:
    Tja, das ist ja das, was mich irritiert. Dieses Flag ist gesetzt!

    @Unix-Tom:
    Laut MSDN ist es dieses Flag (falls ich das richtig versteh ...) , was ja aber nichts hilft ... bzw es hilft, dass ich nicht den ganz alten Style hab (Win3.1 oder so)



  • Unix-Tom:
    Jo, das weiss ich ja alles ... Es hilft aber nix, ich krieg immer den alten Style 😞



  • schicke mir mal dein Projekt. Ich vesuche es mit VC NET ob es den neuen Style hat.



  • Wenn ich das richtig sehe, setzt CFileDialog ebenfalls OFN_ENABLEHOOK. Und genau das ist das Problem. Wenn dieses Flag gesetzt ist, mußt Du die neue Struktur (OPENFILENAME) benutzen. Diese wurde ab Windows 2000 um zusätzliche Member erweitert. Und das, obwohl Du die FlagsEx sowieso nullst.

    Allerdings kannst Du die neue Struktur nicht vorbehaltslos verwenden. Unter Windows-Versionen < 2000 schlägt der schlußendliche Aufruf von GetOpenFileName/GetSaveFileName fehl. CommDlgExtendedError liefert in diesem Falle CDERR_STRUCTSIZE. Und dann darfst Du das Member lStructSize auf OPENFILENAME_SIZE_VERSION_400 zurücksetzen.



  • Unix-Tom:
    Addy?

    King:
    Öööhm 😮 Woher weisst du das?



  • Öööhm 😮 Woher weisst du das?

    Als API-Jünger weiß man das. 😉



  • *g*
    Naja, wie benutze ich aber die neue Struktur?



  • Die Info findest Du hier:
    [URL]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/CommonDialogBoxLibrary/CommonDialogBoxReference/CommonDialogBoxStru ctures/OPENFILENAME.asp[/URL]
    Dies sollte also helfen:

    // Damit kannst Du Dir noch ganz andere Seiteneffekte einfangen!
    #define _WIN32_WINT 0x0500
    

    Vermutlich mußt Du dann 'nur' noch die MFC neu übersetzen. Oder Du bastelst Dir gleich was eigenes.



  • diesen define hab ich selbst auch schon vor dem include gesetzt ... hat aber nix gebracht. Wenn ich da wirklich die MFC neu bauen muss ... dann bau ich mir echt lieber was eigenes ...



  • ]diesen define hab ich selbst auch schon vor dem include gesetzt ... hat aber nix gebracht.

    Solange der Code, der die Struktur tatsächlich verwendet, ohne dieses define compilert wurde, kann das auch nichts bringen.



  • jo, stimmt ...



  • Falls es nicht schon gesagt wurde:

    Das kommt daher das CFileDialog das Flag OFN_ENABLEHOOK nutzt.

    Also mit CFileDialog wird es denke ich mal nicht gehen.

    Ich würde einfach GetOpenFileName nehmen. Das Problem ist halt das man den Dialog dann schlecht zentrieren kann.



  • Das wäre noch möglich:
    Zwar nicht perfekt, aber...

    namespace FileDlg
    {
        HHOOK hook;
    
        LRESULT CALLBACK CallWndRetProc(int nCode,WPARAM wParam,LPARAM lParam)
        {
            if(nCode >= 0)
            {
                CWPRETSTRUCT* ret = reinterpret_cast<CWPRETSTRUCT*> (lParam);
                if(ret->message == WM_CREATE)
                {
                    CWnd::FromHandle(ret->hwnd)->CenterWindow();
                    UnhookWindowsHookEx(hook);
                    return 0;
                }
            }
            return CallNextHookEx(hook,nCode,wParam,lParam);
        }
        CString Open(bool openFileDlg,LPCTSTR filename = 0,LPCTSTR filter = 0,LPCTSTR defExt = 0,DWORD flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,CWnd* parent = 0)
        {
            if(parent == 0) parent = CWnd::GetFocus();
            hook = SetWindowsHookEx(WH_CALLWNDPROCRET,CallWndRetProc,0,GetWindowThreadProcessId(parent->GetSafeHwnd(),0));
    
            CString fn(filename);
    
            OPENFILENAME ofn;
            ZeroMemory(&ofn,sizeof ofn);
            ofn.lStructSize = sizeof ofn;
            ofn.Flags = flags;
            ofn.hwndOwner = parent->GetSafeHwnd();
            ofn.hInstance = AfxGetInstanceHandle();
            ofn.lpstrFile = fn.GetBuffer(FILENAME_MAX);
            ofn.nMaxFile = FILENAME_MAX;
            ofn.lpstrFilter = filter;
    
            (openFileDlg) ? GetOpenFileName(&ofn) : GetSaveFileName(&ofn);
            fn.ReleaseBuffer();
            return fn;
        }
    };
    

Anmelden zum Antworten