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

Windows编程

开发平台:

Visual C++

  1. /***************************************************************************
  2.  *    *
  3.  *  MODULE : MpOpen.c    *
  4.  *    *
  5.  *  PURPOSE : Contains the file open dialog function and it's helper   *
  6.  *   functions.    *
  7.  *    *
  8.  *  FUNCTIONS : IsWild ()       - Ascertains that the input string   *
  9.  * contains a DOS wildcard character. *
  10.  *    *
  11.  *   SelectFile()       - If filename supplied contains a    *
  12.  * wildcard, this function fills the  *
  13.  * listboxes in File/Open dialog, else*
  14.  * the dialog is closed.    *
  15.  *    *
  16.  *   FileOpenDlgProc()   - Dialog funcion for the File/Open   *
  17.  * dialog.     *
  18.  *    *
  19.  *   GetFileName ()      - Gets a file name from the user.    *
  20.  *    *
  21.  ***************************************************************************/
  22. #include "multipad.h"
  23. #include <fcntl.h>
  24. #include <io.h>
  25. #include <string.h>
  26. CHAR szPropertyName [] = "FILENAME";/* Name of the File name property list item */
  27. /****************************************************************************
  28.  *     *
  29.  *  FUNCTION   : IsWild ( psz )      *
  30.  *     *
  31.  *  PURPOSE    : Checks if the string (referenced by a NEAR pointer)     *
  32.  *  contains a DOS wildcard character ("*" or "?").            *
  33.  *     *
  34.  *  RETURNS    : TRUE  - iff the string contains a wildcard character.     *
  35.  *  FALSE - otherwise.      .     *
  36.  *     *
  37.  ****************************************************************************/
  38. BOOL NEAR PASCAL IsWild(register PSTR psz)
  39. {
  40.     for(;;)
  41. switch (*psz){
  42.     case '*':
  43.     case '?':
  44. /* Found wildcard */
  45. return TRUE;
  46.     case 0:
  47. /* Reached end of string */
  48. return FALSE;
  49.     default:
  50. break;
  51. }
  52.         psz = CharNext(psz);
  53. }
  54. /****************************************************************************
  55.  *     *
  56.  *  FUNCTION   : FileExists(pch)     *
  57.  *     *
  58.  *  PURPOSE    : Checks to see if a file exists with the path/filename     *
  59.  *  described by the string pointed to by 'pch'.               *
  60.  *     *
  61.  *  RETURNS    : TRUE  - if the described file does exist.     *
  62.  *  FALSE - otherwise.     *
  63.  *     *
  64.  ****************************************************************************/
  65. BOOL FileExists(PSTR pch)
  66. {
  67. int fh;
  68. if ((fh = open(pch, O_RDONLY)) < 0)
  69.      return(FALSE);
  70. _lclose(fh);
  71. return(TRUE);
  72. }
  73. /****************************************************************************
  74.  *     *
  75.  *  FUNCTION   : SelectFile ( hwnd )     *
  76.  *     *
  77.  *  PURPOSE    : Reads the string in the edit control of the File/Open     *
  78.  *  dialog. If it contains a wildcard, then it attempts to     *
  79.  *  fill the listboxes in the File/Open dialog. Othewise it    *
  80.  *  ends the dialog. Modifies the FILENAME item in the property*
  81.  *  list of the window.     *
  82.  *     *
  83.  ****************************************************************************/
  84. VOID NEAR PASCAL SelectFile(register HWND hwnd)
  85. {
  86.     register PSTR pch;
  87.     PSTR   pch2;
  88.     /* Get handle (near address) to filename data in window's property list */
  89.     pch = (PSTR)GetProp (hwnd, PROP_FILENAME);
  90.     /* Get the text from the dialog's edit control into this address */
  91.     GetDlgItemText (hwnd, IDD_FILENAME, pch, 64);
  92.     if ( IsWild (pch)){
  93. /* Select the directory and make a listing of the directories */
  94. DlgDirList(hwnd, (LPSTR)pch, (int)IDD_DIRS, (int)IDD_PATH, (WORD)ATTR_DIRS);
  95. /* Obtain the filename-only part of the path in the edit control */
  96. for (pch2 = pch; *pch; pch = CharNext(pch))
  97.     if (*pch == '\' || *pch == ':')
  98. pch2 = pch + 1;
  99. /* List the files in this directory based on the wildcard. */
  100. DlgDirList(hwnd, (LPSTR)pch2, IDD_FILES, IDD_PATH, ATTR_FILES);
  101. /* Set the dialog's edit control to the filename part of path
  102.  * string.
  103.  */
  104. SetDlgItemText (hwnd, IDD_FILENAME, pch2);
  105.     }
  106.     else
  107.     {
  108. /* The filename in the property list is not a wildcard */
  109. if (FileExists (pch)){
  110.     RemoveProp (hwnd, PROP_FILENAME);
  111.     EndDialog (hwnd, 0);
  112. }
  113. else{
  114.     MPError ( hwnd, MB_OK | MB_SYSTEMMODAL, IDS_CANTOPEN, (LPSTR) pch);
  115.     SetActiveWindow (hwnd);
  116. }
  117.     }
  118. }
  119. /****************************************************************************
  120.  *     *
  121.  *  FUNCTION   : FileOpenDlgProc()     *
  122.  *     *
  123.  *  PURPOSE    : Dialog function for the File/Open dialog. Takes care of    *
  124.  *  calling the appropriate functions for extracting the     *
  125.  *  filename and wildcard, filling the listboxes and changing  *
  126.  *  the FILENAME item in the property list for the window.     *
  127.  *     *
  128.  ****************************************************************************/
  129. BOOL APIENTRY FileOpenDlgProc (
  130. register HWND hwnd,
  131. WORD       message,
  132. register UINT wParam,
  133. LONG       lParam)
  134. {
  135.     PSTR pch;
  136.     switch (message){
  137. case WM_INITDIALOG:
  138.     /* Set the default file extension on edit window, and try to
  139.      * get a listing of the files and directories.
  140.      */
  141.     SetDlgItemText ( hwnd, IDD_FILENAME, DEFFILESEARCH);
  142.     SetProp (hwnd, PROP_FILENAME, (HANDLE) lParam);
  143.     SendDlgItemMessage (hwnd, IDD_FILENAME, EM_LIMITTEXT, 64, 0L);
  144.     SelectFile (hwnd);
  145.     break;
  146. case WM_COMMAND:
  147.     switch (LOWORD(wParam)) {
  148. case IDOK:
  149.     SelectFile(hwnd);
  150.     break;
  151. case IDCANCEL:
  152.     /* Set the filename in the prop. list to NULL and quit */
  153.     pch  = (PSTR) GetProp (hwnd, PROP_FILENAME);
  154.     *pch = 0;
  155.     EndDialog (hwnd, 0);
  156.     break;
  157. case IDD_FILENAME:
  158.     /* Enable the OK button if the edit control has text. */
  159.     EnableWindow ( GetDlgItem (hwnd, IDOK),
  160.    GetWindowTextLength (GET_WM_COMMAND_HWND(wParam, lParam)));
  161.     break;
  162. case IDD_FILES:
  163.     /* The files listbox. If file selection has changed, fill
  164.      * the new filename into the property list buffer and set
  165.      * text in edit control.
  166.      */
  167.     if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_SELCHANGE){
  168.     pch = (PSTR) GetProp (hwnd, PROP_FILENAME);
  169.     DlgDirSelectEx(hwnd, (LPSTR)pch, 128, IDD_FILES);
  170.     SetDlgItemText (hwnd, IDD_FILENAME, (LPSTR)pch);
  171.     }
  172.     else if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_DBLCLK)
  173.     /* if the item was double-clicked, try to open it */
  174.     SelectFile(hwnd);
  175.     break;
  176. case IDD_DIRS:
  177.     /* The directories listbox. Append current filename in edit
  178.      * control (stripped of the path prefix) to the name from
  179.      * the property list and set the new string in the edit
  180.      * control.
  181.      */
  182.     if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_SELCHANGE) {
  183.     PSTR pch2, pchT, pchS;
  184.     pch = (PSTR) GetProp (hwnd, PROP_FILENAME);
  185.     /* Get the new drive/dir */
  186.     DlgDirSelectEx(hwnd, pch, 128, IDD_DIRS);
  187.     pch2 = pch + lstrlen(pch);
  188.     /* Fetch current contents of dialog's edit control and append
  189.      * it to name from property list... */
  190.     GetDlgItemText(hwnd,IDD_FILENAME,(LPSTR)pch2,64);
  191.     if (*pch2 == 0){
  192.         SetDlgItemText(hwnd, IDD_FILENAME, DEFFILESEARCH);
  193.         GetDlgItemText(hwnd,IDD_FILENAME,(LPSTR)pch2,64);
  194.     }
  195.     else {
  196.         pchS = pch;
  197.         for (pchT = pch = pch2; *pch; pch++) {
  198.         if (*pch == '\' || *pch == ':') {
  199.             pchT = pch2;
  200.                         }
  201.                         else if (IsDBCSLeadByte(*pch)) {
  202.                             *pchT++ = *pch++;
  203.                             *pchT++ = *pch;
  204.                         }
  205.         else
  206.             *pchT++ = *pch;
  207.         }
  208.         *pchT = 0;
  209.         pch = pchS;
  210.     }
  211.     /* Set the edit control with new string */
  212.     SetDlgItemText (hwnd, IDD_FILENAME, (LPSTR)pch);
  213.     }
  214.     else if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_DBLCLK)
  215.     SelectFile (hwnd);
  216.     break;
  217. default:
  218.     return FALSE;
  219.     }
  220.     break;
  221. default:
  222.     return FALSE;
  223.     }
  224.     return TRUE;
  225. }
  226. /****************************************************************************
  227.  *     *
  228.  *  FUNCTION   : GetFilename ( pstr )     *
  229.  *     *
  230.  *  PURPOSE    : Gets a filename from the user by calling the File/Open     *
  231.  *  dialog.     *
  232.  *     *
  233.  ****************************************************************************/
  234. VOID APIENTRY GetFileName(PSTR pstr)
  235. {
  236. #ifdef NOTCOMMONDIALOGS
  237.     DialogBoxParam (hInst, IDD_FILEOPEN, hwndFrame, FileOpenDlgProc, (LONG)pstr);
  238. #else
  239.     OPENFILENAME ofn;
  240.     CHAR szFilterSpec[128];                       /* file type filters */
  241. CHAR szBuffer[128];
  242.     #define MAXFILENAME 256
  243.     CHAR szFileName[MAXFILENAME];
  244.     CHAR szFileTitle[MAXFILENAME];
  245. LoadString (hInst,IDS_FILTERSPEC, szFilterSpec, sizeof (szFilterSpec));
  246.     LoadString (hInst,IDS_OFNSTRTITLE, szBuffer, sizeof (szBuffer));
  247.     strcpy(szFileName, "");   /* these need be NULL*/
  248.     strcpy(szFileTitle, "");
  249.     /* fill in non-variant fields of OPENFILENAME struct. */
  250.     ofn.lStructSize       = sizeof(OPENFILENAME);
  251.     ofn.hwndOwner       = NULL;
  252.     ofn.lpstrFilter       = szFilterSpec;
  253.     ofn.lpstrCustomFilter = NULL;
  254.     ofn.nMaxCustFilter   = 0;
  255.     ofn.nFilterIndex   = 0;
  256.     ofn.lpstrFile         = szFileName;
  257.     ofn.nMaxFile       = MAXFILENAME;
  258.     ofn.lpstrInitialDir   = NULL;
  259.     ofn.lpstrFileTitle    = szFileTitle;
  260.     ofn.nMaxFileTitle     = MAXFILENAME;
  261.     ofn.lpstrTitle        = szBuffer;
  262.     ofn.lpstrDefExt       = "TXT";
  263.     ofn.Flags             = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  264.     /* Use standard open dialog */
  265.     if (!GetOpenFileName ((LPOPENFILENAME)&ofn)){
  266.         *pstr = 0;
  267. LoadString(hInst, IDS_OPENFAILMSG, szBuffer, sizeof (szBuffer));
  268.         MessageBox(hwndFrame, szBuffer, "Multipad", MB_OK | IDOK);
  269.     }
  270.     else{
  271.         strcpy(pstr, ofn.lpstrFile);
  272.     }
  273.  
  274. #endif
  275.    return;
  276. }