Votre SplitterGadget

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Votre SplitterGadget

Message par Progi1984 »

Voici un petit code pour créer votre propre SplitterGadget.

Je cherche de l'aide sur ces points :
1-Probleme lorsque la souris est au dessus du bouton
2-Chercher curseur (fleche vers la gauche barre barre fleche vers la droite)
3-ombre de déplacement

Code : Tout sélectionner

cf fin de page
Dernière modification par Progi1984 le mar. 10/oct./2006 13:48, modifié 1 fois.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Code modifié !

Quelqu'un pourrait m'aider pour définir les points 1 et 3 de la todo list ?

Surtout le 3 !
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Essayes ça.

Ca te fais apparaître un curseur de resize quand tu cliques sur le splitter, ce qui te permet de voir où tu vas avec le curseur. Cela t'aidera peut-être. Le bean's c'est que les gadgets ne sont redimmensionnés qu'au relâchement de la souris et je n'ai pas cherché pour modifier.

Code : Tout sélectionner

Global MySplitter_ArrowCursorH, cur1 
Global Splitter_Activate 
Global SkinButton.l 

Procedure MySplitterGadget(Gadget, X, Y, Width, Height) 
  ButtonGadget(Gadget, X, Y, Width, Height,"", #BS_OWNERDRAW) 
  MySplitter_ArrowCursorH = LoadCursorFromFile_(@"SPLITH.CUR") 
  CreateImage(0,Width,Height) 
  StartDrawing(ImageOutput(0)) 
    Box(0,0,Width  ,Height  , GetSysColor_(#COLOR_3DSHADOW)) 
    Box(0,0,Width-2,Height-2, GetSysColor_(#COLOR_3DHILIGHT)) 
    Box(2,2,Width-4,Height-4, GetSysColor_(#COLOR_3DFACE)) 
  StopDrawing() 
  SkinButton = CreatePatternBrush_(ImageID(0)) 
  ProcedureReturn 
EndProcedure 

Procedure   IsMouseOver(wnd) 
  GetWindowRect_ (wnd,re.RECT) 
  re\left = re\left 
  re\top = re\top 
  re\right = re\right 
  re\bottom = re\bottom 
  GetCursorPos_ (pt.POINT) 
  ProcedureReturn PtInRect_ (re,pt\x,pt\y) 
EndProcedure 

Procedure ResizeInterface(Window.l, Splitter.l, Gadget1.l, Gadget2.l) 
  Protected Delta.l 
  If WindowMouseX(Window) = -1 
  ; hors de la fenetre 
    If DesktopMouseX() > WindowX(Window) + WindowWidth(Window) 
    ; à droite de la fenetre 
      Delta = WindowWidth(Window) 
    ElseIf DesktopMouseX() < WindowX(Window) 
    ; à gauche de la fenetre 
      Delta = - GadgetX(Splitter) 
    EndIf 
  Else 
    Delta = WindowMouseX(Window) - GadgetX(Splitter) 
  EndIf 
  If GadgetWidth(Gadget1) + Delta < 0 
    Delta = 0 - GadgetWidth(Gadget1) 
  EndIf 
  If GadgetWidth(Gadget2) - Delta < 0 
    Delta = GadgetWidth(Gadget2) 
  EndIf 
  ResizeGadget(Gadget1, #PB_Ignore, #PB_Ignore, GadgetWidth(Gadget1) + Delta, #PB_Ignore) 
  ResizeGadget(Splitter, GadgetX(Splitter) + Delta, #PB_Ignore, #PB_Ignore, #PB_Ignore) 
  ResizeGadget(Gadget2, GadgetX(Gadget2) + Delta, #PB_Ignore, GadgetWidth(Gadget2) - Delta, #PB_Ignore) 
  ProcedureReturn 
EndProcedure 


Procedure WindowCallback(WindowID, Message, wParam, lParam) 
  Result = #PB_ProcessPureBasicEvents  
    If Splitter_Activate = #True 
      ;SetCursor_(MySplitter_ArrowCursorH)
      SetCursor_(cur1) 
    EndIf 
    Select Message 
      Case #WM_MOUSEMOVE 
        If IsMouseOver(GadgetID(3))  
          ;SetCursor_(MySplitter_ArrowCursorH) 
          SetCursor_(cur1)
        EndIf 
      Case #WM_PARENTNOTIFY 
        Select wParam 
          Case #WM_LBUTTONDOWN 
            If IsMouseOver(GadgetID(3)) 
              Splitter_Activate = #True 
            EndIf 
        EndSelect 
      Case #WM_DRAWITEM 
        *dis.DRAWITEMSTRUCT 
        *dis = lParam 
        If *dis\itemState & #ODS_CHECKED 
          FillRect_(*dis\hdc, *dis\rcItem, SkinButton) 
        ElseIf *dis\itemState & #ODS_SELECTED 
          FillRect_(*dis\hdc, *dis\rcItem, SkinButton) 
        Else 
          FillRect_(*dis\hdc, *dis\rcItem, SkinButton) 
        EndIf 
    EndSelect 
   ProcedureReturn Result 
 EndProcedure 

hWnd=OpenWindow(0,200,200,240,190,"SplitterGadget Example",#PB_Window_SystemMenu) 
CreateGadgetList(WindowID(0)) 
    
ListViewGadget(0, 005, 005, 110, 180) 
ListViewGadget(1, 125, 005, 110, 180) 

  Splitt=MySplitterGadget(3, 116, 010, 008, 170) 
   SetClassLong_(Splitt,#GCL_HCURSOR,0)
    cur1 = LoadCursor_(0, #IDC_SIZEWE); curseur d'élargissement
    MySplitter_ArrowCursorH = cur1

For k=0 To 10 
  AddGadgetItem(0, -1, "0 - " + Str(k)) 
  AddGadgetItem(1, -1, "1 - " + Str(k)) 
Next 
SetWindowCallback(@WindowCallback()) 


Repeat 
  Event = WaitWindowEvent() 
  Select Event 

    Case #WM_LBUTTONUP 
      If Splitter_Activate = #True 
        Splitter_Activate = #False 
        ResizeInterface(0, 3, 0, 1) 
      EndIf 
  EndSelect 
Until Event = #PB_Event_CloseWindow 
DestroyCursor_(cur1)
End 
@+ (Au fait, pas mal l'idée du splitter maison)
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Jacobus a écrit :Le bean's c'est que les gadgets ne sont redimmensionnés qu'au relâchement de la souris
Quelqu'un sait faire ca avec le SplitterGadget natif ???

Dri
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

@Dr Dri

Je vais me pencher dessus!
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est juste un exemple, il faudra l'adapter pour un splitter vertical:


 Global OriginProc,test.b,a.l,b.l,hbruh

  Procedure NouvelleProc( hWnd, msg, wParam, lParam)
 
   Select msg

     Case 512 ;déplacement
         If test=1
            a=wParam
            b=lParam
             GetCursorPos_ (@point.POINT)
             GetWindowRect_ (hWnd,@rect.RECT)
             If point\y>=rect\top And point\y<=rect\bottom
                 SetWindowPos_ ( WindowID (1),0,rect\left,point\y-1,rect\right-rect\left,3, #SWP_NOSIZE | #SWP_NOACTIVATE )
             EndIf
             ProcedureReturn 0
         EndIf
        
     Case 513 ;appuyé
        test=1
         OpenWindow (1, 0, 0, 100, 100, "SplitterGadget" , #PB_Window_BorderLess|#PB_Window_Invisible )
        hbruh= CreateSolidBrush_ ( RGB (0,0,255))
         SetClassLong_ ( WindowID (1), #GCL_HBRBACKGROUND , hbruh)
         InvalidateRect_ ( WindowID (1),0,1)
         GetWindowRect_ (hWnd,@rect.RECT)
         GetCursorPos_ (@point.POINT)
         SetWindowPos_ ( WindowID (1),0,rect\left,point\y-1,rect\right-rect\left,3, #SWP_NOACTIVATE| #SWP_SHOWWINDOW )

     Case 514 ;relaché
        test=0
         DestroyWindow_ ( WindowID (1))
         DeleteObject_ (hbruh)
         SendMessage_ (hWnd, 512,a,b)
        
   EndSelect

   ProcedureReturn CallWindowProc_ (OriginProc,hWnd,msg,wParam,lParam)
EndProcedure
 
 
 
  If OpenWindow (0, 0, 0, 230, 210, "SplitterGadget" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
    
     If CreateGadgetList ( WindowID (0))
      
       #Bouton1 = 0
       #Bouton2 = 1
       #Separateur = 2
      
       ButtonGadget ( #Bouton1 , 0, 0, 0, 0, "Bouton 1" )
       ButtonGadget ( #Bouton2 , 0, 0, 0, 0, "Bouton 2" )
      
       SplitterGadget ( #Separateur , 5, 5, 220, 120, #Bouton1 , #Bouton2 , #PB_Splitter_Separator )
      OriginProc = SetWindowLong_ ( GadgetID ( #Separateur ), #GWL_WNDPROC , @NouvelleProc())
       SetProp_ ( GadgetID ( #Separateur ), "OriginProc" , OriginProc)

       TextGadget (3, 10, 135, 210, 70, "Le composant d'interface graphique ci-dessus affiche deux boutons automatiquement redimensionnés à l'intérieur de la zone séparée de taille 220x120." , #PB_Text_Center )
      
       Repeat
       Until WaitWindowEvent () = #PB_Event_CloseWindow
     EndIf
   EndIf


[Edit]Le code à été modifié!
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Je garde ce code au chaud ^^
dès que j'ai le temps je regarde comment t'as bricolé ca

Dri
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

J'arrive à afficher la petite barre bleue mais ca bugge : regardez par vosu même :

Code : Tout sélectionner

cf fin de page
Dernière modification par Progi1984 le mar. 10/oct./2006 13:49, modifié 2 fois.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Erreur ligne 21 : MySplitter_ArrowCursorH = LoadCursor(0, #IDC_HAND) ;LoadCursorFromFile_(@"SPLITH.CUR")

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Corrigé !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

J'ai du faire une erreur lors du déplacement de la barre ... Peux tu y regarder, stp ?

Le problème est :
J'appuie sur mon splitter mais le déplacement ne se fait pas en même temps que la souris...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Bon, j'ai réussi.
La solution était de subclasser le bouton. Ca m'a permis de comprendre comment on crée de nouveaux gadgets.
Merci nico !
File:1->MySplitter.zip
Image
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Sympa, bon rendu.

Par contre y'a un pb dans ton code (qq1 qui te l'as piqué c'est fait remonté les bretelles par Dridi dans un autre topic) :

Code : Tout sélectionner

Procedure IsMouseOver(wnd)
  GetWindowRect_ (wnd,re.RECT)
  re\left = re\left ; les 4 lignes là ne servent à rien !!!!!
  re\top = re\top
  re\right = re\right
  re\bottom = re\bottom
  GetCursorPos_ (pt.POINT)
  ProcedureReturn PtInRect_ (re,pt\x,pt\y)
EndProcedure 
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Code corrigé !
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

@Lionel_om
Par contre y'a un pb dans ton code (qq1 qui te l'as piqué c'est fait remonté les bretelles par Dridi dans un autre topic)
Non non mes bretelles vont bien :lol:

Original :

Code : Tout sélectionner

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=895&highlight= 
; [b]Author: Andreas 
; Date: 05. May 2003 [/b]
; purebasic 4.00 
Global Button.l 

Procedure IsMouseOver(wnd) 
         GetWindowRect_ (wnd,re.RECT) 
        re\left = re\left 
        re\top = re\top 
        re\right = re\right 
        re\bottom = re\bottom 
         GetCursorPos_ (pt.POINT) 
        Result = PtInRect_ (re,pt\X,pt\Y) 
         ProcedureReturn Result 
EndProcedure 
quoi est à qui? ...
Promis, je ne collerai plus de code, ni d'exemple, ni d'idée, ni appli... rien qui pourrait porter à confusion dans l'esprit limité de certains, des fois qu'on me les piquerai :lol: , je vais rester "profiteur passif" et rester in the shadow...

Y a quand même des charlots sur ce forum

@+
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre