Page 1 sur 1

deplacer une fenetre malgré #PB_Window_BorderLess [RESOLU]

Publié : lun. 14/août/2017 15:24
par david
Bonjour à tous

Je travaille avec ce code, mais le pb c'est que si on clique sur la barre de titre pour déplacer la fenêtre, tout est mis en pause (mon compte-a-rebours est stoppé...). Je n'arrive pas à trouver comment faire pour que ma boucle continue pendant ce temps...

Code : Tout sélectionner

a=300

If OpenWindow(0, 0, 0, 220, 100, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

   ButtonGadget  (1, 10, 60, 200, 30, "Fermer")
   
   Repeat
   
     a=a-1
     SetWindowTitle(0, Str(a))

     If a =0:MessageRequester("fin","fin"):End:EndIf
    
     Event = WaitWindowEvent(10)
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 
              CloseWindow(0)
              End  
         EndSelect
            
     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf
Alors j'ai bien essayé de l'afficher avec #PB_Window_BorderLess en remplacant le titre par un GadgetText
Le soucis c'est que ma fenêtre n'est plus déplacable (enfin en tout cas avec mon niveau de débutant)

Code : Tout sélectionner

a=300

If OpenWindow(0, 0, 0, 220, 100, "Exemple...", #PB_Window_BorderLess )
   TextGadget(0,10,10,200,20,"")
   ButtonGadget  (1, 10, 60, 200, 30, "Fermer")
   
   Repeat
   
     a=a-1
     SetGadgetText(0, Str(a))

     If a =0:MessageRequester("fin","fin"):End:EndIf
     
     Event = WaitWindowEvent(10)
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 
              CloseWindow(0)
              End  
         EndSelect
            
     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf
Idéalement j'aurais souhaité rester sur le code1
Mon petit doigt me dis que c'est Windows qui gère ce qui se passe quand je clique et déplace ma fenêtre et que ça va être compliqué et que c'est le code2 qui doit me permettre de gérer le déplacement de la fenêtre si on clique dessus et qu'on la déplace, mais alors là...??

je lui dis:
si la souris est dans ma fenetre et que mon clic gauche appuyé mémorise la position de ma souris
regarde ou elle bouge, et replace la fentre la ou elle est?? // il y a peut-être plus simple :lol:

Re: deplacer une fenetre malgré #PB_Window_BorderLess

Publié : lun. 14/août/2017 16:09
par microdevweb
Bonjour,

Voici une solution éventuel (fait à la vas vite je l'avoue)

Code : Tout sélectionner

Enumeration 
  #Form
  #Canvas
EndEnumeration
EnableExplicit
Structure Pos
  x.l
  y.l
EndStructure

Global gMouse.Pos,gOld.Pos,Win.pos,ClicOn.b=#False
Procedure Exit()
  CloseWindow(#Form)
  End
EndProcedure
Procedure MoveMyWindow()
  Protected Dep.Pos
  Select EventType()
    Case #PB_EventType_LeftButtonUp
      ClicOn=#False ; le bt gauche est relaché
    Case #PB_EventType_LeftButtonDown
      If Not ClicOn
        ; je mémorise les position pour
        ; calculer par après le déplacement
        CopyStructure(@gMouse,@gOld,Pos)
        ; ainsi que la position de la fenêtre
        win\x=WindowX(#Form)
        win\y=WindowY(#Form)
      EndIf
      ClicOn=#True
    Case #PB_EventType_MouseMove
      ; je sauve la position de la souris du bureau
      ExamineDesktops()
      gMouse\x=DesktopMouseX()
      gMouse\y=DesktopMouseY()
      ; REMARQUE: si la fenêtre appartient à une fenêtre mère
      ; j'utiliserais WindowMouseX(IdFenetre)
      If ClicOn ; le bt est enfoncé
                ; Calcul des déplacement
        dep\x=gMouse\x-gOld\x
        dep\y=gMouse\y-gOld\y
        ; Déplacement de la fenêtre
        ResizeWindow(#Form,win\x+dep\x,win\y+dep\y,#PB_Ignore,#PB_Ignore)
      EndIf
  EndSelect
EndProcedure
OpenWindow(#Form,0,0,200,300,"",#PB_Window_BorderLess)
; Le canvas va servir à gèrer les déplacement de souris et ainsi
; déplacer la fenêtre
CanvasGadget(#Canvas,0,0,200,300,#PB_Canvas_Container)
; Un raccourci pour sortir
AddKeyboardShortcut(#Form,#PB_Shortcut_Escape,$FF)
BindEvent(#PB_Event_Menu,@Exit(),#Form,$FF)
BindGadgetEvent(#Canvas,@MoveMyWindow())

Repeat
  WaitWindowEvent()
ForEver 


Re: deplacer une fenetre malgré #PB_Window_BorderLess

Publié : lun. 14/août/2017 16:12
par falsam
@microdevweb: Et le compteur on le voit ou ? :p

Souci non résolu cher ami ^-^

Re: deplacer une fenetre malgré #PB_Window_BorderLess

Publié : lun. 14/août/2017 16:13
par falsam
Seul solution à mon avis pour pouvoir déplacer une fenetre sans bloquer le compteur : LE THREAD.

Re: deplacer une fenetre malgré #PB_Window_BorderLess

Publié : lun. 14/août/2017 16:37
par Marc56
Voila l'adaptation d'un de mes vieux programmes.
(Que du pure basic, sans thread)

Déplacement d'une fenêtre sans bordure (fausse barre titre qui est en fait un canvas)
Compteur qui tourne toujours car dans une procédure Bind

Code : Tout sélectionner

Global Test.l, Quit.l

Enumeration
     #Main
EndEnumeration

Enumeration
     #Canvas
     #Button
     #Text
EndEnumeration

OpenWindow(#Main, 100, 100, 300, 100, "", #PB_Window_BorderLess | #PB_Window_BorderLess)
CanvasGadget(#Canvas, 0, 0, 300, 20)
TextGadget(#Text, 10, 50, 100, 30, "")
ButtonGadget(#Button, 250, 70, 40, 20, "Quit")

Procedure UpdateDate()
     SetGadgetText(#Text, FormatDate("%hh:%ii:%ss", Date()))
EndProcedure


BindGadgetEvent(#Text, @UpdateDate())

Repeat
     UpdateDate()
     Select WaitWindowEvent(10)
          Case #PB_Event_Gadget
               Select EventGadget()
                    Case #Canvas
                         Select  EventType()
                              Case #PB_EventType_LeftButtonDown
                                   Debug "#PB_EventType_LeftButtonDown"
                                   Test = 1
                                   MouseX1 = WindowX(#Main)
                                   MouseY1 = WindowY(#Main)
                                   MouseX2 = DesktopMouseX()
                                   MouseY2 = DesktopMouseY()
                                   DecalageX = MouseX2  - MouseX1
                                   DecalageY = MouseY2  - MouseY1         
                                   
                              Case #PB_EventType_MouseMove
                                   If Test = 1
                                        MouseX = DesktopMouseX()
                                        MouseY = DesktopMouseY() 
                                        x = MouseX - DecalageX
                                        y = MouseY - DecalageY
                                        ResizeWindow(#Main, x, y, #PB_Ignore, #PB_Ignore)
                                   EndIf
                                   
                              Case #PB_EventType_LeftButtonUp
                                   Test = 0 
                         EndSelect
                         
                    Case #Button
                         Quit = 1
                         
               EndSelect
               
     EndSelect
Until Quit = 1
À adapter et optimiser.

:wink:

Re: deplacer une fenetre malgré #PB_Window_BorderLess

Publié : lun. 14/août/2017 16:44
par falsam
Bien ton code Marc.

Ma petite contribution quand même avec un thread et uen fenetre classique.

Code : Tout sélectionner

CompilerIf Not #PB_Compiler_Thread
  CompilerError "L'option activer la gestion des thread doit etre activer!"
CompilerEndIf

Enumeration Window 
  #mf
EndEnumeration

Enumeration Gadget
  #mfCount
  #mfClose
EndEnumeration

Global Thread
Global a = 20000

;Plan de l'application
Declare Start()
Declare StartThread(*Value)
Declare Count()
Declare Exit()

Start()

Procedure Start()
  If OpenWindow(#mf, 0, 0, 220, 100, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    TextGadget(#mfCount, 10, 20, 50, 22, "0")
    ButtonGadget(#mfClose, 10, 60, 200, 30, "Fermer")    
    
    ;Lancement du thread
    Thread = CreateThread(@StartThread(), 0) 
    
    ;Evenements
    BindEvent(#PB_Event_CloseWindow, @Exit())
    BindGadgetEvent(#mfClose, @Exit())
    
    Repeat : WaitWindowEvent(1) : ForEver
  EndIf  
EndProcedure

Procedure StartThread(*Value)  
  Count()
  MessageRequester("fin","fin")
  End
EndProcedure

Procedure Count()
  While a <> 0
    a = a - 1
    SetGadgetText(#mfCount, Str(a))
  Wend 
EndProcedure

Procedure Exit()
  If IsThread(Thread)
    KillThread(Thread)
  EndIf
  
  End  
EndProcedure

Re: deplacer une fenetre malgré #PB_Window_BorderLess [RESO

Publié : lun. 14/août/2017 16:52
par david
@microdevweb : merci car je ne maîtrise pas trop les canvas, je vais pouvoir étudier tout ça en profitant du 15 aout...

@Marc56 : à adapter (un peu) certes, mais ça répond exactement à ma problématique. merci

@falsam : merci je vais pouvoir en même temps me pencher un peu plus sur les threads et apprendre encore plein de belles choses...

Re: deplacer une fenetre malgré #PB_Window_BorderLess [RESO

Publié : lun. 14/août/2017 17:43
par microdevweb
@Falsam,

Je n'ai pas lu le code je l'avoue... Seulement l’inoncé en vitesse.

Re: deplacer une fenetre malgré #PB_Window_BorderLess [RESO

Publié : mar. 15/août/2017 8:08
par microdevweb
J'ai modifié mon code qui ne fonctionnait pas correctement.