'===========================================================================
' Subject: List Box in PBCC                   Date: 12-22-02 (  :  )       
'  Author: Jerry_Fielden                      Code: PBCC                   
'  Origin: fielden@pldi.net                 Packet: PBCC.ABC
'===========================================================================
'Jerry_Fielden Email:  fielden@pldi.net 
'PBCC ListBox
'PBCC

#COMPILE EXE 
   #REGISTER NONE 
   #INCLUDE "C:\PBDLL61\WinAPI\win32api.inc" 
    GLOBAL sText AS STRING 
 
         ' Create Main window 
   FUNCTION DialogNew (hWndParent AS DWORD, Title AS ASCIIZ, x AS LONG, _ 
  y AS LONG, cx AS LONG, cy AS LONG, style AS DWORD, _ 
  exStyle AS DWORD, lpDlgProc AS DWORD) AS LONG 
 
 LOCAL hDlg AS DWORD 
 DIM sDlgTemplateEx AS STRING 
 sDlgTemplateEx = MKWRD$(1) + MKWRD$(&HFFFF) + MKDWD$(0) + _ 
    MKDWD$(exStyle) + MKDWD$(style OR %DS_SETFONT OR %DS_FIXEDSYS) _ 
    + MKWRD$(0) + MKI$(x) + MKI$(y) + MKI$(cx) + MKI$(cy) + MKI$(0) + MKI$(0) 
 FUNCTION = DialogBoxIndirectParam (GetModuleHandle(""), _ 
 BYVAL STRPTR(sDlgTemplateEx), hWndParent, lpDlgProc, 0) 
 
   END FUNCTION 
 
         ' Create Child windows 
   FUNCTION ControlAdd (lpClassName AS ASCIIZ, hDlg AS DWORD, Id AS LONG, _ 
    Title AS ASCIIZ, x AS LONG, y AS LONG, _ 
 cx AS LONG, cy AS LONG, style AS DWORD, exStyle AS DWORD) AS DWORD 
 
 LOCAL rc AS RECT, hWnd AS DWORD   ' Window sizes 
 rc.nLeft = x: rc.nRight = x + cx 
 rc.nTop = y: rc.nBottom = y + cy 
 MapDialogRect hDlg, rc 
          ' Create and get handle 
 hWnd = CreateWindowEx (exStyle, lpClassName, Title, style, rc.nLeft, _ 
 rc.nTop, rc.nRight - rc.nLeft,  rc.nBottom - rc.nTop, hDlg, Id, _ 
 GetModuleHandle(""), BYVAL 0) 
   END FUNCTION 
 
 
   FUNCTION DlgProc (BYVAL hDlg AS DWORD, BYVAL wMsg AS DWORD, BYVAL wParam _ 
 AS DWORD, BYVAL lParam AS LONG) AS LONG 
 
 LOCAL x AS LONG, hLbox AS LONG, nLength AS LONG, nIndex AS LONG 
 DIM arr(0:15) AS STRING, hCBox AS LONG 
 
 IF wMsg = %WM_INITDIALOG THEN     ' Initialize child window, Label 
  ControlAdd "static" , hDlg, 104, "Click on a Color", 30, 4, 60, 12, _ 
       %WS_CHILD OR %WS_VISIBLE , 0 
               ' a Button 
  ControlAdd "Button", hDlg, %IDOK, "&Ok", 30, 175, 50, 12, %WS_CHILD _ 
       OR %WS_VISIBLE OR %WS_TABSTOP OR %BS_PUSHBUTTON, 0 
               ' a ListBox 
  ControlAdd "ListBox", hDlg, 105, "", 22, 18, 68, 60, _ 
       %WS_CHILD OR %WS_TABSTOP OR %WS_VISIBLE OR %LBS_NOTIFY OR _ 
       %LBS_HASSTRINGS OR %LBS_USETABSTOPS, %WS_EX_CLIENTEDGE 
               ' a Combo Box 
  ControlAdd "ComboBox", hDlg, 106, "The Rest", 22, 80, 68, 100,  _ 
       %WS_CHILD OR %WS_TABSTOP OR %WS_VISIBLE OR %CBS_DROPDOWN OR _ 
       %CBS_AUTOHSCROLL OR %CBS_HASSTRINGS, 0 
 
 
   arr(0)  = "0 Black"   : arr(1)  = "1 Blue" 
   arr(2)  = "2 Green"   : arr(3)  = "3 Cyan" 
   arr(4)  = "4 Red"     : arr(5)  = "5 Magenta" 
   arr(6)  = "6 Brown"   : arr(7)  = "7 Light Gray" 
   arr(8)  = "8 Gray"    : arr(9)  = "9 Light Blue" 
   arr(10) = "10 Light Green" : arr(11) = "11 Light Cyan" 
   arr(12) = "12 Light Red"   : arr(13) = "13 Light Magenta" 
   arr(14) = "14 Yellow" : arr(15) = "15 Bright White" 
 
   FOR x = 0 TO 15      ' Load Array into boxes 
     IF x < 7 THEN      ' Load half in Listbox 
    hLBox = GetDlgItem( hDlg, 105 ) 
    SendMessage hLBox, %LB_ADDSTRING, 0, STRPTR(arr(x)) 
     ELSE 
    hCBox = GetDlgItem( hDlg, 106 )     ' and half in Combo box 
    SendMessage hCBox, %CB_ADDSTRING, 0, STRPTR(arr(x)) 
     END IF 
 
   NEXT x 
   SendMessage hCBox, %CB_SETCURSEL, 0, 0    ' Get Combo default text 
   GOSUB GetComboText 
 
   SetForegroundWindow hDlg 
 
 ELSEIF wMsg = %WM_COMMAND THEN     ' End the Dialog 
   IF HIWRD(wParam) = %Bn_CLICKED AND LOWRD(wParam) = %IDOK THEN 
    EndDialog hDlg, 0 
           ' Get selected ListBox text 
   ELSEIF LOWRD(wParam) = 105 AND HIWRD(wParam) = %LBN_SELCHANGE THEN 
       hLBox = GetDlgItem( hDlg, 105 ) 
       nIndex = SendMessage( hLBox, %LB_GETCURSEL, 0, BYVAL 0& ) 
       IF nIndex < 0 THEN EXIT FUNCTION 
       nLength = SendMessage( hLBox, %LB_GETTEXTLEN, nIndex, BYVAL 0& ) 
       IF nLength < 1 THEN EXIT FUNCTION 
       sText = STRING$( nLength, 0 ) 
       SendMessage hLBox, %LB_GETTEXT, nIndex, BYVAL STRPTR( sText ) 
       MessageBox GetActiveWindow(), BYVAL STRPTR( sText ),"You picked", 0 OR %MB_TASKMODAL 
             ' Get selected Combo text 
   ELSEIF LOWRD(wParam) = 106 AND HIWRD(wParam) = %CBN_SELCHANGE THEN 
       GOSUB GetComboText 
       MessageBox GetActiveWindow(), BYVAL STRPTR( sText ),"You picked", 0 OR %MB_TASKMODAL 
  END IF 
 ELSEIF wMsg = %WM_CLOSE  THEN 
   EndDialog hDlg,0 
 END IF 
 
 EXIT FUNCTION 
 
 GetComboText: 
    hCBox = GetDlgItem( hDlg, 106 ) 
    nIndex = SendMessage( hCBox, %CB_GETCURSEL, 0, BYVAL 0& ) 
    IF nIndex < 0 THEN EXIT FUNCTION 
    nLength = SendMessage( hCBox, %CB_GETLBTEXTLEN, nIndex&, BYVAL 0& ) 
    IF nLength < 1 THEN EXIT FUNCTION 
    sText = STRING$( nLength, 0 ) 
    SendMessage hCBox,  %CB_GETLBTEXT, nIndex, BYVAL STRPTR( sText ) 
 RETURN 
 
  END FUNCTION 
 
 
  FUNCTION PBMAIN AS LONG 
     LOCAL sTitle AS STRING , nStyle AS LONG 
 
     CALL DialogNew (0, "", 0, 0, 110, 200, %DS_MODALFRAME OR %DS_CENTER OR _ 
     %WS_VISIBLE OR %WS_OVERLAPPEDWINDOW, 0, CODEPTR(DlgProc)) 
 
     COLOR 4, VAL(LEFT$(sText, 2)) : CLS 
 
     IF sText <> "" THEN sText = MID$(sText,3 ) 
     IF sText = "" THEN sText = " You picked nothing "  ELSE sText = _ 
     "Your final Pick is " & sText : sTitle = "   It looks like" 
 
     MessageBox GetActiveWindow(), BYVAL STRPTR( sText ), BYVAL STRPTR( sTitle ), nStyle OR %MB_TASKMODAL 
 
  END FUNCTION 
