home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / MSJV5-3.ZIP / VLB.ZIP / DEMO.C < prev    next >
Text File  |  1990-05-01  |  8KB  |  286 lines

  1. /*
  2. **  demo.c     demonstration of VLB  (virtual list box)
  3. **
  4. **  Author: Robert A. Wood
  5. **
  6. **  Microsoft C version 5.1 / medium memory model
  7. **  Microsoft Windows SDK version 2.1
  8. **  Runtime: Windows 286 version 2.1
  9. **
  10. **    Date: 03/19/90
  11. */
  12.  
  13. #include <windows.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <io.h>
  17. #include <fcntl.h>
  18. #include "demo.h"
  19. #include "vlb.h"
  20. #include "lmem.h"
  21.  
  22. HWND hWnd;
  23. HANDLE hInst;
  24. char szAppName[] = "Demo";
  25.  
  26. WORD FAR PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
  27.                          LPSTR lpCmdLine, WORD nCmdShow )
  28. {
  29.    MSG msg;
  30.  
  31.    if( ! hPrevInstance )
  32.       MainInit( hInstance );
  33.  
  34.    hWnd = CreateWindow( szAppName,          // window class
  35.                szAppName,                   // window name
  36.                WS_OVERLAPPEDWINDOW,         // window style
  37.                0,                           // x position
  38.                0,                           // y position
  39.                CW_USEDEFAULT,               // width
  40.                0,                           // height
  41.                NULL,                        // parent handle
  42.                NULL,                        // menu or child ID
  43.                hInstance,                   // instance
  44.                NULL);                       // additional info
  45.  
  46.    hInst = hInstance;
  47.  
  48.    ShowWindow( hWnd, nCmdShow );
  49.    UpdateWindow( hWnd );
  50.  
  51.    while( GetMessage( &msg, NULL, 0, 0 ) )
  52.    {
  53.       TranslateMessage( &msg );
  54.       DispatchMessage( &msg );
  55.    }
  56.    return( msg.wParam );
  57. }
  58.  
  59. /*
  60. ** Initializes window data and registers window class
  61. ********************************************************************/
  62. BOOL MainInit( HANDLE hInstance )
  63. {
  64.    WNDCLASS Class;
  65.  
  66.    Class.hCursor       = LoadCursor(NULL,IDC_ARROW);
  67.    Class.hIcon         = NULL;
  68.    Class.cbClsExtra    = 0;
  69.    Class.cbWndExtra    = 0;
  70.    Class.lpszMenuName  = szAppName;
  71.    Class.lpszClassName = szAppName;
  72.    Class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);;
  73.    Class.hInstance     = hInstance;
  74.    Class.style         = CS_VREDRAW | CS_HREDRAW;
  75.    Class.lpfnWndProc   = MainWndProc;
  76.    Class.style = NULL;
  77.  
  78.   return( RegisterClass( &Class ) );
  79. }
  80.  
  81. /*
  82. ** Main Window Procedure
  83. ********************************************************************/
  84. LONG FAR PASCAL MainWndProc( HWND hWnd, unsigned message,
  85.                              WORD wParam, LONG lParam )
  86. {
  87.    FARPROC  lpfnDlgProc;
  88.  
  89.    switch( message )
  90.    {
  91.       case WM_COMMAND:
  92.          if( wParam == IDM_DIALOG )
  93.          {
  94.             lpfnDlgProc = MakeProcInstance( DlgProc, hInst );
  95.             DialogBox( hInst, "DEMO", hWnd, lpfnDlgProc );
  96.             FreeProcInstance(lpfnDlgProc);
  97.          }
  98.          break;
  99.  
  100.       case WM_DESTROY:
  101.          PostQuitMessage( FALSE );
  102.          break;
  103.  
  104.       default:
  105.          return( DefWindowProc( hWnd, message, wParam, lParam ) );
  106.    }
  107.    return( FALSE );
  108. }
  109.  
  110. /*
  111. ** Dialog Procedure
  112. ********************************************************************/
  113. BOOL FAR PASCAL DlgProc( HWND hDlg, unsigned message,
  114.                          WORD wParam, LONG lParam )
  115. {
  116.    switch ( message )
  117.    {
  118.       case WM_INITDIALOG:
  119.          InitVLB( hInst, hDlg, IDD_LISTBOX, VLBfile );
  120.          break;
  121.  
  122.       case WM_COMMAND:
  123.          if ( wParam == IDOK )
  124.             EndDialog( hDlg, TRUE );
  125.          if ( wParam == IDCANCEL )
  126.             EndDialog( hDlg, FALSE );
  127.          if( wParam == IDD_LISTBOX )
  128.          {
  129.             switch( HIWORD( lParam ) )
  130.             {
  131.             case VLBN_DBLCLK:
  132.             case VLBN_SELCHANGE:
  133.                SendMessage( GetDlgItem( hDlg, IDD_TEXT ),
  134.                   WM_SETTEXT, 0, SendMessage( LOWORD( lParam ),
  135.                   VLB_GETSELSTR, 0, 0L ) );
  136.                break;
  137.             }
  138.          }
  139.  
  140.          break;
  141.  
  142.       default:
  143.          return( FALSE );
  144.    }
  145.    return( TRUE );
  146. }
  147.  
  148. /*
  149. ** demo VLB CallBack function for ASCII an file
  150. ********************************************************************/
  151. LONG FAR PASCAL VLBfile( WORD wListBoxId,        // control id
  152.                          unsigned message,      // message
  153.                          LONG FAR *lplStringID, // string ID
  154.                          LPSTR lpszString )     // string
  155. {
  156.    static int hFile = 0;                 // file handle
  157.    static LONG TotalStrings = 0;         // total records in file
  158.    static Tabs[] = { 0, 9, 15, 23, 33 }; // tabs for pageleft & right
  159.    static int TotalTabs = 5;             // total tabs
  160.    static int Column = 0;                // 1st col of display string
  161.    static int StrLength = 40;            // total string length
  162.    static int RecLength = 42;            // total record len (CR/LF)
  163.    static char filename[] = "vlb.txt";   // VLB filename
  164.    char buf[60];                         // temp buffer to read to
  165.  
  166.    switch( message )
  167.    {
  168.       case VCB_LENGTH:
  169.          return( TotalStrings );
  170.  
  171.       case VCB_WIDTH:
  172.          return( Tabs[ TotalTabs-1 ] );
  173.  
  174.       case VCB_CREATE:
  175.       {
  176.          long length;
  177.          if( ( hFile = open( filename, O_RDONLY ) ) == NULL )
  178.             return( FALSE );
  179.  
  180.          length = lseek( hFile, 0L, SEEK_END );
  181.          lseek( hFile, 0L, SEEK_SET );
  182.          TotalStrings = length / RecLength;
  183.          Column = 0;                // 1st column of displayed string
  184.          return( TRUE );
  185.       }
  186.  
  187.       case VCB_SETFOCUS:
  188.       case VCB_KILLFOCUS:
  189.          return( TRUE );
  190.  
  191.       case VCB_DESTROY:
  192.          close( hFile );
  193.          return( TRUE );
  194.  
  195.       case VCB_NEXT:
  196.          if( *lplStringID >= TotalStrings - 1 )
  197.             return( FALSE );
  198.          (*lplStringID)++;
  199.          break;
  200.  
  201.       case VCB_PREV:
  202.          if( *lplStringID <= 0 )
  203.             return( FALSE );
  204.          (*lplStringID)--;
  205.          break;
  206.  
  207.       case VCB_FIRST:
  208.          *lplStringID = 0;
  209.          break;
  210.  
  211.       case VCB_LAST:
  212.          *lplStringID = TotalStrings-1;
  213.          break;
  214.  
  215.       case VCB_VTHUMB:
  216.       case VCB_FULLSTRING:
  217.       case VCB_STRING:
  218.          *lplStringID = (LONG)min( (int)(TotalStrings-1),
  219.                               max( 0, (int)*lplStringID ) );
  220.          break;
  221.  
  222.       case VCB_LEFT:          // move string start one char left
  223.          return( Column = max( 0, Column - 1 ) );
  224.  
  225.       case VCB_RIGHT:         // move string start one char right
  226.          return( Column = min( Tabs[ TotalTabs-1 ], Column + 1 ) );
  227.  
  228.       case VCB_PAGELEFT:      // move string start one column left
  229.       {
  230.          int x;
  231.          if( Column <= 0 )
  232.             return( Column = Tabs[0] );
  233.  
  234.          for( x = 0; Column > Tabs[x]; x++ )
  235.             ;
  236.          Column = Tabs[x-1];
  237.          return( Column = max( 0, Column ) );
  238.       }
  239.  
  240.       case VCB_PAGERIGHT:     // move string start one column right
  241.       {
  242.          int x;
  243.          if( Column >= Tabs[ TotalTabs - 1 ] )
  244.             return( Column = Tabs[ TotalTabs - 1 ] );
  245.  
  246.          for( x = 0; Column >= Tabs[x]; x++ )
  247.             ;
  248.          Column = Tabs[x];
  249.          return( Column = min( Tabs[ TotalTabs - 1 ], Column ) );
  250.       }
  251.  
  252.       case VCB_HTHUMB:        // move string start specified by thumb
  253.          return( Column = min( StrLength-1,
  254.                           max( 0, (int)*lplStringID ) ) );
  255.  
  256.       default:
  257.          return( FALSE );
  258.    }
  259.  
  260.    if( message == VCB_NEXT   || message == VCB_PREV   ||
  261.        message == VCB_VTHUMB || message == VCB_STRING ||
  262.        message == VCB_FIRST  || message == VCB_LAST   ||
  263.        message == VCB_FULLSTRING )
  264.    {
  265.       if( hFile < 0 )           // file open failed
  266.          return( FALSE );
  267.  
  268.       lseek( hFile, *lplStringID * RecLength, SEEK_SET );
  269.       read( hFile, buf, RecLength );
  270.  
  271.       if( message == VCB_FULLSTRING )
  272.       {
  273.          lmemmove( lpszString, buf, StrLength );
  274.          *( lpszString + StrLength ) = 0;
  275.       }
  276.       else
  277.       {
  278.          lmemmove( lpszString, buf + Column, StrLength - Column );
  279.          *( lpszString + StrLength - Column ) = 0;
  280.       }
  281.    }
  282.    return( TRUE );
  283. }
  284.  
  285. //*** END OF DEMO.C *************************************************
  286.