Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Combo/list box with icons/bmp/jpg/gif
Function CB_DrawImages
Copy      Help
function# hDlg message wParam lParam ctrlId $icons [flags] [imgWidth] [imgHeight] [dtFlags] ;;flags: 1 listbox (default combobox), 16 not icons (bmp, jpg, gif)

;Adds icons or bmp/jpg/gif images to a combo box or list box.

;This is what you have to do to create a combo or list box with icons or images:
;1. The dialog must be a smart dialog, ie with dialog function.
;2. In the dialog editor, add a combo or list box.
;3. In the Styles dialog:
;;;;For combo box, select CBS_OWNERDRAWFIXED and CBS_HASSTRINGS styles. Make sure that CBS_SORT is not selected (sorted combo boxes are not supported).
;;;;For list box, select LBS_OWNERDRAWFIXED and LBS_HASSTRINGS styles. Make sure that LBS_SORT is not selected (sorted list boxes are not supported).
;4. In the dialog function, insert CB_DrawImages before 'sel messages' line.

;hDlg, message, wParam, lParam - hDlg, message, wParam, lParam.
;ctrlId - combo/list box id.
;icons - list of icon files. If flag 16 used, list of image files of type bmp, jpg or gif.
;imgWidth, imgHeight - width and height of images. Default: 16 pixels.
;dtFlags - DrawText flags. Documented in the MSDN Library on the Internet. Xored with DT_NOPREFIX.

int i n il hi hb hcb; str s
hcb=id(ctrlId hDlg)
if(!imgWidth) imgWidth=16
if(!imgHeight) imgHeight=16

sel message
,SendMessage hcb iif(flags&1 LB_SETITEMHEIGHT CB_SETITEMHEIGHT) 0 imgHeight+2
,il=ImageList_Create(imgWidth imgHeight ILC_MASK|ILC_COLOR32 0 n)
,for(i 0 n)
,,s.getl(icons -i)
,,,hb=LoadPictureFile(s 0); if(!hb) goto g1
,,,ImageList_Add(il hb 0)
,,,if(hb) DeleteObject hb
,,,hi=GetFileIcon(s 0 (imgWidth>=24 or imgHeight>=24))
,,,ImageList_ReplaceIcon(il -1 iif(hi hi _dialogicon))
,,,if(hi) DestroyIcon hi
,SetProp hcb "qm_il" il
,ImageList_Destroy GetProp(hcb "qm_il")
,,RECT r=ds.rcItem
,,FillRect ds.hDC &ds.rcItem iif(selected COLOR_HIGHLIGHT COLOR_WINDOW)+1
,,il=GetProp(hcb "qm_il")
,,n=ImageList_GetImageCount(il); if(ds.itemID<n) n=ds.itemID; else n-1
,,ImageList_Draw il n ds.hDC r.left+1 ILD_NORMAL
,,SetTextColor ds.hDC GetSysColor(iif(selected COLOR_HIGHLIGHTTEXT COLOR_WINDOWTEXT))
,,GetItemText ds.hWndItem ds.itemID s flags&1
,,DrawText ds.hDC s -1 &r dtFlags^DT_NOPREFIX

Creates dialog with 4 owner-drawn controls - read-only combo with small icons, editable combo with large icons, list box with small icons, list box with bmp/jpg/gif images.
Function dialog_od_combo
Copy      Help
function# hDlg message wParam lParam
if(hDlg) goto messages

str controls = "3 4 5 6"
str cb3 cb4 lb5 lb6
lb6="&one[]two[13]lines and with word wrap[]three"
if(!ShowDialog("dialog_od_combo" &dialog_od_combo &controls)) ret
out cb3
out cb4
out lb5
out lb6

;0 "" 0x90C80A44 0x100 0 0 204 164 "Dialog"
;1 Button 0x54030001 0x4 4 146 48 14 "OK"
;2 Button 0x54030000 0x4 56 146 48 14 "Cancel"
;3 ComboBox 0x54230253 0x0 4 6 96 215 ""
;4 ComboBox 0x54230252 0x0 4 26 96 215 ""
;5 ListBox 0x54230151 0x200 4 104 96 36 ""
;6 ListBox 0x54230151 0x200 110 6 90 134 ""
;DIALOG EDITOR: "" 0x2020100 "" ""


CB_DrawImages hDlg message wParam lParam 3 "mouse.ico[]qm.exe[]qm.exe,3"
CB_DrawImages hDlg message wParam lParam 4 "shell32.dll,0[]shell32.dll,1[]shell32.dll,2" 0 32 32 DT_VCENTER|DT_SINGLELINE
CB_DrawImages hDlg message wParam lParam 5 "keyboard.ico[]qm.exe,1[]qm.exe,4" 1
CB_DrawImages hDlg message wParam lParam 6 "$My Pictures$\60x90.bmp[]$My Pictures$\60x90.jpg[]$My Pictures$\60x90.gif" 1|16 60 90 DT_WORDBREAK

sel message
,case WM_COMMAND goto messages2
sel wParam
,case IDOK
ret 1

Similar code also can be used to draw owner-drawn controls of other types (those that support WM_DRAWITEM). Other control types also may require to process WM_MEASUREITEM.
CB_DrawImages hDlg message wParam lParam 4 "mouse.ico" 1

how can i add mouse.ico to each index, no matter how many there are?

I updated CB_DrawImages code here. Now your code will work.
thank you
Is it possible to reload the listbox (lb6) with other image and text data without having to restart the whole dialog?
With this function no. It creates imagelist when dialog starts, and cannot change it later.
Ok thanks!

Forum Jump:

Users browsing this thread: 1 Guest(s)