home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / progwin / chap15 / filedlg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-12  |  8.5 KB  |  262 lines

  1. /*-----------------------------------------------
  2.    FILEDLG.C -- Open and Close File Dialog Boxes
  3.   -----------------------------------------------*/
  4.  
  5. #include <windows.h>
  6. #include "filedlg.h"
  7.  
  8. BOOL FAR PASCAL FileOpenDlgProc (HWND, WORD, WORD, LONG) ;
  9. BOOL FAR PASCAL FileSaveDlgProc (HWND, WORD, WORD, LONG) ;
  10.  
  11. LPSTR lstrchr  (LPSTR str, char ch) ;
  12. LPSTR lstrrchr (LPSTR str, char ch) ;
  13.  
  14. static char      szDefExt   [5]  ;
  15. static char      szFileName [96] ;
  16. static char      szFileSpec [16] ;
  17. static POFSTRUCT pof ;
  18. static WORD      wFileAttr, wStatus ;
  19.  
  20. int DoFileOpenDlg (HANDLE hInst, HWND hwnd, char *szFileSpecIn,
  21.                    char *szDefExtIn, WORD wFileAttrIn,
  22.                    char *szFileNameOut, POFSTRUCT pofIn)
  23.      {
  24.      FARPROC lpfnFileOpenDlgProc ;
  25.      int     iReturn ;
  26.  
  27.      lstrcpy (szFileSpec, szFileSpecIn) ;
  28.      lstrcpy (szDefExt,   szDefExtIn) ;
  29.      wFileAttr = wFileAttrIn ;
  30.      pof = pofIn ;
  31.  
  32.      lpfnFileOpenDlgProc = MakeProcInstance (FileOpenDlgProc, hInst) ;
  33.  
  34.      iReturn = DialogBox (hInst, "FileOpen", hwnd, lpfnFileOpenDlgProc) ;
  35.  
  36.      FreeProcInstance (lpfnFileOpenDlgProc) ;
  37.  
  38.      lstrcpy (szFileNameOut, szFileName) ;
  39.      return iReturn ;
  40.      }
  41.  
  42. int DoFileSaveDlg (HANDLE hInst, HWND hwnd, char *szFileSpecIn,
  43.                    char *szDefExtIn, WORD *pwStatusOut,
  44.                    char *szFileNameOut, POFSTRUCT pofIn)
  45.      {
  46.      FARPROC lpfnFileSaveDlgProc ;
  47.      int     iReturn ;
  48.  
  49.      lstrcpy (szFileSpec, szFileSpecIn) ;
  50.      lstrcpy (szDefExt,   szDefExtIn) ;
  51.      pof = pofIn ;
  52.  
  53.      lpfnFileSaveDlgProc = MakeProcInstance (FileSaveDlgProc, hInst) ;
  54.  
  55.      iReturn = DialogBox (hInst, "FileSave", hwnd, lpfnFileSaveDlgProc) ;
  56.  
  57.      FreeProcInstance (lpfnFileSaveDlgProc) ;
  58.  
  59.      lstrcpy (szFileNameOut, szFileName) ;
  60.      *pwStatusOut = wStatus ;
  61.      return iReturn ;
  62.      }
  63.  
  64. BOOL FAR PASCAL FileOpenDlgProc (HWND hDlg, WORD message,
  65.                                  WORD wParam, LONG lParam)
  66.      {
  67.      char  cLastChar ;
  68.      short nEditLen ;
  69.  
  70.      switch (message)
  71.         {
  72.         case WM_INITDIALOG:
  73.            SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L) ;
  74.            DlgDirList (hDlg, szFileSpec, IDD_FLIST, IDD_FPATH, wFileAttr) ;
  75.            SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  76.            return TRUE ;
  77.  
  78.         case WM_COMMAND:
  79.            switch (wParam)
  80.               {
  81.               case IDD_FLIST:
  82.                  switch (HIWORD (lParam))
  83.                     {
  84.                     case LBN_SELCHANGE:
  85.                        if (DlgDirSelect (hDlg, szFileName, IDD_FLIST))
  86.                           lstrcat (szFileName, szFileSpec) ;
  87.                        SetDlgItemText (hDlg, IDD_FNAME, szFileName) ;
  88.                        return TRUE ;
  89.  
  90.                     case LBN_DBLCLK:
  91.                        if (DlgDirSelect (hDlg, szFileName, IDD_FLIST))
  92.                           {
  93.                           lstrcat (szFileName, szFileSpec) ;
  94.                           DlgDirList (hDlg, szFileName, IDD_FLIST, IDD_FPATH,
  95.                                                               wFileAttr) ;
  96.                           SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  97.                           }
  98.                        else
  99.                           {
  100.                           SetDlgItemText (hDlg, IDD_FNAME, szFileName) ;
  101.                           SendMessage (hDlg, WM_COMMAND, IDOK, 0L) ;
  102.                           }
  103.                        return TRUE ;
  104.                     }
  105.                  break ;
  106.  
  107.               case IDD_FNAME:
  108.                  if (HIWORD (lParam) == EN_CHANGE)
  109.                     EnableWindow (GetDlgItem (hDlg, IDOK),
  110.                        (BOOL) SendMessage (LOWORD (lParam),
  111.                                              WM_GETTEXTLENGTH, 0, 0L)) ;
  112.                  return TRUE ;
  113.  
  114.               case IDOK:
  115.                  GetDlgItemText (hDlg, IDD_FNAME, szFileName, 80) ;
  116.  
  117.                  nEditLen  = lstrlen (szFileName) ;
  118.                  cLastChar = *AnsiPrev (szFileName, szFileName + nEditLen) ;
  119.                
  120.                  if (cLastChar == '\\' || cLastChar == ':')
  121.                     lstrcat (szFileName, szFileSpec) ;
  122.  
  123.                  if (lstrchr (szFileName, '*') || lstrchr (szFileName, '?'))
  124.                     {
  125.                     if (DlgDirList (hDlg, szFileName, IDD_FLIST,
  126.                                           IDD_FPATH, wFileAttr))
  127.                        {
  128.                        lstrcpy (szFileSpec, szFileName) ;
  129.                        SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  130.                        }
  131.                     else
  132.                        MessageBeep (0) ;
  133.  
  134.                     return TRUE ;
  135.                     }
  136.  
  137.                  lstrcat (lstrcat (szFileName, "\\"), szFileSpec) ;
  138.  
  139.                  if (DlgDirList (hDlg, szFileName, IDD_FLIST,
  140.                                                    IDD_FPATH, wFileAttr))
  141.                     {
  142.                     lstrcpy (szFileSpec, szFileName) ;
  143.                     SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  144.                     return TRUE ;
  145.                     }
  146.  
  147.                  szFileName [nEditLen] = '\0' ;
  148.  
  149.                  if (-1 == OpenFile (szFileName, pof, OF_READ | OF_EXIST))
  150.                     {
  151.                     lstrcat (szFileName, szDefExt) ;
  152.                     if (-1 == OpenFile (szFileName, pof, OF_READ | OF_EXIST))
  153.                        {
  154.                        MessageBeep (0) ;
  155.                        return TRUE ;
  156.                        }
  157.                     }
  158.                     lstrcpy (szFileName,
  159.                              AnsiNext (lstrrchr (pof->szPathName, '\\'))) ;
  160.                  
  161.                  OemToAnsi (szFileName, szFileName) ;
  162.                  EndDialog (hDlg, TRUE) ;
  163.                  return TRUE ;
  164.  
  165.               case IDCANCEL:
  166.                  EndDialog (hDlg, FALSE) ;
  167.                  return TRUE ;
  168.               }
  169.         }
  170.      return FALSE ;
  171.      }
  172.  
  173. BOOL FAR PASCAL FileSaveDlgProc (HWND hDlg, WORD message,
  174.                                  WORD wParam, LONG lParam)
  175.      {
  176.      switch (message)
  177.         {
  178.         case WM_INITDIALOG:
  179.            SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L) ;
  180.            DlgDirList (hDlg, szFileSpec, 0, IDD_FPATH, 0) ;
  181.            SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  182.            return TRUE ;
  183.  
  184.         case WM_COMMAND:
  185.            switch (wParam)
  186.               {
  187.               case IDD_FNAME:
  188.                  if (HIWORD (lParam) == EN_CHANGE)
  189.                     EnableWindow (GetDlgItem (hDlg, IDOK),
  190.                        (BOOL) SendMessage (LOWORD (lParam),
  191.                                              WM_GETTEXTLENGTH, 0, 0L)) ;
  192.                  return TRUE ;
  193.  
  194.               case IDOK:
  195.                  GetDlgItemText (hDlg, IDD_FNAME, szFileName, 80) ;
  196.  
  197.                  if (-1 == OpenFile (szFileName, pof, OF_PARSE))
  198.                     {
  199.                     MessageBeep (0) ;
  200.                     return TRUE ;
  201.                     }
  202.  
  203.                  if (!lstrchr (AnsiNext (lstrrchr (pof->szPathName, '\\')),
  204.                                '.'))
  205.                     lstrcat (szFileName, szDefExt) ;
  206.  
  207.                  if (-1 != OpenFile (szFileName, pof, OF_WRITE | OF_EXIST))
  208.                     wStatus = 1 ;
  209.  
  210.                  else if (-1 != OpenFile (szFileName, pof,
  211.                                                   OF_CREATE | OF_EXIST))
  212.                     wStatus = 0 ;
  213.  
  214.                  else
  215.                     {
  216.                     MessageBeep (0) ;
  217.                     return TRUE ;
  218.                     }
  219.  
  220.                  lstrcpy (szFileName,
  221.                           AnsiNext (lstrrchr (pof->szPathName, '\\'))) ;
  222.  
  223.                  OemToAnsi (szFileName, szFileName) ;
  224.                  EndDialog (hDlg, TRUE) ;
  225.                  return TRUE ;
  226.  
  227.               case IDCANCEL:
  228.                  EndDialog (hDlg, FALSE) ;
  229.                  return TRUE ;
  230.               }
  231.         }
  232.      return FALSE ;
  233.      }
  234.  
  235. LPSTR lstrchr (LPSTR str, char ch)
  236.      {
  237.      while (*str)
  238.           {
  239.           if (ch == *str)
  240.                return str ;
  241.  
  242.           str = AnsiNext (str) ;
  243.           }
  244.      return NULL ;
  245.      }
  246.  
  247. LPSTR lstrrchr (LPSTR str, char ch)
  248.      {
  249.      LPSTR strl = str + lstrlen (str) ;
  250.  
  251.      do
  252.           {
  253.           if (ch == *strl)
  254.                return strl ;
  255.  
  256.           strl = AnsiPrev (str, strl) ;
  257.           }
  258.      while (strl > str) ;
  259.  
  260.      return NULL ;
  261.      }
  262.