home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / VISUAL_B / CODIGO_2 / VBLISTBX / VBLISTBX.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-09  |  12.0 KB  |  511 lines

  1. #include "windows.h"
  2. #include "vbapi.h"
  3.  
  4. LONG FAR PASCAL _export MultSelWndProc( HCTL, HWND, USHORT, USHORT, LONG );
  5.  
  6. typedef struct {
  7.    long cArgs;
  8.    long hszItem;
  9.    long index;
  10. } LPPARAM;
  11.  
  12. typedef struct {
  13.    WORD far *Item;
  14.    LPVOID Index;
  15. } CLICKSTRUCT;
  16.  
  17.  
  18. typedef struct {
  19.    WORD Refresh;
  20.    WORD CellWidth;
  21.    int Type, Extend;
  22. } MSEL;
  23.  
  24. #define DEREF(hctl)  ((MSEL far *)VBDerefControl(hctl))
  25.  
  26. HANDLE hmodDLL;
  27.  
  28. PROPINFO piExtend =
  29. {
  30.    "ExtendedSel",
  31.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  32.    0, 0, NULL, 0
  33. };
  34.  
  35. PROPINFO piListCount =
  36. {
  37.    "ListCount",
  38.    DT_SHORT | PF_fGetMsg | PF_fNoRuntimeW | PF_fNoShow,
  39.    0, 0
  40. };
  41.  
  42. PROPINFO piListIndex =
  43. {
  44.    "Select",
  45.    DT_SHORT | PF_fGetMsg | PF_fSetMsg | PF_fPropArray | PF_fNoShow,
  46.    2, 0
  47. };
  48.  
  49. PROPINFO piList =
  50. {
  51.    "List",
  52.    DT_HSZ | PF_fGetMsg | PF_fPropArray | PF_fNoShow,
  53.    4, 0
  54. };
  55.  
  56. PROPINFO piRefresh =
  57. {
  58.    "Update",
  59.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  60.    0, 0, NULL, 0
  61. };
  62.  
  63. PROPINFO piCellWidth =
  64. {
  65.    "CellWidth",
  66.    DT_SHORT | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  67.    0, 0, NULL, 0
  68. };
  69.  
  70. PROPINFO piVersion =
  71. {
  72.    "Version",
  73.    DT_SHORT | PF_fGetMsg,
  74.    0, 0, NULL, 0
  75. };
  76.  
  77. PPROPINFO proplistMSel[] =
  78. {
  79.    PPROPINFO_STD_CTLNAME,
  80.    PPROPINFO_STD_INDEX,
  81.    PPROPINFO_STD_BACKCOLOR,
  82.    PPROPINFO_STD_FORECOLOR,
  83.    PPROPINFO_STD_BORDERSTYLEON,
  84.    PPROPINFO_STD_LEFT,
  85.    PPROPINFO_STD_TOP,
  86.    PPROPINFO_STD_WIDTH,
  87.    PPROPINFO_STD_HEIGHT,
  88.    PPROPINFO_STD_ENABLED,
  89.    PPROPINFO_STD_VISIBLE,
  90.    PPROPINFO_STD_FONTNAME,
  91.    PPROPINFO_STD_FONTSIZE,
  92.    PPROPINFO_STD_FONTBOLD,
  93.    PPROPINFO_STD_FONTITALIC,
  94.    PPROPINFO_STD_FONTSTRIKE,
  95.    PPROPINFO_STD_FONTUNDER,
  96.    PPROPINFO_STD_DRAGMODE,
  97.    PPROPINFO_STD_DRAGICON,
  98.    PPROPINFO_STD_TABINDEX,
  99.    PPROPINFO_STD_TABSTOP,
  100.    PPROPINFO_STD_TAG,
  101.    &piListCount,
  102.    &piListIndex,
  103.    &piList,
  104.    &piRefresh,
  105.    &piVersion,
  106.    &piExtend,
  107.    NULL
  108. };
  109.  
  110. PPROPINFO proplistMC[] =
  111. {
  112.    PPROPINFO_STD_CTLNAME,
  113.    PPROPINFO_STD_INDEX,
  114.    PPROPINFO_STD_BACKCOLOR,
  115.    PPROPINFO_STD_FORECOLOR,
  116.    PPROPINFO_STD_BORDERSTYLEON,
  117.    PPROPINFO_STD_LEFT,
  118.    PPROPINFO_STD_TOP,
  119.    PPROPINFO_STD_WIDTH,
  120.    PPROPINFO_STD_HEIGHT,
  121.    PPROPINFO_STD_ENABLED,
  122.    PPROPINFO_STD_VISIBLE,
  123.    PPROPINFO_STD_FONTNAME,
  124.    PPROPINFO_STD_FONTSIZE,
  125.    PPROPINFO_STD_FONTBOLD,
  126.    PPROPINFO_STD_FONTITALIC,
  127.    PPROPINFO_STD_FONTSTRIKE,
  128.    PPROPINFO_STD_FONTUNDER,
  129.    PPROPINFO_STD_DRAGMODE,
  130.    PPROPINFO_STD_DRAGICON,
  131.    PPROPINFO_STD_TABINDEX,
  132.    PPROPINFO_STD_TABSTOP,
  133.    PPROPINFO_STD_TAG,
  134.    &piListCount,
  135.    &piListIndex,
  136.    &piList,
  137.    &piRefresh,
  138.    &piVersion,
  139.    &piExtend,
  140.    &piCellWidth,
  141.    NULL
  142. };
  143.  
  144. #define PROP_LISTCOUNT   22
  145. #define PROP_LISTINDEX   23
  146. #define PROP_LIST        24
  147. #define PROP_REFRESH     25
  148. #define PROP_VERSION     26
  149. #define PROP_EXTEND      27
  150. #define PROP_CELLWIDTH   28      /*  Always at end of list  */
  151.  
  152. WORD Click_Params[] = { ET_I2 };
  153.  
  154. EVENTINFO Event_Click =
  155. {
  156.    "Click", 1, 2, Click_Params, "Item as Integer"
  157. };
  158.  
  159. EVENTINFO Event_DblClk =
  160. {
  161.    "DblClk", 1, 2, Click_Params, "Item as Integer"
  162. };
  163.  
  164. EVENTINFO Event_Load =
  165. {
  166.    "Loaded", 0, 0, NULL, NULL
  167. };
  168.  
  169.  
  170. PEVENTINFO eventlistMSel[] =
  171. {
  172.    &Event_Click,
  173.    &Event_DblClk,
  174.    PEVENTINFO_STD_DRAGDROP,
  175.    PEVENTINFO_STD_DRAGOVER,
  176.    PEVENTINFO_STD_GOTFOCUS,
  177.    &Event_Load,
  178.    PEVENTINFO_STD_LOSTFOCUS,
  179.    PEVENTINFO_STD_KEYDOWN,
  180.    PEVENTINFO_STD_KEYPRESS,
  181.    PEVENTINFO_STD_KEYUP,
  182.    NULL
  183. };
  184.  
  185.  
  186. MODEL modelMSel =
  187. {
  188.    VB_VERSION,
  189.    MODEL_fFocusOk | MODEL_fArrows | MODEL_fLoadMsg,
  190.    (PCTLPROC)MultSelWndProc,
  191.    NULL,
  192.    WS_BORDER | WS_CHILD | LBS_MULTIPLESEL | LBS_NOTIFY | WS_VSCROLL | LBS_NOINTEGRALHEIGHT,
  193.    sizeof(MSEL),
  194.    8000,
  195.    "MSList",
  196.    "MSList",
  197.    "ListBox",
  198.    proplistMSel,
  199.    eventlistMSel
  200. };
  201.  
  202.  
  203. MODEL modelMCSel =
  204. {
  205.    VB_VERSION,
  206.    MODEL_fFocusOk | MODEL_fArrows | MODEL_fLoadMsg,
  207.    (PCTLPROC)MultSelWndProc,
  208.    NULL,
  209.    WS_BORDER | WS_CHILD | LBS_MULTIPLESEL | LBS_NOTIFY | WS_VSCROLL | LBS_MULTICOLUMN | LBS_NOINTEGRALHEIGHT,
  210.    sizeof(MSEL),
  211.    8010,
  212.    "MCSList",
  213.    "MCSList",
  214.    "ListBox",
  215.    proplistMC,
  216.    eventlistMSel
  217. };
  218.  
  219. MODEL modelMC =
  220. {
  221.    VB_VERSION,
  222.    MODEL_fFocusOk | MODEL_fArrows | MODEL_fLoadMsg,
  223.    (PCTLPROC)MultSelWndProc,
  224.    NULL,
  225.    WS_BORDER | WS_CHILD | LBS_NOTIFY | LBS_MULTICOLUMN | WS_VSCROLL | LBS_NOINTEGRALHEIGHT,
  226.    sizeof(MSEL),
  227.    8020,
  228.    "MCList",
  229.    "MCList",
  230.    "ListBox",
  231.    proplistMC,
  232.    eventlistMSel
  233. };
  234.  
  235. BOOL FAR PASCAL LibMain( HANDLE hmod, HANDLE segDS, USHORT cbHeapSize )
  236. {
  237.    hmodDLL = hmod;
  238.    return( TRUE );
  239. }
  240.  
  241.  
  242. BOOL FAR PASCAL _export VBINITCC( USHORT usVersion, BOOL fRunTime )
  243. {
  244.    if( ! VBRegisterModel( hmodDLL, &modelMSel ) )
  245.       return( FALSE );
  246.    if( ! VBRegisterModel( hmodDLL, &modelMCSel ) )
  247.       return( FALSE );
  248.    if( ! VBRegisterModel( hmodDLL, &modelMC ) )
  249.       return( FALSE );
  250.  
  251.    return( TRUE );
  252. }
  253.  
  254.  
  255. LONG FAR PASCAL _export MultSelWndProc( HCTL hCtl, HWND hWnd, USHORT msg, USHORT wParam, LONG lParam )
  256. {
  257.    switch( msg )
  258.    {
  259.       case VBM_LOADED:
  260.       {
  261.          PostMessage( hWnd, WM_USER + 1, 0, NULL );
  262.          return( FALSE );
  263.       }
  264.  
  265.       case WM_USER + 1:
  266.       {
  267.          VBFireEvent( hCtl, 5, NULL );
  268.          return( TRUE );
  269.       }
  270.  
  271.       case WM_USER:
  272.       {
  273.          char str[ 15 ];
  274.          int i;
  275.  
  276.          for( i = 0; i < 40; i++ )
  277.          {
  278.             wsprintf( str, "Item #%d", i + 1 );
  279.             SendMessage( hWnd, LB_INSERTSTRING, -1, (LONG)(LPSTR)str );
  280.          }
  281.          SendMessage( hWnd, WM_SETREDRAW, 1, NULL );
  282.          InvalidateRect( hWnd, NULL, FALSE );
  283.          return( TRUE );
  284.       }
  285.  
  286.       case VBM_CREATED:
  287.       {
  288.          MSEL far *Ms = DEREF( hCtl );
  289.          char str[ 40 ];
  290.          int i;
  291.  
  292.          if( Ms->CellWidth < 1 )
  293.             Ms->CellWidth = 80;
  294.  
  295.          if( VBGetMode() == MODE_DESIGN )
  296.             PostMessage( hWnd, WM_USER, 0, NULL );
  297.  
  298.          VBGetControlName( hCtl, str );
  299.  
  300.          if( str[ 1 ] == 'C' )                                                  /*  If it's a multicolumn box, set column width  */
  301.          {
  302.             SendMessage( hWnd, LB_SETCOLUMNWIDTH, Ms->CellWidth, NULL );
  303.  
  304.             if( str[ 2 ] == 'S' )                                                           /*  Is is a multisel, multicol box?  */
  305.                Ms->Type = 1;
  306.             else
  307.                Ms->Type = 2;
  308.          }
  309.          else
  310.             Ms->Type = 0;
  311.  
  312.          break;
  313.       }
  314.  
  315.       case VBN_COMMAND:
  316.       {
  317.          if( HIWORD( lParam ) == LBN_SELCHANGE || HIWORD( lParam ) == LBN_DBLCLK )
  318.          {
  319.             MSEL far *Ms = DEREF( hCtl );
  320.             CLICKSTRUCT Ck;
  321.             WORD i;
  322.  
  323.             if( Ms->Type == 0 || Ms->Type == 1 )
  324.                i = (WORD)SendMessage( hWnd, LB_GETSELCOUNT, 0, NULL );
  325.             else
  326.                i = (WORD)SendMessage( hWnd, LB_GETCURSEL, 0, NULL );
  327.  
  328.             Ck.Item = (WORD far *)&i;
  329.  
  330.             if( HIWORD( lParam ) == LBN_SELCHANGE )
  331.                VBFireEvent( hCtl, 0, &Ck );
  332.             else
  333.                VBFireEvent( hCtl, 1, &Ck );
  334.          }
  335.          break;
  336.       }
  337.  
  338.       case VBM_METHOD:
  339.          if( wParam == METH_ADDITEM )
  340.          {
  341.             LPPARAM far *lpParams;
  342.  
  343.             lpParams = (LPPARAM far *)lParam;
  344.             if( lpParams->cArgs < 2 )                                                             /*  If no string passed, exit  */
  345.                return( TRUE );
  346.  
  347.             if( lpParams->cArgs == 3 )                                                               /*  If index was passed...  */
  348.                SendMessage( hWnd, LB_INSERTSTRING, (int)lpParams->index, (LONG)VBLockHsz( (HSZ)lpParams->hszItem ) );
  349.             else
  350.                SendMessage( hWnd, LB_INSERTSTRING, 0, (LONG)VBLockHsz( (HSZ)lpParams->hszItem ) );
  351.  
  352.             VBUnlockHsz( (HSZ)lpParams->hszItem );
  353.             return( FALSE );
  354.          }
  355.  
  356.          if( wParam == METH_REMOVEITEM )
  357.          {
  358.             LPPARAM far *lpParams;
  359.  
  360.             lpParams = (LPPARAM far *)lParam;
  361.             if( lpParams->cArgs < 2 )
  362.                return( TRUE );
  363.  
  364.             if( (int)lpParams->hszItem == -1 )
  365.                SendMessage( hWnd, LB_RESETCONTENT, 0, NULL );
  366.             else
  367.                SendMessage( hWnd, LB_DELETESTRING, (int)lpParams->hszItem, NULL );
  368.             return( FALSE );
  369.          }
  370.  
  371.          break;
  372.  
  373.       case VBM_GETPROPERTY:
  374.          if( wParam == PROP_EXTEND )
  375.          {
  376.             MSEL far *Ms = DEREF( hCtl );
  377.  
  378.             *(WORD far *)lParam = Ms->Extend;
  379.             return( FALSE );
  380.          }
  381.  
  382.          if( wParam == PROP_LISTCOUNT )
  383.          {
  384.             int far *item;
  385.  
  386.             item = (int far *)lParam;
  387.             *item = SendMessage( hWnd, LB_GETCOUNT, 0, NULL );
  388.             return( FALSE );
  389.          }
  390.  
  391.          if( wParam == PROP_LISTINDEX )
  392.          {
  393.             int far *item;
  394.             LPDATASTRUCT lpDs = (LPDATASTRUCT)lParam;
  395.  
  396.             item = (int far *)lParam;
  397.             *item = SendMessage( hWnd, LB_GETSEL, lpDs->index[ 0 ].data, NULL );
  398.             if( *item )
  399.                *item = -1;
  400.             else
  401.                *item = 0;
  402.  
  403.             return( FALSE );
  404.          }
  405.  
  406.          if( wParam == PROP_LIST )
  407.          {
  408.             char str[ 256 ];
  409.             LONG i;
  410.             LPDATASTRUCT lpDs = (LPDATASTRUCT)lParam;
  411.  
  412.             i = lpDs->index[ 0 ].data;
  413.             SendMessage( hWnd, LB_GETTEXT, (int)i, (LONG)(LPSTR)str );
  414.             lpDs->data = (LONG)VBCreateHsz( (_segment)hCtl, str );
  415.             return( FALSE );
  416.          }
  417.  
  418.          if( wParam == PROP_REFRESH )
  419.          {
  420.             MSEL far *Ms = DEREF( hCtl );
  421.  
  422.             *(BOOL far *)lParam = Ms->Refresh;
  423.             return( FALSE );
  424.          }
  425.  
  426.          if( wParam == PROP_VERSION )
  427.          {
  428.             *(WORD far *)lParam = 101;
  429.             return( FALSE );
  430.          }
  431.  
  432.          if( wParam == PROP_CELLWIDTH )
  433.          {
  434.             MSEL far *Ms = DEREF( hCtl );
  435.  
  436.             if( ! Ms->Type )
  437.                return( FALSE );
  438.  
  439.             *(WORD far *)lParam = Ms->CellWidth;
  440.             return( FALSE );
  441.          }
  442.          break;
  443.  
  444.       case VBM_SETPROPERTY:
  445.          if( wParam == PROP_EXTEND )
  446.          {
  447.             MODEL far *lpModel;
  448.             MSEL far *Ms = DEREF( hCtl );
  449.  
  450.             lpModel = VBGetControlModel( hCtl );
  451.  
  452.             Ms->Extend = LOWORD( lParam );
  453.  
  454.             if( Ms->Extend )
  455.                lpModel->flWndStyle |= LBS_EXTENDEDSEL;
  456.             else
  457.                lpModel->flWndStyle &= ~LBS_EXTENDEDSEL;
  458.  
  459.             VBRecreateControlHwnd( hCtl );
  460.             if( VBGetMode() == MODE_DESIGN )
  461.                PostMessage( hWnd, WM_USER, 0, NULL );
  462.             return( FALSE );
  463.          }
  464.  
  465.          if( wParam == PROP_LISTINDEX )
  466.          {
  467.             LPDATASTRUCT lpDs = (LPDATASTRUCT)lParam;
  468.             WORD lPm;
  469.  
  470.             lPm = LOWORD( lpDs->data );
  471.  
  472.             if( lpDs->index[ 0 ].data == -1 )
  473.             {
  474.                SendMessage( hWnd, LB_SETSEL, lPm, -1 );
  475.                return( FALSE );
  476.             }
  477.             SendMessage( hWnd, LB_SETSEL, lPm, (int)lpDs->index[ 0 ].data );
  478.             return( FALSE );
  479.          }
  480.  
  481.          if( wParam == PROP_REFRESH )
  482.          {
  483.             MSEL far *Ms = DEREF( hCtl );
  484.  
  485.             Ms->Refresh = (BOOL)lParam;
  486.             SendMessage( hWnd, WM_SETREDRAW, (BOOL)lParam, NULL );
  487.             if( (BOOL)lParam )
  488.                InvalidateRect( hWnd, NULL, FALSE );
  489.  
  490.             return( FALSE );
  491.          }
  492.  
  493.          if( wParam == PROP_CELLWIDTH )
  494.          {
  495.             MSEL far *Ms = DEREF( hCtl );
  496.  
  497.             if( ! Ms->Type )
  498.                return( FALSE );
  499.  
  500.             Ms->CellWidth = LOWORD( lParam );
  501.             SendMessage( hWnd, LB_SETCOLUMNWIDTH, LOWORD( lParam ), NULL );
  502.             InvalidateRect( hWnd, NULL, FALSE );
  503.             return( FALSE );
  504.          }
  505.          break;
  506.    }
  507.    return( VBDefControlProc( hCtl, hWnd, msg, wParam, lParam ) );
  508. }
  509.  
  510.  
  511.