/*++ Copyright (c) 1993-1997 Microsoft Corporation Module Name: fontdlg.c Abstract: Font Editor interface to the common dialog Open File and Save File functions. Also, this routine displays and controls the font format save dialog. --*/ #include "windows.h" #include #include "fontedit.h" #include "commdlg.h" /* message box strings loaded in sample.c from the stringtable */ extern CHAR szIFN[], szFNF[], szREF[], szSCC[], szEOF[], szECF[]; extern CHAR szAppName []; extern CHAR szExt []; extern CHAR szExtDesc []; extern CHAR szNEWFONT []; extern CHAR szFRO []; extern INT iFontFormat; /* Set to the id of current font format */ extern BOOL fReadOnly; CHAR szDlgMsg [MAX_STR_LEN+MAX_FNAME_LEN]; extern CHAR szFilter[]; // // Local Function Prototypes. // BOOL DlgCheckFormat ( HANDLE hInstance, // app module instance handle HWND hWndParent // window handle of parent window ); BOOL APIENTRY DlgFnCheckFormat ( HWND hDlg, WORD message, WPARAM wParam, LPARAM lParam ); // // Functions. // BOOL CommDlgOpen ( HWND hWndParent, /* window handle of parent window */ OFSTRUCT *pofsReOpenInfo,/* ptr to current file OFSTRUCT (->cBytes=0 if no * cur. file)*/ CHAR *pszNewNameIn, /* ptr to array which will get new file's name * (no path) */ CHAR *pszExtIn, /* ptr to current default extension */ CHAR *pszFileNameOnly, /* ptr to application name */ BOOL fOpenType ) { OPENFILENAME ofTempOF; HFILE hFile; CHAR szBuf[_MAX_PATH]; ofTempOF.lStructSize = sizeof(OPENFILENAME); ofTempOF.hwndOwner = hWndParent; ofTempOF.lpstrFilter = szFilter; ofTempOF.lpstrCustomFilter = (LPSTR)NULL; ofTempOF.nMaxCustFilter = 0L; ofTempOF.nFilterIndex = 0L; ofTempOF.lpstrFile = pszNewNameIn; ofTempOF.nMaxFile = MAX_FNAME_LEN; ofTempOF.lpstrFileTitle = pszFileNameOnly; ofTempOF.nMaxFileTitle = MAX_FNAME_LEN; ofTempOF.lpstrInitialDir = (LPSTR)NULL; ofTempOF.lpstrTitle = (LPSTR)NULL; ofTempOF.Flags = OFN_SHOWHELP; ofTempOF.nFileOffset = 0; ofTempOF.nFileExtension = 0; ofTempOF.lpstrDefExt = pszExtIn; if (fOpenType == FONT_NEW) { if (MessageBox (hWndParent, (LPSTR)szNEWFONT, (LPSTR)szAppName, MB_OKCANCEL | MB_ICONEXCLAMATION | MB_APPLMODAL) == IDCANCEL) { return (FALSE); } } lstrcpy(szBuf,pszNewNameIn); if (GetOpenFileName (&ofTempOF) == FALSE) { lstrcpy(pszNewNameIn,szBuf); return (FALSE); } CharUpper (pszNewNameIn); fReadOnly = FALSE; hFile = (HFILE)OpenFile (pszNewNameIn, pofsReOpenInfo, OF_READWRITE); if (hFile == (HFILE) -1) { hFile = (HFILE)OpenFile (pszNewNameIn, pofsReOpenInfo, OF_READ); if (hFile == (HFILE) -1) { DlgMergeStrings (szFNF, pszNewNameIn, szDlgMsg); MessageBox (hWndParent, szDlgMsg, szAppName, MB_OK | MB_ICONASTERISK | MB_APPLMODAL); return (FALSE); } else if (fOpenType != FONT_NEW) { BOOL fResult; DlgMergeStrings (szFRO, pszNewNameIn, szDlgMsg); /* File Is Read Only */ fResult = MessageBox (hWndParent, szDlgMsg, szAppName, MB_OKCANCEL | MB_ICONEXCLAMATION | MB_APPLMODAL); /* Give them the chance to cancel right now. */ if (fResult == IDCANCEL) { _lclose((HFILE)hFile); return (FALSE); } fReadOnly = TRUE; } } _lclose((HFILE)hFile); return (TRUE); } BOOL CommDlgSaveAs( HANDLE hInstance, HWND hWndParent, /* window handle of parent window */ OFSTRUCT *pofsReOpenInfo,/* ptr to current file OFSTRUCT (->cBytes=0 if no * cur. file)*/ CHAR *pszNewNameIn, /* ptr to array which will get new file's name * (no path) */ CHAR *pszExtIn, /* ptr to current default extension */ CHAR *pszFileNameOnly /* ptr to file name */ ) { OPENFILENAME ofTempOF; HFILE hFile; CHAR szBuf[_MAX_PATH]; ofTempOF.lStructSize = sizeof(OPENFILENAME); ofTempOF.hwndOwner = hWndParent; ofTempOF.lpstrFilter = szFilter; ofTempOF.lpstrCustomFilter = (LPSTR)NULL; ofTempOF.nMaxCustFilter = 0L; ofTempOF.nFilterIndex = 0L; ofTempOF.lpstrFile = pszNewNameIn; ofTempOF.nMaxFile = MAX_FNAME_LEN; ofTempOF.lpstrFileTitle = pszFileNameOnly; ofTempOF.nMaxFileTitle = MAX_FNAME_LEN; ofTempOF.lpstrInitialDir = (LPSTR)NULL; ofTempOF.lpstrTitle = (LPSTR)NULL; ofTempOF.Flags = OFN_SHOWHELP; ofTempOF.nFileOffset = 0; ofTempOF.nFileExtension = 0; ofTempOF.lpstrDefExt = pszExtIn; if (DlgCheckFormat (hInstance, hWndParent) == FALSE) { return (FALSE); } // save lpstrFile. Because if GetSaveFileName returns 0(i.e. select // [Cancel] in dialog, pointer to lpstrFile will be lost. lstrcpy(szBuf,pszNewNameIn); if (GetSaveFileName (&ofTempOF) == FALSE) { lstrcpy(pszNewNameIn,szBuf); return (FALSE); } CharUpper (pszNewNameIn); hFile = (HFILE)OpenFile (pszNewNameIn, pofsReOpenInfo, OF_EXIST); if (hFile >= (HFILE) 0) /* already exists */ { _lclose((HFILE)hFile); DlgMergeStrings (szREF, pszNewNameIn, szDlgMsg); if (MessageBox (hWndParent, (LPSTR)szDlgMsg, (LPSTR)pszNewNameIn, MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION | MB_APPLMODAL) == IDNO) { return (FALSE); } hFile = (HFILE)OpenFile (pszNewNameIn, pofsReOpenInfo, OF_WRITE); if (hFile == (HFILE) -1) { DlgMergeStrings(szEOF, pszNewNameIn, szDlgMsg); MessageBox(hWndParent, (LPSTR)szDlgMsg, (LPSTR)pszNewNameIn, MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL); return (FALSE); } _lclose((HFILE)hFile); return (TRUE); } hFile = (HFILE)OpenFile (pszNewNameIn, pofsReOpenInfo, OF_CREATE); if (hFile == (HFILE) -1) { DlgMergeStrings(szECF, pszNewNameIn, szDlgMsg); MessageBox(hWndParent, (LPSTR)szDlgMsg, (LPSTR)pszNewNameIn, MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL); return (FALSE); } _lclose((HFILE)hFile); return (TRUE); } /* end dlgsaveas */ /*============================================================================= DLGMERGESTRINGS scans string1 for merge spec (%%). If found, insert string2 at that point, and then append remainder of string1. Result in string3. ==============================================================================*/ BOOL DlgMergeStrings( CHAR *szSrc, CHAR *szMerge, CHAR *szDst ) { CHAR *pchSrc; CHAR *pchDst; pchSrc = szSrc; pchDst = szDst; /* Find merge spec if there is one. */ while (!((*pchSrc == '%') && (*(pchSrc+1) == '%'))) { *pchDst++ = *pchSrc; /* If we reach end of string before merge spec, just return. */ if (!*pchSrc++) return FALSE; } /* If merge spec found, insert sz2 there. (check for null merge string */ if (szMerge) { while (*szMerge) *pchDst++ = *szMerge++; } /* Jump over merge spec */ pchSrc++; pchSrc++; /* Now append rest of Src String */ while (*pchDst++ = *pchSrc++); return TRUE; } /* end dlgmergestrings */ BOOL DlgCheckFormat ( HANDLE hInstance, // app module instance handle HWND hWndParent // window handle of parent window ) { //FARPROC lpProc; BOOL fResult; fResult = DialogBox (hInstance, (LPSTR)MAKEINTRESOURCE (IDD_FORMAT), //hWndParent, (WNDPROC)(lpProc = DlgFnCheckFormat)); hWndParent, (WNDPROC)DlgFnCheckFormat); //FreeProcInstance(lpProc); return (fResult); } /* end dlgcheckformat */ BOOL APIENTRY DlgFnCheckFormat ( HWND hDlg, WORD message, WPARAM wParam, LPARAM lParam ) { switch (message) { case WM_INITDIALOG: CheckRadioButton (hDlg, ID_FORMAT2, ID_FORMAT3, iFontFormat); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog (hDlg, TRUE); break; case IDCANCEL: EndDialog (hDlg, FALSE); break; case ID_FORMAT2: case ID_FORMAT3: CheckRadioButton(hDlg, ID_FORMAT2,ID_FORMAT3, iFontFormat = LOWORD(wParam)); break; default: return FALSE; } /* end switch wparam */ break; default: return FALSE; } /* end switch message */ return TRUE; } /* end dlgsaveasdlg */