;Autor: klaver EnableExplicit Define wc.WNDCLASSEX Define n wc.WNDCLASSEX\cbSize = SizeOf(WNDCLASSEX) GetClassInfoEx_(GetModuleHandle_(0), @"ComboBox", @wc) Global PrevItm.i, LastKey.i, *Text=AllocateMemory(128), CBCB = wc\lpfnWndProc Procedure ComboProc(hWnd, uMsg, wParam, lParam) Protected OldProc OldProc = GetProp_(hWnd, "MyCB") Select uMsg Case #WM_KEYDOWN LastKey = wParam Case #WM_NCDESTROY RemoveProp_(hWnd, "MyCB") EndSelect ProcedureReturn CallWindowProc_(OldProc, hWnd, uMsg, wParam, lParam) EndProcedure Procedure WinCallback(hWnd, uMsg, wParam, lParam) Protected *lpdis.DRAWITEMSTRUCT Protected Var Protected i Select uMsg Case #WM_DRAWITEM *lpdis.DRAWITEMSTRUCT = lParam : SetBkMode_(*lpdis\hDC, #TRANSPARENT) If *lpdis\CtlType = #ODT_COMBOBOX If *lpdis\itemState & #ODS_SELECTED If CallWindowProc_(CBCB, *lpdis\hwndItem, #CB_GETITEMDATA, *lpdis\itemID, 0);SendMessage_() *lpdis\CtlType = GetSysColorBrush_(#COLOR_BTNFACE) Else *lpdis\CtlType = GetSysColorBrush_(#COLOR_HIGHLIGHT) EndIf Else *lpdis\CtlType = GetSysColorBrush_(#COLOR_WINDOW) EndIf FillRect_(*lpdis\hDC, *lpdis\rcItem, *lpdis\CtlType) : *lpdis\rcItem\left+4 CallWindowProc_(CBCB, *lpdis\hwndItem, #CB_GETLBTEXT, *lpdis\itemID, *Text);SendMessage_() If CallWindowProc_(CBCB, *lpdis\hwndItem, #CB_GETITEMDATA, *lpdis\itemID, 0);SendMessage_() SetTextColor_(*lpdis\hDC, #Gray);GetSysColor_(#COLOR_GRAYTEXT) EndIf DrawText_(*lpdis\hDC, *Text, -1, *lpdis\rcItem, #DT_NOCLIP|#DT_VCENTER|#DT_SINGLELINE) SetTextColor_(*lpdis\hDC, GetSysColor_(#COLOR_WINDOWTEXT)) EndIf Case #WM_COMMAND Select (wParam>>16) & $FFFF;HIWORD Case #CBN_SELCHANGE Var = CallWindowProc_(CBCB, lParam, #CB_GETCURSEL, 0, 0);SendMessage_() If Var <> PrevItm If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, Var, 0);SendMessage_() If LastKey = 38 Or LastKey = 37 For i=Var-1 To 0 Step -1 If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False PrevItm = i : Break EndIf Next ElseIf LastKey = 40 Or LastKey = 39 For i=Var+1 To CallWindowProc_(CBCB, lParam, #CB_GETCOUNT, 0, 0)-1 If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False PrevItm = i : Break EndIf Next EndIf CallWindowProc_(CBCB, lParam, #CB_SETCURSEL, PrevItm, 0);SendMessage_() Else PrevItm = Var EndIf EndIf Case #CBN_DROPDOWN LastKey = 0 EndSelect EndSelect ProcedureReturn #PB_ProcessPureBasicEvents EndProcedure If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) ComboBoxGadget(1,10,10,200,20,#CBS_OWNERDRAWFIXED) For n=1 To 10 AddGadgetItem(1,-1,"ComboBox Item "+Str(n),0,0) Next SendMessage_(GadgetID(1), #CB_SETITEMDATA, 3, #True);DISABLE ITEM SendMessage_(GadgetID(1), #CB_SETITEMDATA, 4, #True);DISABLE ITEM SendMessage_(GadgetID(1), #CB_SETITEMDATA, 9, #True);DISABLE ITEM SetProp_(GadgetID(1), "MyCB", SetWindowLong_(GadgetID(1), #GWL_WNDPROC, @ComboProc())) SetWindowCallback(@WinCallback(), 0) SetGadgetState(1,0) Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow EndIf