ListIconGadget : Selections sans couleur bleue

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

ListIconGadget : Selections sans couleur bleue

Message par Ar-S »

Tout d'abord, j'utilise #WM_LBUTTONDOWN car la redondance de #PB_EventType_LeftClick est insupportable donc c'est du Windows Only.

Lorsque vous voulez sélectionner plusieurs éléments dans une liste, l'élément cliqué est bleu.
Je trouve cela gênant lorsqu'on attribut une couleur aux cellules sélectionnées.
J'ai trouvé une méthode simple pour ne plus être embêté par ça.
Il suffit, après votre choix de sélection, de lancer un

Code : Tout sélectionner

SetGadgetItemState(1,-1,0)
Exemple

Code : Tout sélectionner

If OpenWindow(0, 100, 100, 360, 200, "ListIconGadget Selection", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListIconGadget(1, 5, 5, 358, 190, "Nom", 100, #PB_ListIcon_FullRowSelect )
    AddGadgetColumn(1, 1, "Adresse", 250)
    AddGadgetItem(1, -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay")
    AddGadgetItem(1, -1, "Ginger Brokeit"+Chr(10)+"130 PureBasic Road, BigTown, CodeCity")
    
    Repeat
        Evenement = WaitWindowEvent()
        EG = EventGadget()
        
        Select Evenement
                
            Case #WM_LBUTTONDOWN;
                If GetActiveGadget() = 1 And GetGadgetState(1) <> -1
                    Num  = GetGadgetState(1)
                    Etat = GetGadgetItemData(1,Num)
                    
                    If etat = 0 
                        etat = 1 : COL = $00CCFF
                    Else
                        etat = 0 : COL = $FFFFFF
                    EndIf
                    
                    Debug "Elément "+Str(Num) + " Etat : " + etat
                    SetGadgetItemData(1,Num,etat)
                    SetGadgetItemColor(1,Num,#PB_Gadget_BackColor,COL)
                    SetGadgetItemState(1,-1,0) ; <-- essayer en commentant cette ligne, la selection bleue reviendra
                EndIf
                
        EndSelect

    Until Evenement = #PB_Event_CloseWindow
EndIf
Exemple mis en image
Image
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: ListIconGadget : Selections sans couleur bleue

Message par kernadec »

Bjr Ar-s
merci du partage :D
Intéressant ton astuce, mais je vois tu as utilisé la balise "#PB_ListIcon_MultiSelect"
le mode multi-select est prévu pour être utilisé avec la touche [CTL] appuyée
ton code est en multi-select direct, est ce voulu :?:
Cordialement

Ps: Testé avec Seven et pb 573LTS
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: ListIconGadget : Selections sans couleur bleue

Message par Ar-S »

Regarde mieux, je n'ai pas utilisé PB_ListIcon_MultiSelect. Donc oui mon multi select auto est volontaire.
Je suis en train de faire mumuse avec SQlite et listiconGadget. Et j'avais besoin de cette fonction. La selection bleue me pompait
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: ListIconGadget : Selections sans couleur bleue

Message par Mesa »

Si tu utilises la fonction eventtype(), tu n'auras pas de rebond. Voir le code.

Windows seulement pour enlever la couleur bleue:

Code : Tout sélectionner

#LVS_EX_CHECKBOXES = 4 

;... Create brushes for painting item background  
Structure MYBRUSHES  
	brushDefault.l  
	brushFocus.l  
	brushSelected.l  
EndStructure  

Global brush.MYBRUSHES  

brush\brushSelected = CreateSolidBrush_(RGB(128, 255, 128))  
brush\brushFocus = CreateSolidBrush_(RGB(200, 255, 200))  
brush\brushDefault = GetStockObject_(#WHITE_BRUSH)  


Procedure myWindowCallback(hwnd, msg, wParam, lParam)  
	result = #PB_ProcessPureBasicEvents  
	Select msg  
		Case #WM_NOTIFY  
			*nmhdr.NMHDR = lParam  
			*lvCD.NMLVCUSTOMDRAW = lParam  
			If *lvCD\nmcd\hdr\hwndFrom  = GadgetID(0) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW     
				Select *lvCD\nmcd\dwDrawStage  
					Case #CDDS_PREPAINT  
						result = #CDRF_NOTIFYITEMDRAW  
					Case #CDDS_ITEMPREPAINT  
						
						result = #CDRF_NOTIFYSUBITEMDRAW;  
					Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM  
						thisRow = *lvCD\nmcd\dwItemSpec  
						thisCol = *lvCD\iSubItem  
						
						;... Draw checkboxes as needed 
						exStyle = SendMessage_(*lvCD\nmcd\hdr\hwndFrom, #LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) 
						If thisCol = 0 And exStyle & #LVS_EX_CHECKBOXES 
							stateList = SendMessage_(*lvCD\nmcd\hdr\hwndFrom, #LVM_GETIMAGELIST, #LVSIL_STATE, 0) 
							ckState = SendMessage_(*lvCD\nmcd\hdr\hwndFrom, #LVM_GETITEMSTATE, thisRow, #LVIS_STATEIMAGEMASK) >>12 -1 
							checkRect.RECT\left = #LVIR_ICON 
							checkRect.RECT\top = 0 
							SendMessage_(*lvCD\nmcd\hdr\hwndFrom, #LVM_GETITEMRECT, thisRow, @checkRect) 
							ImageList_Draw_(stateList, ckState, *lvCD\nmcd\hdc, 0, checkRect\top, #ILD_TRANSPARENT) 
						EndIf  
						;... Define rect for text  
						subItemRect.RECT\left = #LVIR_LABEL  
						subItemRect.RECT\top = *lvCD\iSubItem  
						;... Get the subitem rect  
						SendMessage_(*lvCD\nmcd\hdr\hwndFrom, #LVM_GETSUBITEMRECT, thisRow, @subItemRect)  
						subItemText$ = GetGadgetItemText(0, thisRow, thisCol)  
						If GetGadgetItemState(*lvCD\nmcd\hdr\idFrom, thisRow) & #PB_ListIcon_Selected And GetFocus_() <> *lvCD\nmcd\hdr\hwndFrom  
							FillRect_(*lvCD\nmcd\hdc, subItemRect, brush\brushFocus)  
						ElseIf GetGadgetItemState(*lvCD\nmcd\hdr\idFrom, thisRow) & #PB_ListIcon_Selected And GetFocus_() = *lvCD\nmcd\hdr\hwndFrom  
							FillRect_(*lvCD\nmcd\hdc, subItemRect, brush\brushSelected)  
						Else  
							FillRect_(*lvCD\nmcd\hdc, subItemRect, brush\brushDefault)  
						EndIf  
						;.. Set left margin 
						subItemRect\left + 3 
						DrawText_(*lvCD\nmcd\hdc, subItemText$, Len(subItemText$), subItemRect, #DT_WORD_ELLIPSIS | #DT_SINGLELINE | #DT_VCENTER) 
						result = #CDRF_SKIPDEFAULT  
				EndSelect  
			EndIf  
	EndSelect  
	ProcedureReturn result  
EndProcedure  

If OpenWindow(0, 0, 0, 480, 260, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
	SetWindowCallback(@myWindowCallback())  
	ListIconGadget(0, 10, 10, 470, 225, "Column 0", 150, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_MultiSelect | #PB_ListIcon_AlwaysShowSelection)  
	
	AddGadgetColumn(0, 1, "Column 1", 150)  
	For a = 0 To 9  
		addtext$ = "Column 0 Item " + Str(a) + Chr(10) + "Column 1 Item " + Str(a)  
		atLen = Len(addtext$)  
		AddGadgetItem(0,-1, addtext$)  
	Next a
	
	
	Repeat  
		Event = WaitWindowEvent() 
		
		Select Event
			Case #PB_Event_Gadget
				Select EventGadget()
					Case 0 
						
						Select EventType()
							Case	#PB_EventType_LeftClick 
								Debug "clic et pas de rebond"
						EndSelect
						
				EndSelect
				
		EndSelect
		
	Until event = #PB_Event_CloseWindow  
	DeleteObject_(brush\brushSelected)  
	DeleteObject_(brush\brushFocus)  
	
EndIf  
End  
M.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: ListIconGadget : Selections sans couleur bleue

Message par Ar-S »

Merci Mesa.
ça fait tout de même de la grosse procedure d'API pour ça. Par contre pour le rebond c'est bizarre j'y avait droit. Je ne sais pas comment je m'étais débrouillé car j'avais bien commencé par eventype et #PB_EventType_LeftClick.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: ListIconGadget : Selections sans couleur bleue

Message par kernadec »

c' est vrai, mais je voulais dire que dans ce code la fonction multi-select est automatique
et que la fonction Key [CTRL] même avec la balise active est annulée
Cordialement
Répondre