home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / filedlg.zip / FILEDL.TXT
Text File  |  1993-08-23  |  9KB  |  303 lines

  1.  
  2.  
  3. 16.3 The FOLEDLG Example Program
  4.  
  5. The example program FILEDLG creates a file dialog and prints the file name 
  6. of the selected file on the client area.
  7.  
  8. ***********************************************************
  9. *                       FILEDLG.C                         *
  10. ***********************************************************
  11.  
  12. #define INCL_WINSTDFILE
  13. #define INCL_WINSYS
  14. #define INCL_WINWINDOWMGR
  15.  
  16. #include <os2.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include "filedlg.h"
  21.  
  22. MRESULT EXPENTRY ClientWndProc ( HWND hwndWnd,
  23.                                  ULONG ulMsg,
  24.                                  MPARAM mpParm1,
  25.                                  MPARAM mpParm2 ) ;
  26.  
  27. BOOL FindFile ( HWND hwndWnd, CHAR * pchFile ) ;
  28.  
  29. #define CLS_CLIENT               "MyClass"
  30.  
  31. INT main ( VOID )
  32. {
  33.    HAB         habAnchor ;
  34.    HMQ         hmqQueue ;
  35.    ULONG       ulFlags ;
  36.    HWND        hwndFrame ;
  37.    HWND        hwndClient ;
  38.    BOOL        bLoop ;
  39.    QMSG        qmMsg ;
  40.  
  41.    habAnchor = WinInitialize ( 0 ) ;
  42.    hmqQueue = WinCreateMsgQueue ( habAnchor, 0 ) ;
  43.  
  44.    WinRegisterClass ( habAnchor,
  45.                       CLS_CLIENT,
  46.                       ClientWndProc,
  47.                       CS_SIZEREDRAW,
  48.                       sizeof ( PVOID )) ;
  49.  
  50.    ulFlags = FCF_TITLEBAR | FCF_SYSMENU | FCF_MENU |
  51.              FCF_MINMAX | FCF_SIZEBORDER | FCF_SHELLPOSITION |
  52.              FCF_TASKLIST ;
  53.  
  54.    hwndFrame = WinCreateStdWindow ( HWND_DESKTOP,
  55.                                   0,
  56.                                   &ulFlags,
  57.                                   CLS_CLIENT,
  58.                                   "File Dialog Example",
  59.                                   0,
  60.                                   NULLHANDLE,
  61.                                   RES_CLIENT,
  62.                                   &hwndClient ) ;
  63.  
  64.    if ( hwndFrame != NULLHANDLE ) {
  65.  
  66.       WinSetWindowPos ( hwndFrame,
  67.                         NULLHANDLE,
  68.                         50,
  69.                         50,
  70.                         500,
  71.                         250,
  72.                         SWP_SIZE |
  73.                         SWP_MOVE |
  74.                         SWP_ACTIVATE |
  75.                         SWP_SHOW ) ;
  76.  
  77.       bLoop = WinGetMsg ( habAnchor, &qmMsg, NULLHANDLE, 0, 0 ) ;
  78.  
  79.       while ( bLoop ) {
  80.          WinDispatchMsg ( habAnchor, &qmMsg ) ;
  81.          bLoop = WinGetMsg ( habAnchor,
  82.                              &qmMsg,
  83.                              NULLHANDLE,
  84.                              0,
  85.                              0 ) ;
  86.       } /* endwhile */
  87.  
  88.       WinDestroyWindow ( hwndFrame ) ;
  89.    } /* endif */
  90.  
  91.    WinDestroyMsgQueue ( hmqQueue ) ;
  92.    WinTerminate ( habAnchor ) ;
  93.    return 0 ;
  94. }
  95.  
  96. MRESULT EXPENTRY ClientWndProc ( HWND hwndWnd,
  97.                                  ULONG ulMsg,
  98.                                  MPARAM mpParm1,
  99.                                  MPARAM mpParm2 )
  100. {
  101.    PCHAR pchFile ;
  102.  
  103.    pchFile = WinQueryWindowPtr ( hwndWnd, 0 ) ;
  104.  
  105.    switch ( ulMsg ) {
  106.  
  107.    case WM_CREATE:
  108.       pchFile = ( PCHAR ) malloc ( CCHMAXPATH ) ;
  109.       if ( pchFile == NULL ) {
  110.          WinAlarm ( HWND_DESKTOP, WA_ERROR ) ;
  111.          WinMessageBox ( HWND_DESKTOP,
  112.                          hwndWnd,
  113.                          "No memory could be allocated !",
  114.                          "Error",
  115.                          0,
  116.                          MB_INFORMATION | MB_OK ) ;
  117.          return MRFROMSHORT ( TRUE ) ;
  118.       } /* endif */
  119.  
  120.       WinSetWindowPtr ( hwndWnd, 0, pchFile ) ;
  121.       pchFile [0] = 0 ;
  122.       break ;
  123.  
  124.    case WM_DESTROY:
  125.       if ( pchFile != NULL ) {
  126.          free ( pchFile ) ;
  127.       } /* endif */
  128.       break ;
  129.  
  130.    case WM_PAINT:
  131.       {
  132.          HPS   hpsPaint ;
  133.          RECTL rclInvalid ;
  134.          CHAR  achText [CCHMAXPATH] ;
  135.  
  136.          hpsPaint = WinBeginPaint ( hwndWnd,
  137.                                     NULLHANDLE,
  138.                                     &rclInvalid ) ;
  139.  
  140.          WinFillRect ( hpsPaint, &rclInvalid, SYSCLR_WINDOW ) ;
  141.  
  142.          if ( pchFile [0] != 0 ) {
  143.  
  144.             WinQueryWindowRect ( hwndWnd, &rclInvalid ) ;
  145.             sprintf ( achText,
  146.                       "You have selected file %s",
  147.                       pchFile ) ;
  148.             WinDrawText ( hpsPaint,
  149.                           - 1,
  150.                           achText,
  151.                           &rclInvalid,
  152.                           0,
  153.                           0,
  154.                           DT_CENTER | DT_VCENTER | DT_TEXTATTRS ) ;
  155.          } /* endif */
  156.  
  157.          WinEndPaint ( hpsPaint ) ;
  158.       }
  159.       break ;
  160.  
  161.    case WM_COMMAND:
  162.  
  163.       switch ( SHORT1FROMMP ( mpParm1 )) {
  164.  
  165.       case IDM_OPEN:
  166.          if ( pchFile ) {
  167.             FindFile ( hwndWnd, pchFile ) ;
  168.          } /* endif */
  169.  
  170.          WinInvalidateRect ( hwndWnd, NULL, TRUE ) ;
  171.          WinUpdateWindow ( hwndWnd ) ;
  172.          break ;
  173.  
  174.       case IDM_EXIT:
  175.          WinPostMsg ( hwndWnd, WM_QUIT, 0, 0 ) ;
  176.          break ;
  177.  
  178.       default:
  179.          return WinDefWindowProc ( hwndWnd,
  180.                                    ulMsg,
  181.                                    mpParm1,
  182.                                    mpParm2 ) ;
  183.       } /* endswitch */
  184.       break ;
  185.  
  186.    default:
  187.       return WinDefWindowProc ( hwndWnd,
  188.                                 ulMsg,
  189.                                 mpParm1,
  190.                                 mpParm2 ) ;
  191.    } /* endswitch */
  192.  
  193.    return MRFROMSHORT ( FALSE ) ;
  194. }
  195.  
  196. BOOL FindFile ( HWND hwndWnd, CHAR * pchFile )
  197. {
  198.    FILEDLG      fdFileDlg ;
  199.  
  200.    memset ( &fdFileDlg, 0, sizeof ( FILEDLG )) ;
  201.  
  202.    fdFileDlg.cbSize = sizeof ( FILEDLG ) ;
  203.    fdFileDlg.fl = FDS_CENTER | FDS_PRELOAD_VOLINFO |
  204.                   FDS_OPEN_DIALOG ;
  205.  
  206.    if ( WinFileDlg ( HWND_DESKTOP,
  207.                      hwndWnd,
  208.                      &fdFileDlg ) != DID_OK ) {
  209.       WinAlarm ( HWND_DESKTOP, WA_ERROR ) ;
  210.       return FALSE ;
  211.    } /* endif */
  212.  
  213.    strcpy ( pchFile, fdFileDlg.szFullFile ) ;
  214.    return TRUE ;
  215. }
  216.  
  217. ***********************************************************
  218. *                       FILEDLG.RC                        *
  219. ***********************************************************
  220.  
  221. #include <os2.h>
  222. #include "filedlg.h"
  223.  
  224. MENU RES_CLIENT
  225. {
  226.    SUBMENU "~File", IDM_SUB1
  227.    {
  228.       MENUITEM "~New" , IDM_NEW
  229.       MENUITEM "~Open File...", IDM_OPEN
  230.       MENUITEM "~Close File", IDM_CLOSE
  231.       MENUITEM "E~xit" , IDM_EXIT
  232.    }
  233. }
  234.  
  235. ***********************************************************
  236. *                       FILEDLG.H                         *
  237. ***********************************************************
  238.  
  239. #define RES_CLIENT               256
  240. #define IDM_SUB1                 512
  241. #define IDM_NEW                  513
  242. #define IDM_OPEN                 514
  243. #define IDM_CLOSE                515
  244. #define IDM_EXIT                 516
  245.  
  246. ***********************************************************
  247. *                       FILEDLG.MAK                       *
  248. ***********************************************************
  249.  
  250. FILEDLG.EXE:                    FILEDLG.OBJ \
  251.                                 FILEDLG.RES
  252.         LINK386 @<<
  253. FILEDLG
  254. FILEDLG
  255. FILEDLG
  256. OS2386
  257. FILEDLG
  258. <<
  259.         RC FILEDLG.RES FILEDLG.EXE
  260.  
  261. FILEDLG.RES:                    FILEDLG.RC \
  262.                                 FILEDLG.H
  263.         RC -r FILEDLG.RC FILEDLG.RES
  264.  
  265. FILEDLG.OBJ:                    FILEDLG.C \
  266.                                 FILEDLG.H
  267.         ICC -C+ -Kb+ -Ss+ FILEDLG.C
  268.  
  269. ***********************************************************
  270. *                       FILEDLG.DEF                       *
  271. ***********************************************************
  272.  
  273. NAME FILEDLG WINDOWAPI
  274. DESCRIPTION 'File dialog example
  275.              Copyright (c) 1992 by Kathleen Panov.
  276.              All rights reserved.'
  277. STACKSIZE 16384
  278.  
  279. ***********************************************************
  280.  
  281. In the FILEDLG example, a standard window is created with a menu. In the 
  282. WM_CREATE processing, memory is allocated to hold the selected file name. 
  283. The pointer to this memory is attached as a window word using WinSetWindowPtr. 
  284. This memory is freed when the WM_DESTROY message is received.
  285.  
  286. When the user selects the "Open" selection from the menu, a
  287. WM_COMMAND message is sent. When the message is received, the user 
  288. function FindFile is called. After this function returns, the client 
  289. area is invalidated to force a repaint.
  290.  
  291. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  292. +                       NOTICE                            +
  293. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  294.  
  295. The FILEDLG example is from "The Art of OS/2 C Programming" 
  296. by Kathleen Panov, Arthur Panov, and Larry Salomon, Jr., 
  297. ISBN 0-89435-446-9, published in August 1993 by QED Publishing Group. 
  298. The example was uploaded by the publisher with the assistance of 
  299. the authors for use by Forum members. 
  300.  
  301. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  302. +                       END OF FILE                       +
  303. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++