The following fleshes out the variable names, prunes unused variables and code, reverses the state of selected items when the toggle key is clicked, (rather than just selecting or deselecting all items) and extracts the selected items just before exiting. Thanks for techniques from Chris B. and Borje H.
Code:
#COMPILE EXE #DIM ALL #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF MACRO NomClickToggle = 1001 MACRO NomCheckList = 1002 MACRO TRUE = -1 ' PowerBasic Version of the truth MACRO API_TRUE = 1 ' MicroSoft API Version of the truth MACRO FALSE = 0 ' Something everyone can agree upon '============================================================================================================================ FUNCTION PBMAIN() ShowCHECKLIST %HWND_DESKTOP END FUNCTION '============================================================================================================================ CALLBACK FUNCTION CallbackChecklist() DIM ItemIndex AS LONG DIM ItemCount AS STATIC LONG ItemCount = 20 REDIM ItemLabel(ItemCount) AS STATIC STRING SELECT CASE CB.MSG CASE %WM_INITDIALOG : GOSUB LoadChecklistDialog CASE %WM_CTLCOLORLISTBOX : GOSUB GetListboxColor CASE %WM_COMMAND : GOSUB ProcessWindowsCommand CASE %WM_DRAWITEM : GOSUB ProcessDrawMessage CASE %WM_DESTROY : GOSUB KillChecklistDialog END SELECT EXIT FUNCTION ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LoadChecklistDialog: FOR ItemIndex = 01 TO ItemCount ItemLabel( ItemIndex ) = "Item " + STR$( ItemIndex ) LISTBOX ADD CB.HNDL, NomCheckList, ItemLabel( ItemIndex ) NEXT ItemIndex RETURN ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GetListboxColor: IF CB.LPARAM = GetDlgItem( CB.HNDL, NomCheckList ) THEN FUNCTION = GetSysColorBrush( %COLOR_MENU ) RETURN ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ProcessWindowsCommand: SELECT CASE CB.CTL CASE NomClickToggle : GOSUB ProcessToggleClick END SELECT RETURN ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ProcessToggleClick: DIM FlagToggle AS LONG FlagToggle = TRUE CALL ChecklistCheckAll( CB.HNDL, NomCheckList, FlagToggle ) RETURN ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ProcessDrawMessage: IF (CB.WPARAM = NomCheckList) THEN ChecklistDrawItem GetDlgItem(CB.HNDL, NomCheckList), CB.WPARAM, CB.LPARAM END IF RETURN ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - KillChecklistDialog: LOCAL CountSelected AS LONG LOCAL LimitSelected AS LONG LOCAL IndexSelected AS LONG LOCAL TextLength AS LONG LOCAL TagChecklist AS DWORD LOCAL ItemText AS STRING LOCAL Result AS STRING TagChecklist = GetDlgItem( CB.HNDL, NomChecklist ) CountSelected = SendMessage( TagChecklist, %LB_GETSELCOUNT, 0, 0 ) IF CountSelected > 0 AND CountSelected <> %LB_ERR THEN LimitSelected = CountSelected - 1 REDIM ItemsSelected( LimitSelected ) AS LONG SendMessage( TagChecklist, %LB_GETSELITEMS, CountSelected, VARPTR( ItemsSelected(0) ) ) Result = "" FOR IndexSelected = 0 TO LimitSelected TextLength = SendMessage( TagChecklist, %LB_GETTEXTLEN, ItemsSelected(IndexSelected), 0 ) ItemText = SPACE$( TextLength ) SendMessage( TagChecklist, %LB_GETTEXT, ItemsSelected(IndexSelected), STRPTR( ItemText ) ) Result &= ItemText & $CRLF NEXT IndexSelected MSGBOX Result ELSE MSGBOX "No items were selected" END IF RETURN ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - END FUNCTION '---------------------------------------------------------------------------------------------------------------------------- FUNCTION ChecklistDrawItem( BYVAL TagWindow AS LONG, _ BYVAL wParam AS LONG, _ BYVAL lParam AS LONG _ ) AS LONG DIM ItemBox AS RECT DIM ItemIndex AS LONG DIM ItemText AS ASCIIZ * 64 DIM ItemGroup AS DRAWITEMSTRUCT PTR DIM ItemState AS LONG ItemGroup = lParam IF @ItemGroup.itemID = &HFFFFFFFF& THEN EXIT FUNCTION SELECT CASE @ItemGroup.itemAction CASE %ODA_DRAWENTIRE, %ODA_SELECT : GOSUB DrawListboxRow END SELECT EXIT FUNCTION ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DrawListboxRow: ' DRAW BACKGROUND FillRect @ItemGroup.hDC, @ItemGroup.rcItem, GetSysColorBrush( %COLOR_MENU ) ' DRAW TEXT SetBkColor @ItemGroup.hDC, GetSysColor( %COLOR_MENU ) ' Set text Background SetTextColor @ItemGroup.hDC, GetSysColor( %COLOR_INFOTEXT ) ' Set text color SendMessage TagWindow, %LB_GETTEXT, @ItemGroup.itemID, VARPTR(ItemText) ' Get text TextOut @ItemGroup.hDC, 18, @ItemGroup.rcItem.ntop + 2, ItemText, LEN(ItemText) ' Draw text ' DRAW CHECKBOX ItemBox.nLeft = 2 ItemBox.nRight = 15 ItemBox.ntop = @ItemGroup.rcItem.ntop + 2 ItemBox.nbottom = @ItemGroup.rcItem.nbottom - 1 ItemState = SendMessage ( TagWindow, %LB_GETSEL, @ItemGroup.itemID, 0 ) IF ISTRUE ItemState THEN DrawFrameControl @ItemGroup.hDC, ItemBox, %DFC_BUTTON, %DFCS_BUTTONCHECK OR %DFCS_CHECKED ELSE DrawFrameControl @ItemGroup.hDC, ItemBox, %DFC_BUTTON, %DFCS_BUTTONCHECK END IF FUNCTION = -1 RETURN ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - END FUNCTION '---------------------------------------------------------------------------------------------------------------------------- SUB ChecklistCheckAll( TagWindow AS LONG, NomListbox AS LONG, FlagToggle AS LONG) DIM ItemIndex AS LONG DIM ItemCount AS LONG DIM ItemLimit AS LONG DIM ItemState AS LONG DIM TagChecklist AS LONG GetDlgItem TagWindow, NomListbox TO TagChecklist SendMessage TagChecklist, %LB_GETCOUNT, 0, 0 TO ItemCount ItemLimit = ItemCount - 1 FOR ItemIndex = 0 TO ItemLimit ItemState = SendMessage( TagChecklist, %LB_GETSEL, ItemIndex, 0 ) IF ISTRUE FlagToggle THEN IF ISTRUE ItemState THEN ItemState = FALSE ELSE ItemState = API_TRUE END IF END IF SendMessage TagChecklist, %LB_SETSEL, ItemState, ItemIndex NEXT ItemIndex UpdateWindow TagChecklist END SUB '---------------------------------------------------------------------------------------------------------------------------- FUNCTION ShowChecklist( BYVAL TagParent AS DWORD ) AS LONG LOCAL Result AS LONG LOCAL TagChecklist AS DWORD LOCAL ChecklistStyle1, ChecklistStyle2, ListBoxStyle1, ListBoxStyle2 AS LONG ChecklistStyle1 = %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR %WS_VISIBLE OR _ %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT ChecklistStyle2 = %WS_EX_WINDOWEDGE OR %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR ListBoxStyle1 = %WS_CHILD OR %LBS_OWNERDRAWFIXED OR %LBS_HASSTRINGS OR %WS_TABSTOP OR %LBS_DISABLENOSCROLL OR _ %WS_VSCROLL OR %WS_VISIBLE OR %LBS_MULTIPLESEL ListBoxStyle2 = %WS_EX_CLIENTEDGE DIALOG NEW TagParent, "Checklist", 266, 222, 276, 171, ChecklistStyle1, ChecklistStyle2 TO TagChecklist CONTROL ADD BUTTON, TagChecklist, NomClickToggle, "Toggle", 5, 5 , 55, 15 CONTROL ADD LISTBOX, TagChecklist, NomCheckList, , 5, 25, 265, 140, ListBoxStyle1, ListBoxStyle2 DIALOG SHOW MODAL TagChecklist, CALL CallbackChecklist TO Result FUNCTION = Result END FUNCTION '----------------------------------------------------------------------------------------------------------------------------
Leave a comment: