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

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Da musst du wohl selber zeichnen.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

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

Beitrag 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:
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag 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 <)
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten