Seite 1 von 1

Sendmessage #LVm zum Einfärben von Checkboxes bei Listicong.

Verfasst: 26.12.2006 14:01
von CNESM
Hi Leute,

eine kurze Frage zum Einfärben von Gadgets:

Kann mir jemand den Sendmessage Befehl zum Einfärben der Checkboxen einer Listicongadget sagen? (Gesetz sind die Checkboxen mit dem Befehl #PB_ListIcon_CheckBoxes).

Bisher sieht das Ganze noch so aus:

http://cnesm.i-networx.de/Unbenannt.GIF

hab bisher nichts ausmachen können!

Danke

CNESM

Verfasst: 26.12.2006 17:08
von edel
Da musst du wohl selber zeichnen.

Re: Sendmessage #LVm zum Einfärben von Checkboxes bei Listic

Verfasst: 27.12.2006 02:09
von Fluid Byte
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! :allright:

Verfasst: 27.12.2006 12:02
von CNESM
Mhhh :D

Da hast du gute Arbeit geleistet. Hatte ja eigentlich gehofft, das es dafür einen einfachen Sendmessage Befehl geben würde, aber man kann nicht alles haben. Das Beispiel gehört auf jedenfall ins CodeArchiv, Andre (Soferns für dich in Ordnung ist Fluid Byte). Sehr gut geschrieben (fast and dirty hack :mrgreen: ), verständlich aufgebaut und erfüllt seinen Zweck zu 100%

Danke für deine Hilfe!

P.S. Und ich hab die Hoffnung an selbst erstellte Scrollbalken im Listicongadget schon aufgegeben <)

Verfasst: 27.12.2006 12:20
von Andre
CNESM hat geschrieben:Das Beispiel gehört auf jedenfall ins CodeArchiv, Andre (Soferns für dich in Ordnung ist Fluid Byte).
Freilich, freilich.... :mrgreen: