ListViewGadget style menu démarrer avec MouseWheel [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

ListViewGadget style menu démarrer avec MouseWheel [Résolu]

Message par Kwai chang caine »

Bonjour la famille

Voila, je voudrais avoir une listview avec les lignes qui se preselectionnent quand on passe dessus avec le pointeur de la souris.

Un peu comme le menu démarrer, ça deviens fond bleu caracteres blanc quand on survol la ligne.

Tout ceci pour etre sur de cliquer sur la bonne ligne.
Car je ne veux faire qu'un clic dans cette listview, et si je me gourre d'une ligne :oops:

J'ai cherché un peu partout, mais en fait je ne sais pas quoi mettre dans le moteur de recherche pour trouver ce code (A part listview bien sur :D).

Merci et bonne journée
Dernière modification par Kwai chang caine le jeu. 27/déc./2007 11:39, modifié 5 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Le problème, c'est que le menu démarrer n'est pas une ListView (Class SystListView32), mais une ToolBar (Class ToolBar32).

A priori, la ListView ne reçoit pas de notifications de survol, donc, il faudrait faire ça en récupérant la position de la souris par rapport à la position de la ListView et envoyer un message avec #LB_SetCurSel pour sélectionner la ligne sous le curseur.

C'est faisable, mais faudrai chercher un peu.

Regarde dans CodeArchiv, si il n'y a pas quelque chose.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Tiens, j'ai fait ça vite fait. Regarde si ça te conviens. Il y a certainement des trucs à améliorer, mais là, j'ai autre chose à faire. Y a les experts sur TF1 :lol:

Code : Tout sélectionner

Procedure MakeLong(low.w, high.w)
  ProcedureReturn low + (high<<16)
EndProcedure

Procedure LowWord(long)
  ProcedureReturn long&$FFFF
EndProcedure

#LB_ITEMFROMPOINT = $1A9 


If OpenWindow(0,0,0,270,200,"ListViewGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(0))
    ListViewGadget(0,10,10,250,180)
    
    For a=1 To 12
      AddGadgetItem (0, -1, "Elément "+Str(a)+" de la boîte de liste")   ; défini le contenu de la boîte de liste
    Next
  EndIf
  
  
  Repeat
    ; On récupère les coordonnées X et Y du pointeur de souris
    x = WindowMouseX(0) : y = WindowMouseY(0)
    
    ; On récupère la hauteur des lignes de la liste
    h = SendMessage_(GadgetID(0), #LB_GETITEMHEIGHT, 0, 0) 
    
    ; On soustrait la moitié de la hauteur de la ligne à la position Y du curseur 
    ; pour que le milieu de la ligne  soit au bout de la flèche
    y - (Round(h / 2, 1)) 
    
    ; Puis on récupère l'index de l'élément survolé par le pointeur...
    Index = LowWord(SendMessage_(GadgetID(0), #LB_ITEMFROMPOINT, 0, MakeLong(x, y)))
    
    ; ... et on le sélectionne
    SendMessage_(GadgetID(0), #LB_SETCURSEL, Index, 0)
    
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Quit = #True
        
      Case #PB_Event_Gadget
        Select EventGadget()
          
          Case 0
            If EventType() = #PB_EventType_LeftClick
              SetWindowTitle(0, GetGadgetItemText(0, GetGadgetState(0), 0))
            EndIf
            
        EndSelect
    EndSelect
  Until Quit
EndIf  
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Allez hop!

Le même exemple, mais avec une macro pour pouvoir la réutiliser avec d'autre programmes.

J'ai ajouté quelques bricoles pour améliorer le fonctionnement.

Code : Tout sélectionner

Macro ListView_AutoSelect(ListView)
  #LB_ITEMFROMPOINT = $1A9 
  
  x = WindowMouseX(ListView) : y = WindowMouseY(ListView)
  
  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
    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
EndMacro


; °°°° Début du programme °°°°
If OpenWindow(0,0,0,270,200,"ListViewGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(0))
    ListViewGadget(0,10,10,250,180)
    
    For a=1 To 12
      AddGadgetItem (0, -1, "Elément "+Str(a)+" de la boîte de liste")   ; défini le contenu de la boîte de liste
    Next
    
    SetGadgetColor(0, #PB_Gadget_BackColor, $00C8D0D4)
  EndIf
  
  
  Repeat
    ListView_AutoSelect(0) ; <-- Appel de la macro à chaque boucle
    
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            If EventType() = #PB_EventType_LeftClick
              SetWindowTitle(0, GetGadgetItemText(0, GetGadgetState(0), 0))
            EndIf
            
        EndSelect
        
      Case #PB_Event_CloseWindow : Quit = #True
    EndSelect
  Until Quit
EndIf
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

superbe !! :D
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

8O

Vraiment pas mal! :D

Mais je vais pousser un peu plus... :twisted: ...peut-on garder visible sur le gadget la dernière sélection? :wink:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

RV a écrit :8O

Vraiment pas mal! :D

Mais je vais pousser un peu plus... :twisted: ...peut-on garder visible sur le gadget la dernière sélection? :wink:
Le deuxième code le fait. Il suffit de faire attention de ne pas selectionner un autre item quand tu retires le pointeur de souris de la fenêtre. Sinon, si tu veux que la sélection auto des éléments ne fonctionne plus une fois que tu as cliqué sur un item, il suffit de mettre un flag que tu mets à 1.

Pour remettre le flag à 0, il faut sortir le pointeur de souris de la liste.

Code : Tout sélectionner

#Win = 0
#List = 0

Global FlagSelect = 0

Macro ListView_AutoSelect(ListView)
  #LB_ITEMFROMPOINT = $1A9 
  
  x = WindowMouseX(ListView) : y = WindowMouseY(ListView)
  
  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
EndMacro


; °°°° Début du programme °°°°
If OpenWindow(#Win,0,0,270,200,"ListViewGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#Win))
    ListViewGadget(#List,10,10,250,180)
    
    For a=1 To 40
      AddGadgetItem (#List, -1, "Elément "+Str(a)+" de la boîte de liste")   ; défini le contenu de la boîte de liste
    Next
    
    SetGadgetColor(#List, #PB_Gadget_BackColor, $00C8D0D4)
  EndIf
  
  
  Repeat
    ListView_AutoSelect(#List) ; <-- Appel de la macro à chaque boucle
    
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #List
            If EventType() = #PB_EventType_LeftClick
              SetWindowTitle(#Win, GetGadgetItemText(#List, GetGadgetState(#List), 0))
              FlagSelect = 1
            EndIf
            
        EndSelect
        
      Case #PB_Event_CloseWindow : Quit = #True
    EndSelect
  Until Quit
EndIf
PS :Et si tu veux que ça fasse le café... achète toi une cafetière. :roll:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Alors la CHRIS,
je t'aime !!!!
Image
C'est exactement "çaqujevoulais"

Je n'oublierais jamais le sacrifice que tu auras fait pour moi. 8)
Les experts c'est quelque chose :D

En parlant d'expert, j'ai bien fait de vous demander, car je risquais pas de trouver :oops:
Il faut dire que meme la question etait pas simple à poser, alors je me suis douté que ça se présentais mal pour la réponse. :?

Tu es un crac.
Encore mille merci sinceres. 8)

Je te souhaite une excelente journée, à toi ta famille et les trois générations qui te succederons :D
Mais pour ça faut pas trop regarder les experts "le soir" .... :lol:

Et aussi merci aux autres de m'avoir lu 8)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Si une humble poussiere de brindille, peut se permettre de faire une minuscule remarque à propos de ton génial code.

Je crois que tu t'es trompé dans la macro à cette ligne

Code : Tout sélectionner

x = WindowMouseX(ListView) : y = WindowMouseY(ListView) 
ça marche quand meme car tu as mis la valeur "0" aux deux constantes fenetre et gadget.
Par contre dans mon code, je ne l'ai pas fait, ce qui me produisait une erreur.
Je me suis donc permis, moi l'infime vermiceau de modifier ton oeuvre :oops:
J'espere que je ne l'ai pas fait à tort :roll:

Code : Tout sélectionner

; http://www.purebasic.fr/french/viewtopic.php?p=76182#76182
; Code réalisé par CHRIS

#Win = 0 
#List = 10 

Global FlagSelect = 0 

Macro 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 

EndMacro


; °°°° Début du programme °°°° 
If OpenWindow(#Win,0,0,270,200,"ListViewGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  If CreateGadgetList(WindowID(#Win)) 
    ListViewGadget(#List,10,10,250,180) 
    
    For a=1 To 40 
      AddGadgetItem (#List, -1, "Elément "+Str(a)+" de la boîte de liste")   ; défini le contenu de la boîte de liste 
    Next 
    
    SetGadgetColor(#List, #PB_Gadget_BackColor, $00C8D0D4) 
  EndIf 
  
  
  Repeat 
    ListView_AutoSelect(#Win, #List) ; <-- Appel de la macro à chaque boucle 
    
    Select WaitWindowEvent() 
      Case #PB_Event_Gadget 
        Select EventGadget() 
          Case #List 
            If EventType() = #PB_EventType_LeftClick 
              SetWindowTitle(#Win, GetGadgetItemText(#List, GetGadgetState(#List), 0)) 
              FlagSelect = 1 
            EndIf 
            
        EndSelect 
        
      Case #PB_Event_CloseWindow : Quit = #True 
    EndSelect 
  Until Quit 
EndIf 
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

J'suis dégouté j'ai éssayé de marier le génial code de CHRIS avec le génial code de SPARKIE.
Je me suis naivement dit que cela ferait un beau BB :D

Mais il se présente par le siege :?

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.

Pour la photo j'ai utilisé le coeur du POST du dessus

Voici l'enfant :

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
Merci de votre aide si précieuse 8)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Kwai chang caine a écrit :Si une humble poussiere de brindille, peut se permettre de faire une minuscule remarque à propos de ton génial code.

Je crois que tu t'es trompé dans la macro à cette ligne

Code : Tout sélectionner

x = WindowMouseX(ListView) : y = WindowMouseY(ListView) 
Exact, je m'en suis rendu compte après.

Mais bon... Tu t'en es aperçu, c'est l'essentiel :lol:
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

@Chris
Vu que tu voulais pas m'offrir un café, je me suis fait un thé! :D ;)

Code : Tout sélectionner

#win=1
Global event,eventtype
Global selection=-1

CreateImage(0,200,1008)
LoadImage(1,"c:\sans titre.bmp")
LoadFont(0,"arial",9,#PB_Font_Bold)

Procedure Drawing(lig)
  StartDrawing(ImageOutput(0))
    Box(0,0,ImageWidth(0),ImageHeight(0),RGB(255,255,255))
    DrawImage(ImageID(1),0,0)
    If lig>-1
      Box(0,lig*14,ImageWidth(0),14,RGB(0,200,0))
    EndIf
    If selection>-1
      Box(0,selection*14,ImageWidth(0),14,RGB(0,0,150))
    EndIf
    DrawingMode(1):DrawingFont(FontID(0))
    For i=0 To 71
      If i=lig Or i=selection
        coul=RGB(255,255,255)
      Else
        coul=RGB(0,0,0)
      EndIf
        txt$="Item "+Str(i)
        DrawText(10,i*14,txt$,coul)
      Next i
  StopDrawing()
  If IsGadget(1)
    SetGadgetState(1,ImageID(0))
  EndIf
EndProcedure
Procedure.l FocusItem() 
  PosScrollH.l = GetScrollPos_(GadgetID(0), #SB_HORZ) 
  PosScrollV.l = GetScrollPos_(GadgetID(0), #SB_VERT) 
  wmx=WindowMouseX(#win):wmy=WindowMouseY(#win)
  ligne=Round((wmy+PosScrollV-GadgetY(0))/14,0)
  If EventGadget()=1 And eventtype=#PB_EventType_LeftClick
    selection=ligne
  EndIf
  If wmx>GadgetX(0)+2 And wmx<GadgetX(0)+GadgetWidth(0)-4 And wmy>GadgetY(0)+2 And wmy<GadgetY(0)+GadgetHeight(0)-4
    drawing(ligne)
    SetWindowTitle(#win,"Ligne "+Str(Round((wmy+PosScrollV-GadgetY(0))/14,0)))
  Else
    drawing(-1)
    SetWindowTitle(#win,"Hors gadget")
  EndIf
EndProcedure 

drawing(-1)

OpenWindow(#win,100,100,242,400,"sdhfjghj",#PB_Window_SystemMenu)
    CreateGadgetList(WindowID(#win))
        ScrollAreaGadget(0,10,10,ImageWidth(0)+22,380,ImageWidth(0),ImageHeight(0),10)
            ImageGadget(1,0,0,ImageWidth(0),ImageHeight(0),ImageID(0))
        CloseGadgetList()

Repeat
    event=WaitWindowEvent()
    eventtype=EventType()

    FocusItem()
        
Until event=#PB_Event_CloseWindow

End
@Kwai chang caine
Je te laisse comprendre mon code et l'adapter à tes besoins! ;)
Sinon, tu veux un thé? :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

@RV

Déjà je t'appréciais beaucoup, mais je crois que maintenant je t'aime aussi.
C'est noel avant noel.

Un code qui fait les deux en deux fois moins long 8O
Moi aussi j'aurais voulu faire l'ecole de harry potter ...

Genial ton code, tu as utilisé une image gadget à la place d'une listview.
Mais je vais etre comme toi avec le gentil CHRIS, cela m'interpelle une autre question.
Comment tu détecte l'evenement et retourne la valeur de la ligne cliquée ??? 8O

Autrement pour le thé, ça aurait été intéréssant, mais je te dis non.
Par contre qu'est ce que tu fais dimanche, on pourrait se marier :lol:

Mille merci RV 8)
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

Kwai chang caine a écrit :Comment tu détecte l'evenement et retourne la valeur de la ligne cliquée ??? 8O
La boucle devient

Code : Tout sélectionner

Repeat
    event=WaitWindowEvent()
    eventtype=EventType()

    ancselection=selection
    FocusItem()
    If selection<>ancselection
      MessageRequester("Info","Item "+Str(selection))
    EndIf
      
Until event=#PB_Event_CloseWindow
Par contre qu'est ce que tu fais dimanche, on pourrait se marier :lol:
Bah...j'ai posé la question à ma femme, elle m'a répondu qu'on avait une bouffe dimanche! :lol:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Les mots n'ont que peu de poid devant ma reconnaissance.
Merci beaucoup de t'etre penché sur mon berceau de BB programmeur. 8)

Je vais pouvoir mettre ça en application lundi.
Je suis super content et je sent que mon chef partagera mon enthousiasme. :D

Bon pour ta femme, je suis en peu jaloux, mais bon je vais essayer d'apprendre à partager.
D'ailleurs ça me fait penser et tu va rire, que j'avais oublié d'en parler à la mienne. :D
C'est balot. :lol:

Encore merci sincerement de ta precieuse aide et evidemment à tous ceux de ce POST.
Que ferais-je sans vous ..........................surement pas de l'informatique :oops:
Répondre