home *** CD-ROM | disk | FTP | other *** search
- #include "windows.h"
- #include "vbapi.h"
-
- LONG FAR PASCAL _export MultSelWndProc( HCTL, HWND, USHORT, USHORT, LONG );
-
- typedef struct {
- long cArgs;
- long hszItem;
- long index;
- } LPPARAM;
-
- typedef struct {
- WORD far *Item;
- LPVOID Index;
- } CLICKSTRUCT;
-
-
- typedef struct {
- WORD Refresh;
- WORD CellWidth;
- int Type, Extend;
- } MSEL;
-
- #define DEREF(hctl) ((MSEL far *)VBDerefControl(hctl))
-
- HANDLE hmodDLL;
-
- PROPINFO piExtend =
- {
- "ExtendedSel",
- DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
- 0, 0, NULL, 0
- };
-
- PROPINFO piListCount =
- {
- "ListCount",
- DT_SHORT | PF_fGetMsg | PF_fNoRuntimeW | PF_fNoShow,
- 0, 0
- };
-
- PROPINFO piListIndex =
- {
- "Select",
- DT_SHORT | PF_fGetMsg | PF_fSetMsg | PF_fPropArray | PF_fNoShow,
- 2, 0
- };
-
- PROPINFO piList =
- {
- "List",
- DT_HSZ | PF_fGetMsg | PF_fPropArray | PF_fNoShow,
- 4, 0
- };
-
- PROPINFO piRefresh =
- {
- "Update",
- DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
- 0, 0, NULL, 0
- };
-
- PROPINFO piCellWidth =
- {
- "CellWidth",
- DT_SHORT | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
- 0, 0, NULL, 0
- };
-
- PROPINFO piVersion =
- {
- "Version",
- DT_SHORT | PF_fGetMsg,
- 0, 0, NULL, 0
- };
-
- PPROPINFO proplistMSel[] =
- {
- PPROPINFO_STD_CTLNAME,
- PPROPINFO_STD_INDEX,
- PPROPINFO_STD_BACKCOLOR,
- PPROPINFO_STD_FORECOLOR,
- PPROPINFO_STD_BORDERSTYLEON,
- PPROPINFO_STD_LEFT,
- PPROPINFO_STD_TOP,
- PPROPINFO_STD_WIDTH,
- PPROPINFO_STD_HEIGHT,
- PPROPINFO_STD_ENABLED,
- PPROPINFO_STD_VISIBLE,
- PPROPINFO_STD_FONTNAME,
- PPROPINFO_STD_FONTSIZE,
- PPROPINFO_STD_FONTBOLD,
- PPROPINFO_STD_FONTITALIC,
- PPROPINFO_STD_FONTSTRIKE,
- PPROPINFO_STD_FONTUNDER,
- PPROPINFO_STD_DRAGMODE,
- PPROPINFO_STD_DRAGICON,
- PPROPINFO_STD_TABINDEX,
- PPROPINFO_STD_TABSTOP,
- PPROPINFO_STD_TAG,
- &piListCount,
- &piListIndex,
- &piList,
- &piRefresh,
- &piVersion,
- &piExtend,
- NULL
- };
-
- PPROPINFO proplistMC[] =
- {
- PPROPINFO_STD_CTLNAME,
- PPROPINFO_STD_INDEX,
- PPROPINFO_STD_BACKCOLOR,
- PPROPINFO_STD_FORECOLOR,
- PPROPINFO_STD_BORDERSTYLEON,
- PPROPINFO_STD_LEFT,
- PPROPINFO_STD_TOP,
- PPROPINFO_STD_WIDTH,
- PPROPINFO_STD_HEIGHT,
- PPROPINFO_STD_ENABLED,
- PPROPINFO_STD_VISIBLE,
- PPROPINFO_STD_FONTNAME,
- PPROPINFO_STD_FONTSIZE,
- PPROPINFO_STD_FONTBOLD,
- PPROPINFO_STD_FONTITALIC,
- PPROPINFO_STD_FONTSTRIKE,
- PPROPINFO_STD_FONTUNDER,
- PPROPINFO_STD_DRAGMODE,
- PPROPINFO_STD_DRAGICON,
- PPROPINFO_STD_TABINDEX,
- PPROPINFO_STD_TABSTOP,
- PPROPINFO_STD_TAG,
- &piListCount,
- &piListIndex,
- &piList,
- &piRefresh,
- &piVersion,
- &piExtend,
- &piCellWidth,
- NULL
- };
-
- #define PROP_LISTCOUNT 22
- #define PROP_LISTINDEX 23
- #define PROP_LIST 24
- #define PROP_REFRESH 25
- #define PROP_VERSION 26
- #define PROP_EXTEND 27
- #define PROP_CELLWIDTH 28 /* Always at end of list */
-
- WORD Click_Params[] = { ET_I2 };
-
- EVENTINFO Event_Click =
- {
- "Click", 1, 2, Click_Params, "Item as Integer"
- };
-
- EVENTINFO Event_DblClk =
- {
- "DblClk", 1, 2, Click_Params, "Item as Integer"
- };
-
- EVENTINFO Event_Load =
- {
- "Loaded", 0, 0, NULL, NULL
- };
-
-
- PEVENTINFO eventlistMSel[] =
- {
- &Event_Click,
- &Event_DblClk,
- PEVENTINFO_STD_DRAGDROP,
- PEVENTINFO_STD_DRAGOVER,
- PEVENTINFO_STD_GOTFOCUS,
- &Event_Load,
- PEVENTINFO_STD_LOSTFOCUS,
- PEVENTINFO_STD_KEYDOWN,
- PEVENTINFO_STD_KEYPRESS,
- PEVENTINFO_STD_KEYUP,
- NULL
- };
-
-
- MODEL modelMSel =
- {
- VB_VERSION,
- MODEL_fFocusOk | MODEL_fArrows | MODEL_fLoadMsg,
- (PCTLPROC)MultSelWndProc,
- NULL,
- WS_BORDER | WS_CHILD | LBS_MULTIPLESEL | LBS_NOTIFY | WS_VSCROLL | LBS_NOINTEGRALHEIGHT,
- sizeof(MSEL),
- 8000,
- "MSList",
- "MSList",
- "ListBox",
- proplistMSel,
- eventlistMSel
- };
-
-
- MODEL modelMCSel =
- {
- VB_VERSION,
- MODEL_fFocusOk | MODEL_fArrows | MODEL_fLoadMsg,
- (PCTLPROC)MultSelWndProc,
- NULL,
- WS_BORDER | WS_CHILD | LBS_MULTIPLESEL | LBS_NOTIFY | WS_VSCROLL | LBS_MULTICOLUMN | LBS_NOINTEGRALHEIGHT,
- sizeof(MSEL),
- 8010,
- "MCSList",
- "MCSList",
- "ListBox",
- proplistMC,
- eventlistMSel
- };
-
- MODEL modelMC =
- {
- VB_VERSION,
- MODEL_fFocusOk | MODEL_fArrows | MODEL_fLoadMsg,
- (PCTLPROC)MultSelWndProc,
- NULL,
- WS_BORDER | WS_CHILD | LBS_NOTIFY | LBS_MULTICOLUMN | WS_VSCROLL | LBS_NOINTEGRALHEIGHT,
- sizeof(MSEL),
- 8020,
- "MCList",
- "MCList",
- "ListBox",
- proplistMC,
- eventlistMSel
- };
-
- BOOL FAR PASCAL LibMain( HANDLE hmod, HANDLE segDS, USHORT cbHeapSize )
- {
- hmodDLL = hmod;
- return( TRUE );
- }
-
-
- BOOL FAR PASCAL _export VBINITCC( USHORT usVersion, BOOL fRunTime )
- {
- if( ! VBRegisterModel( hmodDLL, &modelMSel ) )
- return( FALSE );
- if( ! VBRegisterModel( hmodDLL, &modelMCSel ) )
- return( FALSE );
- if( ! VBRegisterModel( hmodDLL, &modelMC ) )
- return( FALSE );
-
- return( TRUE );
- }
-
-
- LONG FAR PASCAL _export MultSelWndProc( HCTL hCtl, HWND hWnd, USHORT msg, USHORT wParam, LONG lParam )
- {
- switch( msg )
- {
- case VBM_LOADED:
- {
- PostMessage( hWnd, WM_USER + 1, 0, NULL );
- return( FALSE );
- }
-
- case WM_USER + 1:
- {
- VBFireEvent( hCtl, 5, NULL );
- return( TRUE );
- }
-
- case WM_USER:
- {
- char str[ 15 ];
- int i;
-
- for( i = 0; i < 40; i++ )
- {
- wsprintf( str, "Item #%d", i + 1 );
- SendMessage( hWnd, LB_INSERTSTRING, -1, (LONG)(LPSTR)str );
- }
- SendMessage( hWnd, WM_SETREDRAW, 1, NULL );
- InvalidateRect( hWnd, NULL, FALSE );
- return( TRUE );
- }
-
- case VBM_CREATED:
- {
- MSEL far *Ms = DEREF( hCtl );
- char str[ 40 ];
- int i;
-
- if( Ms->CellWidth < 1 )
- Ms->CellWidth = 80;
-
- if( VBGetMode() == MODE_DESIGN )
- PostMessage( hWnd, WM_USER, 0, NULL );
-
- VBGetControlName( hCtl, str );
-
- if( str[ 1 ] == 'C' ) /* If it's a multicolumn box, set column width */
- {
- SendMessage( hWnd, LB_SETCOLUMNWIDTH, Ms->CellWidth, NULL );
-
- if( str[ 2 ] == 'S' ) /* Is is a multisel, multicol box? */
- Ms->Type = 1;
- else
- Ms->Type = 2;
- }
- else
- Ms->Type = 0;
-
- break;
- }
-
- case VBN_COMMAND:
- {
- if( HIWORD( lParam ) == LBN_SELCHANGE || HIWORD( lParam ) == LBN_DBLCLK )
- {
- MSEL far *Ms = DEREF( hCtl );
- CLICKSTRUCT Ck;
- WORD i;
-
- if( Ms->Type == 0 || Ms->Type == 1 )
- i = (WORD)SendMessage( hWnd, LB_GETSELCOUNT, 0, NULL );
- else
- i = (WORD)SendMessage( hWnd, LB_GETCURSEL, 0, NULL );
-
- Ck.Item = (WORD far *)&i;
-
- if( HIWORD( lParam ) == LBN_SELCHANGE )
- VBFireEvent( hCtl, 0, &Ck );
- else
- VBFireEvent( hCtl, 1, &Ck );
- }
- break;
- }
-
- case VBM_METHOD:
- if( wParam == METH_ADDITEM )
- {
- LPPARAM far *lpParams;
-
- lpParams = (LPPARAM far *)lParam;
- if( lpParams->cArgs < 2 ) /* If no string passed, exit */
- return( TRUE );
-
- if( lpParams->cArgs == 3 ) /* If index was passed... */
- SendMessage( hWnd, LB_INSERTSTRING, (int)lpParams->index, (LONG)VBLockHsz( (HSZ)lpParams->hszItem ) );
- else
- SendMessage( hWnd, LB_INSERTSTRING, 0, (LONG)VBLockHsz( (HSZ)lpParams->hszItem ) );
-
- VBUnlockHsz( (HSZ)lpParams->hszItem );
- return( FALSE );
- }
-
- if( wParam == METH_REMOVEITEM )
- {
- LPPARAM far *lpParams;
-
- lpParams = (LPPARAM far *)lParam;
- if( lpParams->cArgs < 2 )
- return( TRUE );
-
- if( (int)lpParams->hszItem == -1 )
- SendMessage( hWnd, LB_RESETCONTENT, 0, NULL );
- else
- SendMessage( hWnd, LB_DELETESTRING, (int)lpParams->hszItem, NULL );
- return( FALSE );
- }
-
- break;
-
- case VBM_GETPROPERTY:
- if( wParam == PROP_EXTEND )
- {
- MSEL far *Ms = DEREF( hCtl );
-
- *(WORD far *)lParam = Ms->Extend;
- return( FALSE );
- }
-
- if( wParam == PROP_LISTCOUNT )
- {
- int far *item;
-
- item = (int far *)lParam;
- *item = SendMessage( hWnd, LB_GETCOUNT, 0, NULL );
- return( FALSE );
- }
-
- if( wParam == PROP_LISTINDEX )
- {
- int far *item;
- LPDATASTRUCT lpDs = (LPDATASTRUCT)lParam;
-
- item = (int far *)lParam;
- *item = SendMessage( hWnd, LB_GETSEL, lpDs->index[ 0 ].data, NULL );
- if( *item )
- *item = -1;
- else
- *item = 0;
-
- return( FALSE );
- }
-
- if( wParam == PROP_LIST )
- {
- char str[ 256 ];
- LONG i;
- LPDATASTRUCT lpDs = (LPDATASTRUCT)lParam;
-
- i = lpDs->index[ 0 ].data;
- SendMessage( hWnd, LB_GETTEXT, (int)i, (LONG)(LPSTR)str );
- lpDs->data = (LONG)VBCreateHsz( (_segment)hCtl, str );
- return( FALSE );
- }
-
- if( wParam == PROP_REFRESH )
- {
- MSEL far *Ms = DEREF( hCtl );
-
- *(BOOL far *)lParam = Ms->Refresh;
- return( FALSE );
- }
-
- if( wParam == PROP_VERSION )
- {
- *(WORD far *)lParam = 101;
- return( FALSE );
- }
-
- if( wParam == PROP_CELLWIDTH )
- {
- MSEL far *Ms = DEREF( hCtl );
-
- if( ! Ms->Type )
- return( FALSE );
-
- *(WORD far *)lParam = Ms->CellWidth;
- return( FALSE );
- }
- break;
-
- case VBM_SETPROPERTY:
- if( wParam == PROP_EXTEND )
- {
- MODEL far *lpModel;
- MSEL far *Ms = DEREF( hCtl );
-
- lpModel = VBGetControlModel( hCtl );
-
- Ms->Extend = LOWORD( lParam );
-
- if( Ms->Extend )
- lpModel->flWndStyle |= LBS_EXTENDEDSEL;
- else
- lpModel->flWndStyle &= ~LBS_EXTENDEDSEL;
-
- VBRecreateControlHwnd( hCtl );
- if( VBGetMode() == MODE_DESIGN )
- PostMessage( hWnd, WM_USER, 0, NULL );
- return( FALSE );
- }
-
- if( wParam == PROP_LISTINDEX )
- {
- LPDATASTRUCT lpDs = (LPDATASTRUCT)lParam;
- WORD lPm;
-
- lPm = LOWORD( lpDs->data );
-
- if( lpDs->index[ 0 ].data == -1 )
- {
- SendMessage( hWnd, LB_SETSEL, lPm, -1 );
- return( FALSE );
- }
- SendMessage( hWnd, LB_SETSEL, lPm, (int)lpDs->index[ 0 ].data );
- return( FALSE );
- }
-
- if( wParam == PROP_REFRESH )
- {
- MSEL far *Ms = DEREF( hCtl );
-
- Ms->Refresh = (BOOL)lParam;
- SendMessage( hWnd, WM_SETREDRAW, (BOOL)lParam, NULL );
- if( (BOOL)lParam )
- InvalidateRect( hWnd, NULL, FALSE );
-
- return( FALSE );
- }
-
- if( wParam == PROP_CELLWIDTH )
- {
- MSEL far *Ms = DEREF( hCtl );
-
- if( ! Ms->Type )
- return( FALSE );
-
- Ms->CellWidth = LOWORD( lParam );
- SendMessage( hWnd, LB_SETCOLUMNWIDTH, LOWORD( lParam ), NULL );
- InvalidateRect( hWnd, NULL, FALSE );
- return( FALSE );
- }
- break;
- }
- return( VBDefControlProc( hCtl, hWnd, msg, wParam, lParam ) );
- }
-
-
-