Page 2 sur 5
Re: Premiers essais avec PB
Publié : sam. 31/août/2013 17:47
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 ^^.
Re: Premiers essais avec PB
Publié : sam. 31/août/2013 19:11
par falsam
De quelle manière tu testes si une fenêtre est active ou pas ?
Re: Premiers essais avec PB
Publié : sam. 31/août/2013 19:49
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)
Re: Premiers essais avec PB
Publié : dim. 01/sept./2013 10:01
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.
Re: Premiers essais avec PB
Publié : dim. 01/sept./2013 11:21
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.
Re: Premiers essais avec PB
Publié : dim. 01/sept./2013 11:29
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.

Re: Premiers essais avec PB
Publié : dim. 01/sept./2013 17:15
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 ?
Re: Premiers essais avec PB
Publié : dim. 01/sept./2013 19:20
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
Re: Premiers essais avec PB
Publié : lun. 02/sept./2013 9:11
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 :
Re: Premiers essais avec PB
Publié : lun. 02/sept./2013 10:49
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 ?
Re: Premiers essais avec PB
Publié : lun. 02/sept./2013 10:50
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.
Re: Premiers essais avec PB
Publié : lun. 02/sept./2013 11:43
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, 
) place le curseur sur ce mot et presse la touche
F1 pour obtenir plus d'information.
Re: Premiers essais avec PB
Publié : lun. 02/sept./2013 14:20
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.
Re: Premiers essais avec PB
Publié : lun. 02/sept./2013 21:52
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

Re: Premiers essais avec PB
Publié : mar. 03/sept./2013 3:13
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

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