CNESM hat geschrieben:
Kann mir jemand den Sendmessage Befehl zum Einfärben der Checkboxen einer Listicongadget sagen? (Gesetz sind die Checkboxen mit dem Befehl #PB_ListIcon_CheckBoxes).
Wie Edel schon durchblicken lies, so einen Befehl gibt es nicht. Außerdem sind die regulären checkboxes, sowie die mit XP theme, reine Bitmap Dateien. Deshalb bietet das WinAPI auch keinen entsprechenden Befehl dafür.
Dir bleibt nur mittels des LVS_OWNERDRAWFIXED styles das Zeichnen selber zu übernehmen um benutzerdefinierte checkboxes darzustellen. Da hätte ich auch ein entsprechendes Beispiel was ich hier posten könnte. Allerdings bist du dann für
alles verantwortlich wie z.B. die Auswahlfarben, Auswahlrahmen oder das mit Einbeziehen der ausgewählten styles wenn du das Gadget erstellst (FullRow, Gridlines, etc.).
Wie auch immer, ich hab mir mal die Zeit genommen einen schnellen und schmutzigen hack geschrieben der sich der internen ImageList bedient:
Code: Alles auswählen
; Title: Custom ListView Checkboxes
; Author: Fluid Byte
; Date: December 27, 2006
CreateImage(0,32,16)
hdc = StartDrawing(ImageOutput(0))
Box(0,0,32,16,GetSysColor_(#COLOR_WINDOW))
Box(2,2,13,13) : Box(18,2,13,13)
SetRect_(erc.RECT,3,3,14,14)
DrawEdge_(hdc,erc,#BDR_RAISEDINNER,#BF_RECT | #BF_MIDDLE)
OffsetRect_(erc,16,0)
DrawEdge_(hdc,erc,#BDR_RAISEDINNER,#BF_RECT | #BF_MIDDLE)
hPenLine = CreatePen_(0,2,0)
SelectObject_(hdc,hPenLine)
LineXY(20,4,28,12) : LineXY(28,4,20,12)
DeleteObject_(hPenLine)
StopDrawing()
OpenWindow(0,0,0,400,300,"Custom ListView Checkboxes",#WS_OVERLAPPEDWINDOW | 1)
CreateGadgetList(WindowID(0))
ListIconGadget(0,5,5,390,290,"Name",350)
himlListview = ImageList_Create_(16,16,#ILC_COLOR16,0,0)
ImageList_Add_(himlListview,ImageID(0),0)
SendMessage_(GadgetID(0),#LVM_SETIMAGELIST,#LVSIL_SMALL,himlListview)
SendMessage_(GadgetID(0),#LVM_SETIMAGELIST,#LVSIL_NORMAL,himlListview)
For i=1 To 30 : AddGadgetItem(0,-1,"List-View Item #" + Str(i)) : Next
While WaitWindowEvent() ! 16
If EventType() = #PB_EventType_LeftClick
GetCursorPos_(cpt.POINT)
ScreenToClient_(GadgetID(0),cpt)
MX = cpt\x : MY = cpt\y
lvh.LVHITTESTINFO
lvh\pt\x = MX : lvh\pt\y = MY
SendMessage_(GadgetID(0),#LVM_HITTEST,0,lvh)
If lvh\flags = #LVHT_ONITEMICON
lvi.LV_ITEM
lvi\mask = #LVIF_IMAGE
lvi\iItem = GetGadgetState(0)
SendMessage_(GadgetID(0),#LVM_GETITEM,0,lvi)
lvi\iImage = 1 - lvi\iImage
SendMessage_(GadgetID(0),#LVM_SETITEM,0,lvi)
EndIf
EndIf
Wend
ImageList_Destroy_(himlListview)
Den checkbox Status kannst du mit folgender Prozedur rausfinden:
Code: Alles auswählen
Procedure IsChecked(iItem.w)
lvi.LV_ITEM
lvi\mask = #LVIF_IMAGE
lvi\iItem = iItem
SendMessage_(GadgetID(0),#LVM_GETITEM,0,lvi)
ProcedureReturn lvi\iImage
EndProcedure
Wie gesagt, einfärben ist nicht da alles auf Bildern basiert somit musst du für mehrfarbige checkboxes eine entsprechende Anzahl von Bildern erstellen und bearbeiten.
Hoffe es hilft fürs Erste!
