/*********************************************************************** MODULE : CMNDLG.C FUNCTIONS : COMMENTS : ************************************************************************/ #include "windows.h" #include "mfdcod32.h" /************************************************************************** Function: InitializeStruct(WORD, LPSTR) Purpose: To initialize a structure for the current common dialog. This routine is called just before the common dialogs API is called. Returns: void Comments: History: Date Author Reason -------- --------- ----------------------------------- 10/01/91 gregk Created 11/25/91 denniscr mod for purposes of this app 7/9/93 denniscr modified for win32 and emf **************************************************************************/ void InitializeStruct(wCommDlgType, lpStruct, lpszFilter) WORD wCommDlgType; LPSTR lpStruct; LPSTR lpszFilter; { LPFOCHUNK lpFOChunk; LPFSCHUNK lpFSChunk; switch (wCommDlgType) { case FILEOPENDLG: lpFOChunk = (LPFOCHUNK)lpStruct; *(lpFOChunk->szFile) = 0; *(lpFOChunk->szFileTitle) = 0; lpFOChunk->of.lStructSize = OPENFILENAME_SIZE_VERSION_400; lpFOChunk->of.hwndOwner = (HWND)hWndMain; lpFOChunk->of.hInstance = (HANDLE)NULL; lpFOChunk->of.lpstrFilter = gszFilter; lpFOChunk->of.lpstrCustomFilter = (LPSTR)NULL; lpFOChunk->of.nMaxCustFilter = 0L; lpFOChunk->of.nFilterIndex = 1L; lpFOChunk->of.lpstrFile = lpFOChunk->szFile; lpFOChunk->of.nMaxFile = (DWORD)sizeof(lpFOChunk->szFile); lpFOChunk->of.lpstrFileTitle = lpFOChunk->szFileTitle; lpFOChunk->of.nMaxFileTitle = 256; lpFOChunk->of.lpstrInitialDir = (LPSTR)NULL; lpFOChunk->of.lpstrTitle = (LPSTR)NULL; lpFOChunk->of.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; lpFOChunk->of.nFileOffset = 0; lpFOChunk->of.nFileExtension = 0; lpFOChunk->of.lpstrDefExt = (LPSTR)NULL; lpFOChunk->of.lCustData = 0L; lpFOChunk->of.lpfnHook = (LPOFNHOOKPROC)NULL; lpFOChunk->of.lpTemplateName = (LPSTR)NULL; break; case FILESAVEDLG: lpFSChunk = (LPFSCHUNK)lpStruct; *(lpFSChunk->szFile) = 0; *(lpFSChunk->szFileTitle) = 0; lpFSChunk->of.lStructSize = 0x4C; //OPENFILENAME_SIZE_VERSION_400 lpFSChunk->of.hwndOwner = (HWND)hWndMain; lpFSChunk->of.hInstance = (HANDLE)NULL; lpFSChunk->of.lpstrFilter = lpszFilter; lpFSChunk->of.lpstrCustomFilter = (LPSTR)NULL; lpFSChunk->of.nMaxCustFilter = 0L; lpFSChunk->of.nFilterIndex = 1L; lpFSChunk->of.lpstrFile = lpFSChunk->szFile; lpFSChunk->of.nMaxFile = (DWORD)sizeof(lpFSChunk->szFile); lpFSChunk->of.lpstrFileTitle = lpFSChunk->szFileTitle; lpFSChunk->of.nMaxFileTitle = 256; lpFSChunk->of.lpstrInitialDir = (LPSTR)NULL; lpFSChunk->of.lpstrTitle = (LPSTR)NULL; lpFSChunk->of.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; lpFSChunk->of.nFileOffset = 0; lpFSChunk->of.nFileExtension = 0; lpFSChunk->of.lpstrDefExt = (LPSTR)"EMF"; lpFSChunk->of.lCustData = 0L; lpFSChunk->of.lpfnHook = (LPOFNHOOKPROC)NULL; lpFSChunk->of.lpTemplateName = (LPSTR)NULL; break; default: break; } return; } /*********************************************************************** FUNCTION : SplitPath PARAMETERS : LPSTR lpszFileName LPSTR lpszDrive LPSTR lpszDir LPSTR lpszFname LPSTR lpszExt PURPOSE : split the fully qualified path into its components CALLS : WINDOWS none APP none MESSAGES : none RETURNS : void COMMENTS : HISTORY : 1/16/91 - created - drc ************************************************************************/ void SplitPath( lpszFileName, lpszDrive, lpszDir, lpszFname, lpszExt) LPSTR lpszFileName; LPSTR lpszDrive; LPSTR lpszDir; LPSTR lpszFname; LPSTR lpszExt; { char szPath[MAXFILTERLEN]; LPSTR lpszPath; LPSTR lpszTemp; int nFileNameLen = nExtOffset - (nFileOffset + 1); int i; /* init ptrs */ lpszPath = szPath; lpszTemp = lpszFileName; /* pick off the path */ for (i = 0; i < nFileOffset; i++, lpszTemp++, lpszPath++) *lpszPath = *lpszTemp; *lpszPath = '\0'; lpszPath = szPath; /* pick off the drive designator */ for (i = 0; i < 2; i++, lpszPath++, lpszDrive++) *lpszDrive = *lpszPath; *lpszDrive = '\0'; /* pick off the directory */ while (*lpszPath != '\0') *lpszDir++ = *lpszPath++; *lpszDir = '\0'; /* reset temp ptr */ lpszTemp = lpszFileName; /* index to filename */ lpszTemp += nFileOffset; /* pick off the filename */ for (i = 0; i < nFileNameLen; i++, lpszTemp++, lpszFname++) *lpszFname = *lpszTemp; *lpszFname = '\0'; /* reset temp ptr */ lpszTemp = lpszFileName; /* index to file extension */ lpszTemp += nExtOffset; /* pick off the ext */ while (*lpszTemp != '\0') *lpszExt++ = *lpszTemp++; *lpszExt = '\0'; } /*********************************************************************** FUNCTION : OpenFileDialog PARAMETERS : LPSTR lpszOpenName PURPOSE : init the OPENFILE structure and call the file open common dialog CALLS : WINDOWS GlobalAlloc GlobalLock GlobalFree wsprintf GetOpenFileName APP InitializeStruct MESSAGES : none RETURNS : int (see returns for GetOpenFileName) COMMENTS : HISTORY : 11/25/91 - created - drc ************************************************************************/ int OpenFileDialog(lpszOpenName) LPSTR lpszOpenName; { int nRet; HANDLE hChunk; LPFOCHUNK lpFOChunk; hChunk = GlobalAlloc(GMEM_FIXED, sizeof(FOCHUNK)); if (hChunk) { lpFOChunk = (LPFOCHUNK)GlobalLock(hChunk); if (!lpFOChunk) { GlobalFree(hChunk); lpFOChunk=NULL; return(0); } } else { lpFOChunk=NULL; return(0); } InitializeStruct(FILEOPENDLG, (LPSTR)lpFOChunk, NULL); nRet = GetOpenFileName( &(lpFOChunk->of) ); if (nRet) { wsprintf(lpszOpenName, (LPSTR)"%s", lpFOChunk->of.lpstrFile); nExtOffset = lpFOChunk->of.nFileExtension; nFileOffset = lpFOChunk->of.nFileOffset; } GlobalUnlock(hChunk); GlobalFree(hChunk); return(nRet); } /*********************************************************************** FUNCTION : SaveFileDialog PARAMETERS : LPSTR lpszOpenName PURPOSE : init the OPENFILE structure and call the file open common dialog CALLS : WINDOWS GlobalAlloc GlobalLock GlobalFree wsprintf GetOpenFileName APP InitializeStruct MESSAGES : none RETURNS : int (see returns for GetSaveFileName) COMMENTS : this could easily be merged with OpenFileDialog. This would decrease the redundancy but this is more illustrative. HISTORY : 11/25/91 - created - drc ************************************************************************/ int SaveFileDialog(lpszSaveName, lpszFilter) LPSTR lpszSaveName; LPSTR lpszFilter; { int nRet; HANDLE hChunk; LPFOCHUNK lpFOChunk; hChunk = GlobalAlloc(GMEM_FIXED, sizeof(FOCHUNK)); if (hChunk) { lpFOChunk = (LPFOCHUNK)GlobalLock(hChunk); if (!lpFOChunk) { GlobalFree(hChunk); lpFOChunk=NULL; return(0); } } else { lpFOChunk=NULL; return(0); } InitializeStruct(FILESAVEDLG, (LPSTR)lpFOChunk, lpszFilter); nRet = GetSaveFileName( &(lpFOChunk->of) ); if (nRet) wsprintf(lpszSaveName, (LPSTR)"%s", lpFOChunk->of.lpstrFile); GlobalUnlock(hChunk); GlobalFree(hChunk); return(nRet); }