163 lines
3.9 KiB
C
163 lines
3.9 KiB
C
#include <windows.h>
|
|
#include <commdlg.h>
|
|
#include <dlgs.h>
|
|
#include "common.h"
|
|
|
|
#ifndef DBCS
|
|
#define AnsiNext(x) ((x)+1)
|
|
#endif
|
|
|
|
#define MYMAXPATH 255
|
|
|
|
extern HANDLE hInstance;
|
|
extern HWND hWndHelp;
|
|
extern WORD wHelpId;
|
|
|
|
static VOID NEAR PASCAL ReplaceChar(LPSTR lpStr, char cOld, char cNew)
|
|
{
|
|
for( ; *lpStr; lpStr=AnsiNext(lpStr))
|
|
if(*lpStr == cOld)
|
|
*lpStr = cNew;
|
|
}
|
|
|
|
int FAR PASCAL MyOpenDlgProc(HWND hWnd, WORD message, WORD wParam, DWORD lParam)
|
|
{
|
|
switch(message) {
|
|
case WM_ACTIVATE:
|
|
if(wParam)
|
|
hWndHelp = hWnd;
|
|
return(FALSE);
|
|
|
|
case WM_INITDIALOG:
|
|
return(TRUE);
|
|
|
|
case WM_COMMAND:
|
|
switch(wParam) {
|
|
case ID_HELP:
|
|
if(GetParent(LOWORD(lParam)) != hWnd)
|
|
break;
|
|
case psh15:
|
|
MyHelp(hWnd, HELP_CONTEXT, wHelpId);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
HANDLE NEAR PASCAL MyLoadGlobalString(HANDLE wString, WORD *wSize)
|
|
{
|
|
HANDLE hlString, hString;
|
|
|
|
if(!(hlString=MyLoadString(wString, wSize, LMEM_MOVEABLE)))
|
|
goto Error1;
|
|
hString = StringToHandle(LocalLock(hlString));
|
|
LocalUnlock(hlString);
|
|
LocalFree(hlString);
|
|
|
|
Error1:
|
|
return(hString);
|
|
}
|
|
|
|
BOOL NEAR PASCAL DoFileOpenDlg(HWND hWnd, WORD wTitle, WORD wFilter,
|
|
WORD wCustomFilter, HANDLE *hCustomFilter, HANDLE *hFileName, BOOL bOpen)
|
|
{
|
|
HANDLE hOfn, hFilter, hTitle;
|
|
LPOPENFILENAME lpOfn;
|
|
LPSTR lpFileName, lpFilter;
|
|
BOOL result = FALSE;
|
|
#ifdef USECUSTOMFILTER
|
|
HANDLE hpFilter;
|
|
LPSTR lpCustomFilter;
|
|
WORD wSize;
|
|
#endif
|
|
|
|
if(!(hOfn=GlobalAlloc(GMEM_FIXED, sizeof(OPENFILENAME))))
|
|
goto Error1;
|
|
if(!(lpOfn=(LPOPENFILENAME)GlobalLock(hOfn)))
|
|
goto Error2;
|
|
|
|
if(!(hFilter=MyLoadGlobalString(wFilter, NULL)))
|
|
goto Error3;
|
|
lpFilter = GlobalLock(hFilter);
|
|
ReplaceChar(AnsiNext(lpFilter), *lpFilter, '\0');
|
|
|
|
if(!(hTitle=MyLoadGlobalString(wTitle, NULL)))
|
|
goto Error4;
|
|
|
|
if(!(*hFileName=GlobalAlloc(GMEM_MOVEABLE, MYMAXPATH)))
|
|
goto Error5;
|
|
if(!(lpFileName=GlobalLock(*hFileName)))
|
|
goto Error6;
|
|
*lpFileName = '\0';
|
|
|
|
#ifdef USECUSTOMFILTER
|
|
if(*hCustomFilter) {
|
|
lpCustomFilter = GlobalLock(*hCustomFilter);
|
|
} else {
|
|
if(!(*hCustomFilter=MyLoadGlobalString(wCustomFilter, &wSize)))
|
|
goto Error7;
|
|
if(hpFilter=GlobalReAlloc(*hCustomFilter, 2*wSize, GMEM_MOVEABLE))
|
|
*hCustomFilter = hpFilter;
|
|
lpCustomFilter = GlobalLock(*hCustomFilter);
|
|
ReplaceChar(AnsiNext(lpCustomFilter), *lpCustomFilter, '\0');
|
|
}
|
|
#endif
|
|
|
|
lpOfn->lStructSize = sizeof(OPENFILENAME);
|
|
lpOfn->hwndOwner = hWnd;
|
|
lpOfn->hInstance = hInstance;
|
|
lpOfn->lpstrFilter = AnsiNext(lpFilter);
|
|
#ifdef USECUSTOMFILTER
|
|
lpOfn->lpstrCustomFilter = AnsiNext(lpCustomFilter);
|
|
lpOfn->nMaxCustFilter = GlobalSize(*hCustomFilter) - 1;
|
|
#else
|
|
lpOfn->lpstrCustomFilter = NULL;
|
|
lpOfn->nMaxCustFilter = 0;
|
|
#endif
|
|
lpOfn->nFilterIndex = 0;
|
|
lpOfn->lpstrFile = lpFileName;
|
|
lpOfn->nMaxFile = MYMAXPATH;
|
|
lpOfn->lpstrFileTitle = NULL;
|
|
lpOfn->nMaxFileTitle = 0;
|
|
lpOfn->lpstrInitialDir = NULL;
|
|
lpOfn->lpstrTitle = GlobalLock(hTitle);
|
|
lpOfn->Flags = OFN_HIDEREADONLY
|
|
#ifndef NOHELP
|
|
| OFN_SHOWHELP
|
|
#endif
|
|
| OFN_OVERWRITEPROMPT | OFN_ENABLEHOOK;
|
|
lpOfn->lpstrDefExt = NULL;
|
|
lpOfn->lCustData = 0;
|
|
lpOfn->lpfnHook = (UINT (CALLBACK *)(HWND, UINT, WPARAM, LPARAM))MakeProcInstance(MyOpenDlgProc, hInstance);
|
|
lpOfn->lpTemplateName = NULL;
|
|
|
|
result = bOpen ? GetOpenFileName(lpOfn) : GetSaveFileName(lpOfn);
|
|
|
|
if(lpOfn->lpfnHook)
|
|
FreeProcInstance(lpOfn->lpfnHook);
|
|
|
|
GlobalUnlock(hTitle);
|
|
#ifdef USECUSTOMFILTER
|
|
GlobalUnlock(*hCustomFilter);
|
|
Error7:
|
|
#endif
|
|
GlobalUnlock(*hFileName);
|
|
Error6:
|
|
if(!result)
|
|
GlobalFree(*hFileName);
|
|
Error5:
|
|
GlobalFree(hTitle);
|
|
Error4:
|
|
GlobalUnlock(hFilter);
|
|
GlobalFree(hFilter);
|
|
Error3:
|
|
GlobalUnlock(hOfn);
|
|
Error2:
|
|
GlobalFree(hOfn);
|
|
Error1:
|
|
return(result);
|
|
}
|
|
|