fenetre sans barre avec forme arrondi sur les bords

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

fenetre sans barre avec forme arrondi sur les bords

Message par Patix »

Bonjour,

J'ai vu que l'on pouvait créer des fenêtre de forme diverses (LSI) sans barre mais je n'ai pas trouvé d'exemples qui permettent de bouger ce type de fenetre (de forme et sans barre).

Est ce cela est possible ?
Si oui, ya t'il un exemple quelque part :-o
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ce code du soldat devrai marcher !

Code : Tout sélectionner

 ; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Donner à une fenêtre une forme spécifique. Par exemple faire une fenêtre ronde ou triangulaire.


Enumeration
    #Quitter
    #Forme1
    #Forme2
    #Forme3
    #Forme4
    #Forme5
EndEnumeration



Procedure Forme()
    If GetGadgetState(#Forme1) ; si on a choisi la forme 1
        
        Region = CreateRoundRectRgn_(0, 0, WindowWidth(), WindowHeight(), 40, 60) ; Création de la région pour faire une fenêtre avec les angles arrondis
        ; CreateRoundRectRgn_(X1, Y1, X2, Y2, R1, R2)
        ; X1, Y1 : coordonné du point haut gauche de la region
        ; X1, Y1 : coordonné du point haut gauche de la region
        ; R1, R2 : rayon de l'ellipse qui va servir à arrondir les angles de la region
        SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
        DeleteObject_(Region) ; On supprime la région
        
    ElseIf GetGadgetState(#Forme2) ; si on a choisi la forme 2
        
        Region = CreateEllipticRgn_(0, 0, WindowWidth(), WindowHeight()) ; Création de la région pour faire une fenêtre elliptique
        ; CreateEllipticRgn_(X1, Y1, X2, Y2)
        ; X1, Y1 : coordonné du point haut gauche de la region
        ; X1, Y1 : coordonné du point haut gauche de la region
        SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
        DeleteObject_(Region) ; On supprime la région
        
    ElseIf GetGadgetState(#Forme3) ; si on a choisi la forme 3
        
        Region = CreatePolygonRgn_(?Triangle, 4, #ALTERNATE) ; Création de la région pour faire une fenêtre elliptique
        ; CreateRoundRectRgn_(Array, NbPoints, Type)
        ; Array : Adresse de la liste ou de la Data
        ; NbPoints : Nombre de points du polygone + 1 (car on fait une boucle donc on a 2 fois le premier point)
        ; Type : Voir msdn
        SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
        DeleteObject_(Region) ; On supprime la région
        
    ElseIf GetGadgetState(#Forme4) ; si on a choisi la forme 4
        
        Region1 = CreateRectRgn_(0, 0, WindowWidth(), WindowHeight()) ; Création d'une région en rectangle
        Region2 = CreateRectRgn_(10, 10, WindowWidth() - 10, 50) ; Création d'une région en rectangle
        ; CreateRectRgn_(X1, Y1, X2, Y2)
        ; X1, Y1 : coordonné du point haut gauche de la region
        ; X1, Y1 : coordonné du point haut gauche de la region
        CombineRgn_(Region1, Region1, Region2, #RGN_DIFF) ; On combine les 2 régions
        ; Les modes suivants sont disponibles :
        ; #RGN_AND : Intersection
        ; #RGN_OR : Union
        ; #RGN_DIFF : Différences
        ; #RGN_XOR : Union moins les intersections
        SetWindowRgn_(WindowID(), Region1, #True) ; On applique la région finale
        DeleteObject_(Region1) ; On supprime les régions
        DeleteObject_(Region2)
        
    ElseIf GetGadgetState(#Forme5) ; si on a choisi la forme 5
        
        Region1 = CreatePolygonRgn_(?Triangle, 4, #ALTERNATE)
        Region2 = CreateEllipticRgn_(0, 0, WindowWidth(), WindowHeight())
        CombineRgn_(Region1, Region1, Region2, #RGN_OR) ; On combine les 2 régions
        SetWindowRgn_(WindowID(), Region1, #True) ; On applique la région finale
        DeleteObject_(Region1) ; On supprime les régions
        DeleteObject_(Region2)
        
    EndIf
EndProcedure




; Création de la fenêtre et dela GadgetList
If OpenWindow(0, 0, 0, 400, 400,  #PB_Window_ScreenCentered, "Test") = 0 Or CreateGadgetList(WindowID(0)) = 0
    End
EndIf

; Création des boutons et de l'option d'affichage
ButtonGadget(#Quitter, 100, 100, 200, 20, "Quitter")
OptionGadget(#Forme1, 100, 125, 200, 15, "Angles arrondis")
OptionGadget(#Forme2, 100, 140, 200, 15, "Ronde")
OptionGadget(#Forme3, 100, 155, 200, 15, "Triangle")
OptionGadget(#Forme4, 100, 170, 200, 15, "Trouée")
OptionGadget(#Forme5, 100, 185, 200, 15, "Triangle + Rond")


Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_EventGadget
        Select EventGadgetID() ; boutons, zone de texte, ...
            Case #Quitter
                Event = #PB_EventCloseWindow ; On quitte
            Default
                Forme() ; sinon, on change la forme de la fenêtre
        EndSelect
    EndIf
    
Until Event = #PB_EventCloseWindow

End



DataSection
Triangle :
Data.l 200, 400, 0, 0, 400, 0, 200, 400 ; Coordonnées des points du triangle en x, y (il faut faire une boucle donc on revient au premier point du triangle
EndDataSection

ou bien ceci : click bouton droit dessus popur quitter !! :D

Code : Tout sélectionner

;- Window Constants
;
#Window_0 = 0
#SizeWindowX = 300
#SizeWindowY = 200

Procedure Open_Window_0()
  
  If OpenWindow(#Window_0, 366, 211, #SizeWindowX, #SizeWindowY, #PB_Window_BorderLess, "New window ( 0 )")
    If CreateGadgetList(WindowID())
    EndIf
  EndIf
EndProcedure

;- debut du prog

Open_Window_0()

Repeat
  Select WaitWindowEvent()
    Case #WM_LBUTTONDOWN
      SendMessage_(WindowID(), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
    Case #WM_rBUTTONDOWN
      Event = #PB_EventCloseWindow
  EndSelect
  
Until Event = #PB_EventCloseWindow
End 
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Message par Patix »

ouaouuuuuuh, que de bonheur :-)

Réponse hyper rapide. J'ai de quoi m'amuser.

Merci
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Message par Patix »

bonjour,

J'ai testé et j'ai une question supplémentaire :

Voici le code de test :

Code : Tout sélectionner

UseJPEGImageDecoder()

;- Window Constants
;
#Window_0 = 0
#SizeWindowX = 300
#SizeWindowY = 200

Procedure Open_Window_0()
 
  If OpenWindow(#Window_0, 366, 211, #SizeWindowX, #SizeWindowY, #PB_Window_BorderLess, "New window ( 0 )")
    If CreateGadgetList(WindowID())
    ButtonGadget(1, 20, 40, 60, 20, "Left Button", #PB_Button_Left)

    If LoadImage(0, "valerio2.jpg")    ; change 2nd parameter to the path/filename of your image
      ImageGadget(0, 0,0,100,83,UseImage(0))                      ; imagegadget standard
    EndIf

    EndIf
  EndIf
  Region = CreateRoundRectRgn_(0, 0, WindowWidth(), WindowHeight(), 20, 20) ; Création de la région pour faire une fenêtre avec les angles arrondis
  ; CreateRoundRectRgn_(X1, Y1, X2, Y2, R1, R2)
  ; X1, Y1 : coordonné du point haut gauche de la region
  ; X1, Y1 : coordonné du point haut gauche de la region
  ; R1, R2 : rayon de l'ellipse qui va servir à arrondir les angles de la region
  SetWindowRgn_(WindowID(), Region, #True) ; On applique la région
  DeleteObject_(Region) ; On supprime la région
  
EndProcedure

;- debut du prog

Open_Window_0()


Repeat
  Select WaitWindowEvent()
    Case #WM_LBUTTONDOWN
      SendMessage_(WindowID(), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
    Case #WM_RBUTTONDOWN
      Event = #PB_EventCloseWindow
  EndSelect
 
Until Event = #PB_EventCloseWindow
End
J'ai voulu mettre une image (qui fait la taille de la fenetre) et je n'arrive plus à bouger la fenêtre.
Euh pourquoi ? Est ce le fait d'avoir une fenêtre de forme ?

Si quelqu'un peut m'aider pour que ça marche :-o

Le but étant de créer une déco à la fenêtre entière
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tout se passe comme si ImageGadget(0, 0,0,100,83,UseImage(0))
bloquais les messages d'events !! 8O

lorsqu'on le met en rem , tout marche , des qu'on l'active tout se bloc !
cela ressemblerai a un bug de 3.94 que ça m'etonnerai pas ! :?
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

J'avais eu le meme probleme que j'ai du contourner, il semblerait qu'en ajoutant une image background a la fenetre, le focus devient actif sur l'image, il faut donc faire un PB_Event_Gadget et ca marche, ajoute en debut de ton "Repeat" ces deux lignes :

Case #PB_Event_Gadget
SendMessage_(WindowID(), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)

c'est basique comme ca, il faut donner a ton image une identification avec PB_Any et faire egallement un test pour verifier que le click a bien ete fait sur l'imagegadget...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

#WM_LBUTTONDOWN

Ce message est envoyé par la fenêtre lorsqu'on clique sur celle-ci.

Si on clique sur un gadget, c'est un autre message qui est envoyé,
que l'on récupère ainsi:

Code : Tout sélectionner

    Case #PB_Event_Gadget 
      Select EventGadgetID()
        Case #id_image
          Select EventType()
            Case #PB_EventType_LeftClick
              Debug "Clique gauche sur le gadget
          EndSelect   
      EndSelect 
Par contre, il y a un bug concernant #WM_RBUTTONDOWN car ce message est envoyé même si on fait un clique droit sur un Gadget.

Soit Fred l'a voulu ainsi, donc effectivement, il y a une erreur concernant
#WM_LBUTTONDOWN que le Gadget devrait envoyer.

Soit l'erreur concerne #WM_RBUTTONDOWN, mais envoyer deux messages pour un même évènement ne sert pas à grand chose.

Je ne sais comment les anciennes versions traitaient ces messages, mais de toutes façon, il y a un problème!
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Message par Patix »

Merci, ça marche bien :-). Cela ouvre des ouvertures en présentation.

Je ne maitrise pas bien l'utilisation des expressions #WM_NCLBUTTONDOWN, #.....
Y a t'il quelquepart une doc qui pourrait m'aider ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

MSDN si l'anglais ne te fait pas horreur.

http://msdn.microsoft.com/library/defau ... einput.asp
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Message par Patix »

Merci, je verrai jusqu'au peuvent aller mes cours d'anglais :-)
Répondre