MPFILE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:15k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /***************************************************************************
  2.  *    *
  3.  *  MODULE    : MpFile.c    *
  4.  *    *
  5.  *  PURPOSE   : Contains the code for File I/O for Multipad.    *
  6.  *    *
  7.  *  FUNCTIONS : AlreadyOpen   - Determines if a file is already open.    *
  8.  *    *
  9.  * AddFile       - Creates a new MDI window and, if specified,*
  10.  * loads a file into it.    *
  11.  *    *
  12.  * LoadFile      - Loads a file into a MDI window.     *
  13.  *    *
  14.  * MyReadFile    - Calls File/Open dialog and appropriately   *
  15.  * responds to the user's input.              *
  16.  *    *
  17.  * SaveFile      - Saves the contents of a MDI window's edit  *
  18.  * control to a file.    *
  19.  *    *
  20.  * SetSaveFrom   - Formats the "Save 'file' to" string.       *
  21.  *    *
  22.  * SaveAsDlgProc - Dialog function for the File/SaveAs dialog.*
  23.  *    *
  24.  * ChangeFile    - Calls File/SaveAs dialog.    *
  25.  *    *
  26.  ***************************************************************************/
  27. #include "multipad.h"
  28. #include <fcntl.h>
  29. #include <SYStypes.h>
  30. #include <SYSstat.h>
  31. #include <io.h>
  32. #include <string.h>
  33. VOID APIENTRY GetFileName(PSTR);
  34. //INT APIENTRY DialogBoxParam(HANDLE,LPSTR,HWND,FARPROC,LONG);
  35. //LPSTR WINAPI AnsiUpper(LPSTR);
  36. OFSTRUCT of;
  37. /****************************************************************************
  38.  *     *
  39.  *  FUNCTION   : AlreadyOpen(szFile)     *
  40.  *     *
  41.  *  PURPOSE    : Checks to see if the file described by the string pointed  *
  42.  *  to by 'szFile' is already open.                            *
  43.  *     *
  44.  *  RETURNS    : a handle to the described file's window if that file is    *
  45.  *  already open; NULL otherwise.      *
  46.  *     *
  47.  ****************************************************************************/
  48. HWND APIENTRY AlreadyOpen(CHAR *szFile)
  49. {
  50.     BOOL    fFound;
  51.     HWND    hwndCheck;
  52.     CHAR    szChild[MAX_PATH+1];
  53.     LPSTR   lpChild, lpFile, lp;
  54.     /* Open the file with the OF_PARSE flag to obtain the fully qualified
  55.      * pathname in the OFSTRUCT structure.
  56.      */
  57.     if (HFILE_ERROR == OpenFile((LPSTR)szFile, (LPOFSTRUCT)&of, OF_PARSE))
  58.        return NULL;
  59.     lpFile= CharUpper(of.szPathName);
  60.     /* Check each MDI child window in Multipad */
  61.     for (   hwndCheck = GetWindow(hwndMDIClient, GW_CHILD);
  62.     hwndCheck;
  63.     hwndCheck = GetWindow(hwndCheck, GW_HWNDNEXT)   ) {
  64. /* Initialization  for comparison */
  65. lpChild = szChild;
  66. /* Skip icon title windows */
  67. if (GetWindow(hwndCheck, GW_OWNER))
  68.     continue;
  69. /* Get current child window's name */
  70. GetWindowText(hwndCheck, lpChild, MAX_PATH+1);
  71. CharUpper(lpChild);
  72. for (fFound= TRUE, lp= lpFile; (*lpChild) || (*lp); ++lpChild, ++lp)
  73.    if (*lpChild != *lp)
  74.    {
  75.       fFound= FALSE;
  76.       break;
  77.    }
  78. if (fFound) return(hwndCheck);
  79.     }
  80.     /* No match found -- file is not open -- return NULL handle */
  81.     return(NULL);
  82. }
  83. /****************************************************************************
  84.  *     *
  85.  *  FUNCTION   : AddFile (lpName)     *
  86.  *     *
  87.  *  PURPOSE    : Creates a new MDI window. If the lpName parameter is not   *
  88.  *  NULL, it loads a file into the window.      *
  89.  *     *
  90.  *  RETURNS    : HWND  - A handle to the new window.     *
  91.  *     *
  92.  ****************************************************************************/
  93. HWND APIENTRY AddFile(CHAR * pName)
  94. {
  95.     HWND hwnd;
  96.     CHAR     sz[160];
  97.     MDICREATESTRUCT mcs;
  98.     if (!pName) {
  99. /* The pName parameter is NULL -- load the "Untitled" string from */
  100. /* STRINGTABLE and set the title field of the MDI CreateStruct.    */
  101. LoadString (hInst, IDS_UNTITLED, sz, sizeof(sz));
  102. mcs.szTitle = (LPSTR)sz;
  103.     }
  104.     else
  105. /* Title the window with the fully qualified pathname obtained by
  106.  * calling OpenFile() with the OF_PARSE flag (in function
  107.  * AlreadyOpen(), which is called before AddFile().
  108.  */
  109. mcs.szTitle = of.szPathName;
  110.     mcs.szClass = szChild;
  111.     mcs.hOwner = hInst;
  112.     /* Use the default size for the window */
  113.     mcs.x = mcs.cx = CW_USEDEFAULT;
  114.     mcs.y = mcs.cy = CW_USEDEFAULT;
  115.     /* Set the style DWORD of the window to default */
  116.     mcs.style = styleDefault;
  117.     /* tell the MDI Client to create the child */
  118.     hwnd = (HWND)SendMessage (hwndMDIClient,
  119.       WM_MDICREATE,
  120.       0,
  121.       (LONG)(LPMDICREATESTRUCT)&mcs);
  122.     /* Did we get a file? Read it into the window */
  123.     if (pName){
  124. if (!LoadFile(hwnd, pName)){
  125.     /* File couldn't be loaded -- close window */
  126.     SendMessage(hwndMDIClient, WM_MDIDESTROY, (DWORD) hwnd, 0L);
  127. }
  128.     }
  129.     return hwnd;
  130. }
  131. /****************************************************************************
  132.  *     *
  133.  *  FUNCTION   : LoadFile (lpName)     *
  134.  *     *
  135.  *  PURPOSE    : Given the handle to a MDI window and a filename, reads the *
  136.  *  file into the window's edit control child.                 *
  137.  *     *
  138.  *  RETURNS    : TRUE  - If file is sucessfully loaded.      *
  139.  *  FALSE - Otherwise.     *
  140.  *     *
  141.  ****************************************************************************/
  142. INT APIENTRY LoadFile (
  143. HWND hwnd,
  144. CHAR * pName)
  145. {
  146.     LONG   wLength;
  147.     HANDLE hT;
  148.     LPSTR  lpB;
  149.     HWND   hwndEdit;
  150.     HFILE  fh;
  151. OFSTRUCT  of;
  152.     hwndEdit = (HWND)GetWindowLong (hwnd, GWL_HWNDEDIT);
  153.     /* The file has a title, so reset the UNTITLED flag. */
  154.     SetWindowWord(hwnd, GWW_UNTITLED, FALSE);
  155.     fh = OpenFile(pName, &of, OF_READ);  /* JAP was 0, which is OF_READ)*/
  156.     /* Make sure file has been opened correctly */
  157.     if ( fh < 0 )
  158. goto error;
  159.     /* Find the length of the file */
  160.     wLength = (DWORD)_llseek(fh, 0L, 2);
  161.     _llseek(fh, 0L, 0);
  162.     /* Attempt to reallocate the edit control's buffer to the file size */
  163.     hT = (HANDLE)SendMessage (hwndEdit, EM_GETHANDLE, 0, 0L);
  164.     if (LocalReAlloc(hT, wLength+1, LHND) == NULL) {
  165. /* Couldn't reallocate to new size -- error */
  166. _lclose(fh);
  167. goto error;
  168.     }
  169.     /* read the file into the buffer */
  170.     if (wLength != (LONG)_lread(fh, (lpB = (LPSTR)LocalLock (hT)), (UINT)wLength))
  171. MPError (hwnd, MB_OK|MB_ICONHAND, IDS_CANTREAD, (LPSTR)pName);
  172.     /* Zero terminate the edit buffer */
  173.     lpB[wLength] = 0;
  174.     LocalUnlock (hT);
  175.     SendMessage (hwndEdit, EM_SETHANDLE, (UINT)hT, 0L);
  176.     _lclose(fh);
  177.     return TRUE;
  178. error:
  179.     /* Report the error and quit */
  180.     MPError(hwnd, MB_OK | MB_ICONHAND, IDS_CANTOPEN, (LPSTR)pName);
  181.     return FALSE;
  182. }
  183. /****************************************************************************
  184.  *     *
  185.  *  FUNCTION   : MyReadFile(hwnd)     *
  186.  *     *
  187.  *  PURPOSE    : Called in response to a File/Open menu selection. It asks  *
  188.  *  the user for a file name and responds appropriately.     *
  189.  *     *
  190.  ****************************************************************************/
  191. VOID APIENTRY MyReadFile(HWND hwnd)
  192. {
  193.     CHAR    szFile[128];
  194.     HWND    hwndFile;
  195.     GetFileName (szFile);
  196.     /* If the result is not the empty string -- take appropriate action */
  197.     if (*szFile) {
  198.     /* Is file already open?? */
  199.     if (hwndFile = AlreadyOpen(szFile)) {
  200.         /* Yes -- bring the file's window to the top */
  201.         BringWindowToTop(hwndFile);
  202.     }
  203.     else {
  204.         /* No -- make a new window and load file into it */
  205.         AddFile(szFile);
  206.     }
  207.     }
  208. UNREFERENCED_PARAMETER(hwnd);
  209. }
  210. /****************************************************************************
  211.  *     *
  212.  *  FUNCTION   : SaveFile (hwnd)     *
  213.  *     *
  214.  *  PURPOSE    : Saves contents of current edit control to disk.     *
  215.  *     *
  216.  ****************************************************************************/
  217. VOID APIENTRY SaveFile(HWND hwnd)
  218. {
  219.     HANDLE   hT;
  220.     LPSTR    lpT;
  221.     CHAR     szFile[128];
  222.     INT      cch;
  223.     INT      fh;
  224. //    OFSTRUCT of;
  225.     HWND     hwndEdit;
  226.     PSTR     pch;
  227.     hwndEdit = (HWND)GetWindowLong ( hwnd, GWL_HWNDEDIT);
  228.     GetWindowText (hwnd, szFile, sizeof(szFile));
  229.     /* If there is no extension (control is 'Untitled') add .TXT as extension */
  230.     for (cch = FALSE, lpT = szFile; *lpT; lpT = CharNext(lpT))
  231. switch (*lpT){
  232.     case '.':
  233.  cch = TRUE;
  234.  break;
  235.     case '\':
  236.     case ':' :
  237.  cch = FALSE;
  238.  break;
  239. }
  240.     if (!cch)
  241. LoadString (hInst, IDS_ADDEXT, lpT, lpT - (LPSTR)szFile);
  242.     fh = open(szFile, O_BINARY | O_WRONLY | O_CREAT, S_IWRITE);
  243.     /* If file could not be opened, quit */
  244.     if (fh < 0){
  245. MPError (hwnd, MB_OK | MB_ICONHAND, IDS_CANTCREATE, (LPSTR)szFile);
  246. return;
  247.     }
  248.     /* Find out the length of the text in the edit control */
  249.     cch = GetWindowTextLength (hwndEdit);
  250.     /* Obtain a handle to the text buffer */
  251.     hT = (HANDLE)SendMessage (hwndEdit, EM_GETHANDLE, 0, 0L);
  252.     lpT = (LPSTR)LocalLock (hT);
  253.     /* Write out the contents of the buffer to the file. */
  254.     if (cch != write(fh, lpT, cch))
  255. MPError (hwnd, MB_OK | MB_ICONHAND, IDS_CANTWRITE, (LPSTR)szFile);
  256.     /* Clean up */
  257.     LocalUnlock (hT);
  258.     SendMessage (hwndEdit, EM_SETHANDLE, (UINT)hT, 0L);
  259.     close(fh);
  260.     return;
  261. UNREFERENCED_PARAMETER(pch);
  262. }
  263. /****************************************************************************
  264.  *     *
  265.  *  FUNCTION   : SetSaveFrom ()      *
  266.  *     *
  267.  *  PURPOSE    : Formats the "Save 'file' to .." string.                    *
  268.  *     *
  269.  ****************************************************************************/
  270. VOID NEAR PASCAL SetSaveFrom (
  271. HWND hwnd,
  272. PSTR psz)
  273. {
  274.     CHAR szFmt[32];
  275.     CHAR szText[160];
  276.     /* The text string in the .RC file contains the format string... */
  277.     GetDlgItemText( hwnd, IDD_SAVEFROM, szFmt, sizeof(szFmt));
  278.     /* NOTE: this (LPSTR) cast MUST be here... wsprintf() is a cdecl
  279.      * (C calling conventions) function with varying args... there is
  280.      * no way for the compiler to know that all strings must be LPSTR's
  281.      * and do the conversion, so we have to be careful about wsprintf()'s.
  282.      */
  283.     wsprintf ( szText, szFmt, (LPSTR)psz);
  284.     /* set the text in the static control */
  285.     SetDlgItemText (hwnd, IDD_SAVEFROM, szText);
  286. }
  287. /****************************************************************************
  288.  *     *
  289.  *  FUNCTION   : SaveAsDlgProc(hwnd, message, wParam, lParam)     *
  290.  *     *
  291.  *  PURPOSE    : Dialog function File/SaveAs. It waits for a filename, and  *
  292.  *  then calls SaveFile or cancels the operation.     *
  293.  *     *
  294.  ****************************************************************************/
  295. BOOL APIENTRY SaveAsDlgProc(
  296. HWND hwnd,
  297. UINT message,
  298. UINT wParam,
  299. LONG lParam)
  300. {
  301.     CHAR   sz[64];
  302.     CHAR   *pch;
  303.     BOOL   fExt;
  304.     HWND   hwndSave;
  305.     switch (message){
  306. case WM_INITDIALOG:
  307.     /* Identify the window whose contents we're saving */
  308. #ifdef ORGCODE
  309.     hwndSave = LOWORD (lParam);
  310. #else
  311. hwndSave = (HWND)lParam; /*passed in from another procedure*/
  312. #endif
  313.     /* Set it's name in the property list */
  314.     SetProp (hwnd, PROP_FILENAME, hwndSave);
  315.     GetWindowText (hwndSave, sz, sizeof(sz));
  316.     /* Set the save from string... */
  317.     SetSaveFrom (hwnd,sz);
  318.     /* Generate a filename complete with extension */
  319.     CharUpper (sz);
  320.     for (fExt = FALSE, pch = sz; *pch; pch = CharNext(pch))
  321. if (*pch == '.')
  322.     fExt = TRUE;
  323. else if (*pch == '\')
  324.     fExt = FALSE;
  325.     if (!fExt)
  326. LoadString (hInst, IDS_ADDEXT, (LPSTR)pch, pch - sz);
  327.     /* Display the filename in the edit control */
  328.     SetDlgItemText (hwnd, IDD_SAVETO, sz);
  329.     /* Select the entire range of text */
  330.     SendMessage(GetDlgItem(hwnd, IDD_SAVETO), EM_SETSEL, GET_EM_SETSEL_MPS(0, 100));
  331.     DlgDirList (hwnd, "*.*", (INT)IDD_DIRS, (INT)IDD_PATH, (WORD)ATTR_DIRS);
  332.     /* enable OK butto iff edit control is nonempty */
  333.     if (!*sz)
  334. EnableWindow (GetDlgItem (hwnd, IDOK), FALSE);
  335.     break;
  336. case WM_COMMAND:
  337.     switch (LOWORD(wParam)){
  338. case IDCANCEL:
  339.     /* Abort operation */
  340.     EndDialog(hwnd,1);
  341.     break;
  342. case IDOK:
  343.    /*  Just change the title of the MDI child. The calling
  344.     *  function of ChangeFile(), which uses the title text
  345.     *  for the filename, will do the actual save.
  346.     */
  347.     hwndSave = GetProp (hwnd, PROP_FILENAME);
  348.     GetDlgItemText (hwnd, IDD_SAVETO, sz, sizeof(sz));
  349.     CharUpper ((LPSTR)sz);
  350.     SetWindowText (hwndSave, sz);
  351.     EndDialog (hwnd, 0);
  352.     break;
  353. case IDD_SAVETO:
  354.    /* If the edit control changes, check to see if its empty.
  355.     * enable OK if it contains something
  356.     */
  357.     if (HIWORD (lParam) != EN_CHANGE)
  358. return FALSE;
  359.     EnableWindow (GetDlgItem (hwnd, IDOK),
  360. SendDlgItemMessage (hwnd,
  361.    IDD_SAVETO,
  362.    WM_GETTEXTLENGTH,
  363.    0,
  364.    0L));
  365.     break;
  366. case IDD_DIRS:
  367.     if (HIWORD(lParam)==LBN_DBLCLK){
  368. CHAR szT[64];
  369. DlgDirSelectEx(hwnd, szT, 64, IDD_DIRS);
  370. lstrcat ( szT, "*.*");
  371. DlgDirList (hwnd, szT, (INT)IDD_DIRS, (INT)IDD_PATH, (WORD)ATTR_DIRS);
  372. break;
  373.     }
  374.     return FALSE;
  375. default:
  376.     return FALSE;
  377.     }
  378. default:
  379.     return FALSE;
  380.     }
  381.     return TRUE;
  382. }
  383. /****************************************************************************
  384.  *     *
  385.  *  FUNCTION   : ChangeFile (hwnd)     *
  386.  *     *
  387.  *  PURPOSE    : Invokes the File/SaveAs dialog.     *
  388.  *     *
  389.  *  RETURNS    : TRUE  - if user selected OK or NO.     *
  390.  *  FALSE - otherwise.     *
  391.  *     *
  392.  ****************************************************************************/
  393. BOOL APIENTRY ChangeFile (HWND hwnd)
  394. {
  395.     INT     i;
  396. #ifdef NOTCOMMONDIALOGS
  397.     i = DialogBoxParam (hInst, IDD_SAVEAS, hwnd, SaveAsDlgProc, (LONG)hwnd);
  398.     if (!i)
  399.     SetWindowWord (hwnd, GWW_UNTITLED, 0);
  400.     return !i;
  401. #else
  402.     OPENFILENAME ofn;
  403.     CHAR szFilterSpec[128];                       /* file type filters */
  404.     CHAR szBuffer[128];
  405.     #define MAXFILENAME 256
  406.     CHAR szFileName[MAXFILENAME];
  407.     CHAR szFileTitle[MAXFILENAME];
  408. LoadString(hInst, IDS_SAVEFILTERSPEC, szFilterSpec, sizeof (szFilterSpec));
  409. LoadString(hInst, IDS_SAVEFILETITLE, szBuffer, sizeof (szBuffer));
  410.     strcpy(szFileName, "");   /* these need be NULL*/
  411.     strcpy(szFileTitle, "");
  412.     /* fill in non-variant fields of OPENFILENAME struct. */
  413.     ofn.lStructSize       = sizeof(OPENFILENAME);
  414.     ofn.hwndOwner       = hwnd;
  415.     ofn.lpstrFilter       = szFilterSpec;
  416.     ofn.lpstrCustomFilter = NULL;
  417.     ofn.nMaxCustFilter   = 0;
  418.     ofn.nFilterIndex   = 0;
  419.     ofn.lpstrFile         = szFileName;
  420.     ofn.nMaxFile       = MAXFILENAME;
  421.     ofn.lpstrInitialDir   = NULL;
  422.     ofn.lpstrFileTitle    = szFileTitle;
  423.     ofn.nMaxFileTitle     = MAXFILENAME;
  424.     ofn.lpstrTitle        = szBuffer;
  425.     ofn.lpstrDefExt       = "TXT";
  426.     ofn.Flags             = OFN_HIDEREADONLY;
  427.     /* Use standard open dialog */
  428.     i = GetSaveFileName ((LPOPENFILENAME)&ofn);
  429. CharUpper ((LPSTR)ofn.lpstrFile);
  430. SetWindowText (hwnd, ofn.lpstrFile);
  431.     if (i)
  432.     SetWindowWord (hwnd, GWW_UNTITLED, 0);
  433.     return i;
  434. #endif
  435. }