OFNHookProc
-
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.
Dankemfg
-
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.
-
-
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.