Premiers essais avec PB

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Premiers essais avec PB

Message par blendman »

Mesa a écrit :saut de ligne : chr(10)
Retour chariot : chr(13)
Espace : chr(32)

Suivant les systèmes d'exploitation, la touche Entrée envoie un Retour chariot : chr(13) ou un Saut de ligne : chr(10) + Retour chariot : chr(13).
Ah oui, tiens, j'avais trouvé un code sur le forum anglais mais plein de touches fonctionnent mais ne correspondent pas au code ascii.
Mince, désolé.

Merci pour la rectification, ça me sera utile à moi aussi en fait ^^.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Premiers essais avec PB

Message par falsam »

De quelle manière tu testes si une fenêtre est active ou pas ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
squale
Messages : 22
Inscription : mer. 28/août/2013 22:30
Localisation : Strasbourg
Contact :

Re: Premiers essais avec PB

Message par squale »

Code : Tout sélectionner

 

LargeurFenetre = 500
HauteurFenetre = 700




If OpenWindow(0, 0, 0 , LargeurFenetre, HauteurFenetre, "DELUGE v0.02",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered)


bouton =  ButtonGadget(#PB_Any  , 170, 126, 100, 24, "NOUVELLE FENETRE")  

EndIf

Repeat
    
    Event = WaitWindowEvent()
    
   
       
        
        If  Event = #PB_Event_Gadget
          
          Select EventGadget()
              
            Case bouton
              
              OpenWindow(1, 100,100, 826, 600, "NOUVELLE FENTRE")
                  ScrollAreaGadget(#PB_Any , 0, 0 , 826, 600, 800, 1147)
                  ImageGadget(1001, 0, 0 , 800, 1147, ImageID(1001))
                  StringGadget(193, 420, 120, 360, 24, "", #PB_String_BorderLess)


         EndSelect

        Select EventWindow()
              
              
              
            Case 0
              Select Event
                  Case #PB_Event_CloseWindow
                    CloseWindow(#PB_All)
                    Break 
              EndSelect
              
            Case 1  
              Select Event
                  Case #PB_Event_CloseWindow
                  CloseWindow(1)
              EndSelect

        EndSelect

  ForEver
 EndIf 

Voila une partie de mon code, en fait je teste quelle fenetre est active pour la fermer elle ou les deux en fonction des cas. Mais je ne sais pas ce qui permet de rendre le gadget : StringGadget(193, 420, 120, 360, 24, "", #PB_String_BorderLess)
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Premiers essais avec PB

Message par Mesa »

Il y a un exemple ici http://www.purebasic.fr/french/viewtopi ... =1&t=12837

ou bien comme ça:

Code : Tout sélectionner


LargeurFenetre = 500
HauteurFenetre = 700

If OpenWindow(0, 0, 0 , LargeurFenetre, HauteurFenetre, "DELUGE v0.02",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  
  bouton =  ButtonGadget(#PB_Any  , 170, 126, 100, 24, "NOUVELLE FENETRE")  
  
;EndIf ; le mettre à la fin car si la fenetre ne peut pas s'ouvrir alors pas de boucle sinon  plantage

Repeat
  
  Event = WaitWindowEvent()
  Select event
      
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
        Case bouton
          
          OpenWindow(1, 100,100, 826, 600, "NOUVELLE FENTRE fille",#PB_Window_SystemMenu ,0)
          ScrollAreaGadget(#PB_Any , 0, 0 , 826, 600, 800, 1147)
          CreateImage(1001,100,100,32)
          ImageGadget(1001, 0, 0 , 800, 1147, ImageID(1001))
          StringGadget(193, 420, 120, 360, 24, "", #PB_String_BorderLess)
          
          
      EndSelect
      
      
    Case #PB_Event_CloseWindow
      EventFenetre2 = EventWindow()
      ;Bizarrement, si on remplace le "select" ci-dessous par des "if", c'est plus compliqué
      Select EventFenetre2
          Case 0   
            CloseWindow(0) ; fenetre principale ferme toutes les fen filles
            End
        Case 1   
        CloseWindow(1) ; fen fille
       EndSelect
  EndSelect
  
 
ForEver
EndIf 
End
Mesa.
Avatar de l’utilisateur
squale
Messages : 22
Inscription : mer. 28/août/2013 22:30
Localisation : Strasbourg
Contact :

Re: Premiers essais avec PB

Message par squale »

Merci beaucoup mon code est beaucoup plus clair maintenant !

Par contre je viens de me rendre compte que mon gaget n'était pas activé à cause de mon image qui est en fond et j'imagine qu'elle passe dessus et pas dessous.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Premiers essais avec PB

Message par falsam »

squale a écrit :Merci beaucoup mon code est beaucoup plus clair maintenant !

Par contre je viens de me rendre compte que mon gaget n'était pas activé à cause de mon image qui est en fond et j'imagine qu'elle passe dessus et pas dessous.
Je pense que tu imagines bien. :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
squale
Messages : 22
Inscription : mer. 28/août/2013 22:30
Localisation : Strasbourg
Contact :

Re: Premiers essais avec PB

Message par squale »

Est-ce qu'il faut définir l'image comme un background ou il y a un système de layout ? J'ai essayé d'inverser l'ordre en mettant d'abord le string puis ensuite l'image, ça marche mais le champ n'apparaît que lorsque la souris est dessus.

Faut-il passer par un canvas ?
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Premiers essais avec PB

Message par falsam »

Squale il va falloir soigner un peu plus tes codes. Ton extrait est moisi !

Mettre un StringGadget sur une image n'est pas possible sans passer par un API (Application Programming Interface) propre à chaque system d'exploitation.

La solution que je te donne est propre à Microsoft. Les API ne sont pas documentés dans l'aide de Pure Basic (Voir FAQ).

J'ai structuré et commenté un peu (beaucoup) ton code.

Code : Tout sélectionner

Enumeration #PB_Compiler_EnumerationValue
  #Mainform1
  #CallMainForm2
EndEnumeration

Enumeration #PB_Compiler_EnumerationValue
  #Mainform2
  #Scroll
  #Image
  #String
EndEnumeration

Define.l Event, WEvent, MEvent, GEvent, TEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered

; Couleurs pour le TextGadget
Global textBGbrush, textFGcolor
textBGcolor = RGB(155, 200, 155)
textBGbrush = CreateSolidBrush_(textBGcolor)
textFGcolor = RGB(0, 100, 0)

;Fenêtre principale dans une procédure
Procedure Open_MainForm1()
  OpenWindow(#Mainform1, 0, 0, 500, 700, "DELUGE v0.02", WindowStyle)
  ButtonGadget(#CallMainForm2, 170, 126, 120, 24, "NOUVELLE FENETRE")
EndProcedure

;Fenetre secondaire dans une procédure
Procedure Open_MainForm2()
  Protected Image
  
  ;Creation de l'image
  Image = CreateImage(#PB_Any, 100, 100, 32) ;Création d'une image vierge
  StartDrawing(ImageOutput(Image)) ;On commence à déssiner
  Box(0, 0, 100, 100, RGB(255, 215, 0))
  StopDrawing() ;On arrete de déssiner 
  
  OpenWindow(#Mainform2, 0, 0, 826, 600, "NOUVELLE FENTRE")
  ;SetWindowCallback(@WindowCallback())
  ScrollAreaGadget(#Scroll , 0, 0 , 826, 600, 800, 1147)
    
  StringGadget(#String, 10, 10, 80, 24, "", #PB_String_BorderLess)
  
  ;Image en dernier
  ImageGadget(#Image, 0, 0 , 0, 0, ImageID(Image))
  
  ;Ajouter le style WS_CLIPSIBLINGS à l'ImageGadget
  SetWindowLong_(GadgetID(#Image), #GWL_STYLE, GetWindowLong_(GadgetID(#Image), #GWL_STYLE) | #WS_CLIPSIBLINGS)

EndProcedure

;-Start
Open_MainForm1()

;Boucle évenementielle
Repeat
  ;Un évenement se produit
  Event  = WaitWindowEvent() 
  
  ;Quelle est la fenêtre qui a crée l'évenement.
  WEvent = EventWindow() 
  
  ;Quelle est le gadget qui a crée l'évenement.
  GEvent = EventGadget()
  
  Select Event
      
    Case #PB_Event_Gadget ;-Evenement gadgets
      Select GEvent
        Case #CallMainForm2
          ;Si la fenetre MainForm2 n'est pas ouverte : On l'ouvre
          ;Sinon on se positionne sur la fenetre Mainform2
          If Not IsWindow(#Mainform2) 
            Open_MainForm2()
          Else
            SetActiveWindow(#Mainform2)
          EndIf
          
      EndSelect
        
    Case #PB_Event_CloseWindow ;-Evenement fenetres
      ;Quelle est la fenetre qui se ferme ?
      Select WEvent
        Case #Mainform1
          End
          
        Case #Mainform2
          CloseWindow(#Mainform2)
      EndSelect
      
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Premiers essais avec PB

Message par blendman »

salut Squale

J'ai remarqué une chose sur ton code, sur ces lignes-ci :

Code : Tout sélectionner

CreateImage(1001,100,100,32)
ImageGadget(1001, 0, 0 , 800, 1147, ImageID(1001))
StringGadget(193, 420, 120, 360, 24, "", #PB_String_BorderLess)
Tu crées une image avec un numéro d'identification très haut 1001, ainsi que 2 deux gadgets avec des numéro d'identification eux aussi élevé alors que tu n'as que 3 gadgets sur cet exemple. En faisant cela, tu crées 1000 numéro d'identification pour image vide, ce qui prend un peu de ressources pour rien me semble-t-il.
Je te conseille d'utiliser la méthode des enumeration/endenumration au départ pour tes gadgets :

Code : Tout sélectionner

Enumeration ; images
# image1
EndEnumeration

Enumeration ; gadgets
#Imagegadget1
#StringGadget1
EndEnumeration

CreateImage(#image1,100,100,32)
ImageGadget(Imagegadget1, 0, 0 , 800, 1147, ImageID(1001))
StringGadget(StringGadget1, 420, 120, 360, 24, "", #PB_String_BorderLess)
ou encore :

Code : Tout sélectionner

NomDuGadget = StringGadget(#pb_any, 420, 120, 360, 24, "")
Avatar de l’utilisateur
squale
Messages : 22
Inscription : mer. 28/août/2013 22:30
Localisation : Strasbourg
Contact :

Re: Premiers essais avec PB

Message par squale »

Merci à tous les deux, j'ai du boulot :( je vais essayer de faire un code moins moisi.
Mais le truc c'est comment savoir si je dois regarder au niveau de purebasic ou de l'api windows ?

Blendman, j'ai une question, les numéraux d'allocation sont communs ou par genre ? Puis-je avoir un 1 pour une image et un 1 pour un gadget dans le même code ?
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Premiers essais avec PB

Message par Mesa »

L'utilisation du "container" permet de mettre de la couleur sans utiliser les APIs.

Code : Tout sélectionner


LargeurFenetre = 500
HauteurFenetre = 700

If OpenWindow(0, 0, 0 , LargeurFenetre, HauteurFenetre, "DELUGE v0.02",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  
  bouton =  ButtonGadget(#PB_Any  , 170, 126, 200, 24, "NOUVELLE FENETRE")  
  
  ;EndIf ; le mettre à la fin car si la fenetre ne peut pas s'ouvrir alors pas de boucle sinon  plantage
  
  
  
  Repeat
    
    Event = WaitWindowEvent()
    Select event
        
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
            
          Case bouton
            
            OpenWindow(1, 100,100, 826, 600, "NOUVELLE FENTRE fille",#PB_Window_SystemMenu ,0)
            ScrollAreaGadget(1 , 0, 0 , 826, 600, 800, 1147)
            
            ContainerGadget(2,0,0,400,100,#PB_Container_Flat)
            SetGadgetColor(2, #PB_Gadget_BackColor, RGB(230, 190, 100))  ; couleur de fond du container
            StringGadget(3, 10, 10, 360, 24, "", #PB_String_BorderLess)  ; on met tous les gadgets dans le container...
            SetGadgetColor(3, #PB_Gadget_BackColor, RGB(80, 190, 100))   ; couleur de fond du StringGadget
            SetGadgetColor(3, #PB_Gadget_FrontColor, RGB(255, 255, 255)) ; couleur du texte du StringGadget
            
            CloseGadgetList() 
            SetActiveGadget(3) ; le stringgadget a le focus clavier
            
            
        EndSelect
        
        
      Case #PB_Event_CloseWindow
        EventFenetre2 = EventWindow()
        ;Bizarrement, si on remplace le "select" ci-dessous par des "if", c'est plus compliqué
        Select EventFenetre2
          Case 0   
            CloseWindow(0) ; fenetre principale ferme toutes les fen filles
            End
          Case 1   
            CloseWindow(1) ; la fenêtre fille et tous ses gadgets sont détruits
        EndSelect
    EndSelect
    
    
  ForEver
EndIf 
End

Mesa.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Premiers essais avec PB

Message par falsam »

squale a écrit : j'ai une question, les numéraux d'allocation sont communs ou par genre ? Puis-je avoir un 1 pour une image et un 1 pour un gadget dans le même code ?
Ni l'un ni l'autre. Si tu utilises Enumeration .... EndEnumeration, la numérotation se fait de maniére incrémentale à partir de 0.

Code : Tout sélectionner

Enumeration
  #Form
  #String1
  #String2
  #Image
  #Etc
EndEnumeration

Debug #form
Debug #String1
Debug #String2
Debug #Image
Debug #Etc
Tu peux forcer la numérotation. Pour plus d'information regarde l'aide en ligne http://purebasic.developpez.com/documen ... tions.html

PS : Quand tu écris un code et que tu as un doute sur un mot réservé (Par exemple Enumeration, :mrgreen: ) place le curseur sur ce mot et presse la touche F1 pour obtenir plus d'information.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Fred
Site Admin
Messages : 2805
Inscription : mer. 21/janv./2004 11:03

Re: Premiers essais avec PB

Message par Fred »

squale a écrit :Blendman, j'ai une question, les numéraux d'allocation sont communs ou par genre ? Puis-je avoir un 1 pour une image et un 1 pour un gadget dans le même code ?
Oui, chaque objet a son propre espace, donc le mieux est d'utiliser une enumeration par type d'objet.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Premiers essais avec PB

Message par falsam »

Fred a écrit :[chaque objet a son propre espace, donc le mieux est d'utiliser une enumeration par type d'objet.

Code : Tout sélectionner

Enumeration
  #Form
  #String1
  #String2
  #Image
  #Etc
EndEnumeration

Enumeration
  #Test
EndEnumeration

Debug #form
Debug #String1
Debug #String2
Debug #Image
Debug #Etc

Debug #Test
Ok ..... j'ai dit une bêtise précédement :oops:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Premiers essais avec PB

Message par graph100 »

falsam a écrit :
Fred a écrit :[chaque objet a son propre espace, donc le mieux est d'utiliser une enumeration par type d'objet.

Code : Tout sélectionner

Enumeration
  #Form
  #String1
  #String2
  #Image
  #Etc
EndEnumeration

Enumeration
  #Test
EndEnumeration

Debug #form
Debug #String1
Debug #String2
Debug #Image
Debug #Etc

Debug #Test
Ok ..... j'ai dit une bêtise précédement :oops:
Oui ! et une grosse !

De fait, tu as confondu l'énumération et les types d'objets énumérés.
Pour être entièrement correct il faut énumérer chaque type d'objet dans une énumération différente car leurs indices n'a aucun liens entre eux.

Une fenêtre a un indice qui liste les fenêtres, et un gadget, bah l'indice liste les gadgets. En revanche, tout les types de gadgets rentrent dans la même liste.
La logique est la même pour tous les objets purebasic qui ont un indice, comme les images, les sprites, les modèles 3d, les sons etc...

Code : Tout sélectionner

Enumeration 0; fenêtres
	#Form_principale
	#form_secondaire
	#autre_form
EndEnumeration
	
Enumeration 0; gadgets
  #String1
  #String2
  #Imagegadget
  #Etc
EndEnumeration

Enumeration 0; images
  #image_de_fond
EndEnumeration


#Test = 12 ; Constante personnalisée

Debug #Form_principale
Debug #form_secondaire
Debug #autre_form

Debug #String1
Debug #String2
Debug #Imagegadget
Debug #Etc

Debug #image_de_fond

Debug #Test
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre