J'suis dégouté j'ai éssayé de marier le génial code de CHRIS avec le génial code de SPARKIE.
En effet apparement le code de SPARKIE supplante celui de CHRIS et la présection n'apparait plus
Y aurait il une ame charitable, pour le simplifier ou tout bonnement trouver l'erreur.
Code : Tout sélectionner
; ListViewGadget à fond d'image et préselection au survol
; Réalisé avec l'aide des codes de CHRIS et SPARKIE
LargeurFenetre = 240
HauteurFenetre = 240
#Fenetre = 0
#ListBox = 10
#Text_Display = 20
#Image_Lv = 30
#Image_Win = 31
Global oldCallback, hWinBrush ; Fond image
Global FlagSelect = 0 ; Selection au survol
UseJPEGImageDecoder()
Procedure ListView_AutoSelect(Fenetre, ListView)
#LB_ITEMFROMPOINT = $1A9
x = WindowMouseX(#Fenetre) : y = WindowMouseY(#Fenetre)
Gx = GadgetX(ListView) : Gw = GadgetX(ListView) + GadgetWidth(ListView)
Gy = GadgetY(ListView) : Gh = GadgetY(ListView) + GadgetHeight(ListView)
If x >= Gx And x <= Gw And y >= Gy And y <= Gh
If FlagSelect = 0
h = SendMessage_(GadgetID(ListView), #LB_GETITEMHEIGHT, 0, 0)
y - (Round((h / 4) *3, 1))
Index = SendMessage_(GadgetID(ListView), #LB_ITEMFROMPOINT, 0, x + (y<<16)) & $FFFF
If Index > -1
SendMessage_(GadgetID(ListView), #LB_SETCURSEL, Index, 0)
EndIf
EndIf
Else
FlagSelect = 0
EndIf
EndProcedure
Procedure.l ImageSizer(imageIs.l, imgW.f, imgH.f) ; Procedure pour le fond image de la ListView
mainWidth.f = ImageWidth(imageIs)
mainHeight.f = ImageHeight(imageIs)
percentageW.f = mainWidth / imgW
percentageH.f = mainHeight /imgH
If percentageW > percentageH Or percentageW = percentageH
percentageWH.f = percentageW
ElseIf percentageH > percentageW
percentageWH.f = percentageH
EndIf
newWidth = mainWidth / percentageWH
newHeight = mainHeight / percentageWH
newImage = ResizeImage(imageIs, newWidth, newHeight)
ProcedureReturn newImage
EndProcedure
Procedure CreateWindowBrush(img$) ; Procedure pour le fond image de la ListView
;...Load our selected image for window background
bgImage = CatchImage(#Image_Win, ?ImageData)
If bgImage
;...Resize image if it's too small for our use
If ImageWidth(#Image_Win) > 640 Or ImageHeight(#Image_Win) > 480
sizedImage = ImageSizer(#Image_Win, 640, 480)
ElseIf ImageWidth(#Image_Win) < 320 Or ImageHeight(#Image_Win) > 240
sizedImage = ImageSizer(#Image_Win, 320, 240)
EndIf
;...Create brush for window background
hBrush = CreatePatternBrush_(sizedImage)
imgW = ImageWidth(#Image_Win)
;...Window size will = 300 if image size < 300
;...or else Window size will = image size if image size >= 300
If imgW < 300
winW = 300
Else
winW = ImageWidth(#Image_Win)
EndIf
imgH = ImageHeight(#Image_Win)
If imgH < 250
winH = 250
Else
winH = ImageHeight(#Image_Win)
EndIf
If hBrush
result = hBrush
Else
MessageRequester("Error", "Could not create brush", #MB_ICONERROR)
result = 0
EndIf
Else
MessageRequester("Error", "Could not load image", #MB_ICONERROR)
result = 0
EndIf
ProcedureReturn result
EndProcedure
Procedure PaintIt(hwnd) ; Procedure pour le fond image de la ListView
Static previousScrollPos
;...Get ListView DC
lvDc = GetDC_(hwnd)
;...Get image DC
bgDc = StartDrawing(ImageOutput(#Image_Lv))
;...Get gadget#
gadId = GetDlgCtrlID_(hwnd)
;...Get first visible item
firstItem = SendMessage_(hwnd, #LB_GETTOPINDEX, 0, 0)
;...Get total number of items
totalItems = SendMessage_(hwnd, #LB_GETCOUNT, 0, 0) - 1
;...Get client rect for ListViewGadget
GetClientRect_(hwnd, @gadRc.RECT)
;...Determine border size
isBorder = GetWindowLong_(GadgetID(gadId), #GWL_EXSTYLE) & #WS_EX_CLIENTEDGE
If isBorder
border = GetSystemMetrics_(#SM_CYEDGE)
Else
border = 0
EndIf
;...Draw fresh background, compensating for gadget x/y position
;...The source image is our window background image
DrawImage(ImageID(#Image_Win), 0 - GadgetX(gadId) - border, 0 - GadgetY(gadId) - border)
;...Draw new text if visible
For i = firstItem To totalItems
SendMessage_(hwnd, #LB_GETITEMRECT, i, @itemRc.RECT)
If itemRc\bottom <= gadRc\bottom
;...Get item text and state
itemText$ = GetGadgetItemText(gadId, i, 0)
itemState = GetGadgetItemState(gadId, i)
;...Set drawing mode for text and focus rect
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_Transparent)
If itemState = 0
;...Text color for non-selected items
currentTextColor = RGB(255, 0, 0)
;...Create a 5 px left margin
itemRc\left + 5
;...Draw selected text
DrawText(itemRc\left, itemRc\top, itemText$, currentTextColor)
Else
;...Text color for selected items
currentTextColor = RGB(0, 0, 255)
;...Create a 5 px left margin
itemRc\left + 5
;...Draw selected text
DrawText(itemRc\left, itemRc\top, itemText$, currentTextColor)
;...Reset margin
itemRc\left - 5
;...Draw our focus rect
Box(itemRc\left, itemRc\top, itemRc\right - itemRc\left, itemRc\bottom - itemRc\top, #White)
EndIf
Else
Break
EndIf
Next i
;...Eliminate border and scrollbar area from BitBlt
clientW = gadRc\right - gadRc\left
clientH = gadRc\bottom - gadRc\top
;...Copy our background image onto ListViewGadget DC
BitBlt_(lvDc, 0, 0, clientW, clientH, bgDc, 0, 0, #SRCCOPY)
;...Clean up
ReleaseDC_(hwnd, lvDc)
StopDrawing()
;...Redraw scrollbar position as needed
si.SCROLLINFO\cbSize = SizeOf(SCROLLINFO)
si\fMask = #SIF_POS
GetScrollInfo_(hwnd, #SB_VERT, @si)
If si\nPos <> previousScrollPos
SetScrollInfo_(hwnd, #SB_VERT, @si, #True)
EndIf
previousScrollPos = si\nPos
EndProcedure
Procedure LVcallback(hwnd, msg, wParam, lParam)
result = CallWindowProc_(oldCallback, hwnd, msg, wParam, lParam)
doPaint = #False
Select msg
Case #WM_KEYDOWN
If wParam = #VK_DOWN Or wParam = #VK_UP Or wParam = #VK_NEXT Or wParam = #VK_PRIOR Or wParam = #VK_HOME Or wParam = #VK_END
doPaint = #True
EndIf
Case #WM_LBUTTONDOWN
doPaint = #True
result = 0
Case #WM_MOUSEMOVE
If wParam <> 0
doPaint = #True
result = 0
EndIf
Case #WM_ERASEBKGND
doPaint = #True
result = 1
Case #WM_PAINT
doPaint = #False
result = 0
Case #WM_VSCROLL
doPaint = #True
result = 0
Case #WM_MOUSEWHEEL
doPaint = #True
result = 0
EndSelect
;...Redraw the ListViewGadget as needed
If doPaint
PaintIt(hwnd)
EndIf
ProcedureReturn result
EndProcedure
OpenWindow(#Fenetre, x - 10, y - 10, LargeurFenetre, 250,"REclic",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(#Fenetre))
ListViewGadget(#ListBox, 0, 0, LargeurFenetre, HauteurFenetre, #LBS_OWNERDRAWFIXED)
For a=1 To 40
AddGadgetItem (#ListBox, -1, "Elément "+Str(a)+" de la boîte de liste") ; défini le contenu de la boîte de liste
Next
hWinBrush = CreateWindowBrush("")
GetClientRect_(GadgetID(#ListBox), @lvRc.RECT)
CreateImage(#Image_Lv, lvRc\right - lvRc\left, lvRc\bottom - lvRc\top)
SendMessage_(GadgetID(#ListBox), #WM_SETREDRAW, 0, 0)
oldCallback = SetWindowLong_(GadgetID(#ListBox), #GWL_WNDPROC, @LVcallback()) ;...Subclass the ListViewGadget
Repeat
Evenement = WaitWindowEvent ()
ListView_AutoSelect(#Fenetre, #ListBox)
Select Evenement
Case #WM_RBUTTONDOWN
Break
Case #PB_Event_Gadget
If EventGadget() = #ListBox And EventType() = #PB_EventType_LeftClick
SetWindowTitle(#Fenetre, GetGadgetItemText(#ListBox, GetGadgetState(#ListBox), 0))
FlagSelect = 1
EndIf
Default
Delay(1)
EndSelect
ForEver
If hWinBrush
DeleteObject_(hWinBrush)
EndIf
Delay(200)
End
DataSection
ImageData :
;*********
IncludeBinary "c:\Sans titre.bmp"
EndDataSection