CFileDialog nur alter Style?



  • @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;
        }
    };
    


  • Ui, da hat sich aber jemand Mühe gemacht 🙂



  • Schreib doch wenigstens dazu ob du es gebrauchen kannst.



  • dEus:

    Addy steht im Modforum



  • Hi!
    Ich hab da immer eine bin Datei. Die fügt man in einfach die Ressource ein. Die setzt das ganze Programm in den XP Style.

    mfg mike 😃



  • XP-Style != das was ich will ...



  • Hoppla 😉
    Naja. Dann leite die CFileDialog einfach ab, erzeuge einen leeren Dialog, gib ein Static Feld rein und du kannst den CFileDialog beliebig modifiezieren.
    Mit anderen Worten:
    Erstell einen Dialog, leite eine CDialog Klasse ab, ändere die abgeleitete Klasse nach CFileDialog und ersetzte ALLE CDialog nach CFileDialog. Aber nur in der .h !!!!! Erstell einen Staticrahmen und gib ihm die ID str32=0x045f - Titel bleibt leer.
    Ändere den konstruktor
    CMyFileDIALOG(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDREADONLY| OFN_OVERWRITEPROMT,LPCTSTR lpszFilter=NULL,CWnd
    pParentWnd = NULL);

    Weiters:
    CMyDialog::CMyDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags,LPCTSTR lpszFilter,CWnd* pParentWnd = NULL)
    :CfileDialog(bOpenFileDialog, lpszDefExt,lpszFileName,dwFlags,lpszFilter,pParentWnd)
    {
    m_ofn.Flags = OFN_ENABLETEMPLATE;
    ofn.lpTemplateName = MAKEINTERNRESSOURCE(IDD_MYFILEDIALOG);
    ofn.lpstrTitle = "Mein Filedialog";
    m_bDeleteAll = FALSE;
    }

    Zugriff: GetParent()->GetDlgItem(...)->
    Dateiname: GetParentItem(0x480)->GetWindowText(m_strFileName);
    GetParent()->SensMessage(WM_COMMAND,IDCANCEL);

    Aufruf: CMyFileDialog dlg(TRUE,NULL,"*dat");

    mfg mike 😃


Anmelden zum Antworten