OFNHookProc



  • Hallo,

    wenn ich mit GetSaveFileName erzeuge, wird links eine Toolbar angezeigt mit 4 Schaltern für Verlauf, Desktop, Arbeitsplatz und Netzwerkumg.... Übergebe ich nun ofn.Flags zusäzlich OFN_ENABLEHOOK und ofn.lpfnHook = OFNHookProc so wird diese Toolbar nicht mehr angezeigt.
    Hat jemand eine Erklärung dafür und weis Abhilfe?

    Danke im voraus.
    Gruß ube



  • OFN_EXPLORER vergessen? Zitat MSDN:

    This flag is necessary only if you provide a hook procedure or custom template, or set the OFN_ALLOWMULTISELECT flag.



  • Nein natürlich nicht, daß habe ich auch schon alles gelesen.
    Hier mein Code:

    OPENFILENAME ofn    = {0};
    ofn.lStructSize     = sizeof(OPENFILENAME);
    ofn.hwndOwner       = hWnd;
    ofn.lpstrFilter     = "Textdateien (*.txt)\0*.txt\0\0";
    ofn.lpstrFile       = cFileName;
    ofn.nMaxFile        = MAX_PATH;
    ofn.lpstrDefExt     = ".txt";
    ofn.nFilterIndex    = 1;
    ofn.Flags           = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ENABLEHOOK;
    ofn.lpfnHook        = OFNHookProc;
    GetSaveFileName(&ofn);
    


  • Außerdem!
    Wenn ich OFN_EXPLORER weglasse wird der Dialog mit Old Syle, also wie Win 3.11 angezeigt.



  • Du mußt auf alle Fälle die neue OPENFILENAME-Struktur benutzen (ab Windows 2000 sind zusätzliche Member vorhanden). Das machst Du, indem Du ganz am Anfang _WIN32_WINNT definierst. Jetzt müsssen die zusätztlichen Member aber auch initilisiert werden. Pferdefuß: Der Dialog wird unter den älteren Windows-Versionen (95/98/NT4) nicht mehr angezeigt. In diesem Falle liefert CommDlgExtendedError() den Wert CDERR_STRUCTSIZE zurück. Wenn Du diesen Fehler bekommst, setzt Du die Struct-Size einfach auf den alten Wert zurück und versuchst es einfach nochmal.

    Also in etwa so:

    #define _WIN32_WINNT 0x0500
    #include <windows.h>
    
    BOOL Open(HWND hWnd)
    {
      OPENFILENAME ofn;
      TCHAR        szFile[MAX_PATH * 2];
      BOOL         bRet;
    
        ZeroMemory(&ofn, sizeof(OPENFILENAME));
    
        szFile[0]             = TEXT('\0');
    
        ofn.lStructSize       = sizeof(OPENFILENAME);
        ofn.hwndOwner         = hWnd;         
        ofn.hInstance         = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);     
        ofn.lpstrFilter       = NULL;     
        ofn.lpstrCustomFilter = NULL;     
        ofn.nMaxCustFilter    = 0;
        ofn.nFilterIndex      = 0;
        ofn.lpstrFile         = szFile;     
        ofn.nMaxFile          = sizeof(szFile) / sizeof(szFile[0]);
        ofn.lpstrFileTitle    = NULL;          
        ofn.nMaxFileTitle     = 0;     
        ofn.lpstrInitialDir   = NULL;     
        ofn.lpstrTitle        = TEXT("Open a File");
        ofn.nFileOffset       = 0;            
        ofn.nFileExtension    = 0;
        ofn.lpstrDefExt       = NULL; 
        ofn.lCustData         = 0;           
        ofn.lpfnHook          = MyHookProc;
        ofn.lpTemplateName    = NULL; 
        ofn.Flags             = OFN_EXPLORER | OFN_ENABLEHOOK | OFN_NOTESTFILECREATE | OFN_ENABLESIZING;
        ofn.pvReserved        = NULL;
        ofn.dwReserved        = 0;
        ofn.FlagsEx           = 0;
    
        if(FALSE == (bRet = GetOpenFileName(&ofn)))
        {
            if(CommDlgExtendedError() != CDERR_STRUCTSIZE)
                return(bRet);
    
            ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
            bRet = GetOpenFileName(&ofn);
        }
    
        return(bRet);
    }
    

    [ Dieser Beitrag wurde am 08.12.2002 um 20:05 Uhr von -King- editiert. ]



  • Hallo -King-

    es war: #define _WIN32_WINNT 0x0500
    Die Zeile eingefügt und schon funzt's.

    Vielen Dank -King-

    Gruß ube



  • Die Zeile eingefügt und schon funzt's.

    Ja, sicher. Aber nicht mehr unter 95/98/ME/NT4. Da wird Dir kein Dialog mehr angezeigt, wenn Du den Rest nicht auch noch beachtest.



  • Hi,

    ich hatte auch schon mehrmals dieses problem mit den "#define"-Zeilen. Gib's da irgendwo eine Dukumentation oder sowas.
    Ich habe keine Lust immer in den header-Datein zu suchen, bis ich dort das Richtige finde.
    Meist bleibt dann doch nur der Weg ins Forum.
    Danke

    mfg



  • Ich habe keine Lust immer in den header-Datein zu suchen, bis ich dort das Richtige finde.
    Meist bleibt dann doch nur der Weg ins Forum.

    Das ist ja wohl der Gipfel der Frechheiten. Das dauert keine 20 Sekunden dann hast Du nachgesehen. Aber sicher, ist ja einfacher, wenn sich die anderen die Arbeit machen. Dafür wartet man doch gerne ein bis zwei Stunden (oder was weiß ich wie lange) auf eine Antwort.



  • 😃

    uiuiui, king mit rotem kopf, da krieg ich schon angst 😉

    PS: Doku gibt's auf http://msdn.microsoft.com



  • PS: Doku gibt's auf http://msdn.microsoft.com

    Da fehlt dann nur noch jemand zum Vorlesen, ansonsten ist das sicherlich zu anstrengend.



  • Das hat mirkos bestimmt nicht so gemeint. Er wußte vielleicht einfach nur nicht das es eine Dokumentation gibt, wo alles wichtige drinsteht. 😃


Anmelden zum Antworten