FAQ PureBasicConsultez toutes les FAQ
Nombre d'auteurs : 7, nombre de questions : 68, dernière mise à jour : 3 janvier 2013 Ajouter une question
Bienvenue dans la F.A.Q. PureBasic !
Celle-ci va tenter de répondre aux questions les plus fréquemment posées sur le langage PureBasic et tous ses outils de programmation. Si elle n'a pas pour vocation de répondre à toutes les interrogations possibles, elle reste une bonne base de connaissances sur le PureBasic, et ne demande qu'à être enrichie par vos expériences personnelles.
Bien entendu, malgré toute l'attention qui a pu être portée à cette F.A.Q., des erreurs ont toujours pu s'y glisser. Prenez donc toutes les précautions qui s'imposent avant d'essayer un exemple.
Nous vous souhaitons une bonne lecture ! Et n'oubliez pas qu'en cas de problème, vous pourrez toujours poser votre question sur le forum PureBasic !
L'équipe PureBasic de Developpez.
- 15.1. ComboBox Gadget (2)
- 15.2. Date Gadget (1)
- 15.3. Editor Gadget (1)
- 15.4. ListIcon Gadget (3)
- 15.5. Panel Gadget (1)
- 15.6. String Gadget (6)
La gestion des gadgets dans une fenêtre est réalisée via une GadgetList. Il suffit d'ouvrir cette GadgetList et d'y ajouter le gadget souhaité.
Code purebasic : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | Declare AjouteGadget(No, x, y, width, height, texte.s) If OpenWindow(0, 100, 200, 200, 200, "Ajout gadgets") ;Ajoute un bouton ButtonGadget(0, 0, 0, 100, 100, "Bouton 0") Repeat EventID = WaitWindowEvent() If EventID = #PB_Event_CloseWindow Quit = 1 ElseIf EventID = #PB_Event_Gadget Select EventGadget() Case 0 AjouteGadget(1, 100, 100, 100, 100, "Bouton 1") Case 1 If IsGadget(2)=0 ; Test si le gadget n'existe pas AjouteGadget(2, 0, 100, 100, 100, "Bouton 2") EndIf EndSelect EndIf Until Quit = 1 EndIf Procedure AjouteGadget(No, x, y, width, height, texte.s) ; Ouvre la liste de gadgets If UseGadgetList(WindowID(0)) ButtonGadget(No, x, y, width, height, texte) EndIf EndProcedure |
En testant le message #WM_SETCURSOR
- wParam renvoie le Handle du gadget sur lequel se trouve la souris.
- GetDlgCtrlID_() renvoie l'identifiant du gadget.
Il faut que l'ID du Gadget soit supérieur à zéro car le message renvoie null s'il n'est pas au dessus un Gadget.
De plus le gadget ne sera pas détecté s'il est désactivé.
Code purebasic : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Procedure ProcedureCallback(WindowID, Message, wParam, lParam) Select Message Case #WM_SETCURSOR ;Affiche le Handle et l'identifiant du gadget dans la barre de titre SetWindowTitle(0,"Handle= "+Str(wParam)+" , "+"ID= "+Str(GetDlgCtrlID_(wParam))) EndSelect ProcedureReturn #PB_ProcessPureBasicEvents EndProcedure Enumeration #Window #StringG ;ID=1 #Button ;ID=2 #CheckBox ;ID=3 EndEnumeration If OpenWindow(#Window,0,0,400,400,"PureBasic",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) StringGadget(#StringG , 20, 20, 200, 20, "StringGadget Normal ...") ButtonGadget(#Button , 20, 60, 200, 20, "Bouton Standard") CheckBoxGadget(#CheckBox, 20, 100, 200, 20, "CheckBox standard") ;DisableGadget(#Button,1) SetWindowCallback(@ProcedureCallback()) Repeat EventID.l=WaitWindowEvent() Select EventID Case #WM_CLOSE Quit=1 EndSelect Until Quit=1 EndIf |
Valable avec Windows uniquement (utilisation de l'API).Au départ le bouton 1 est caché, il sera affiché si vous cliquez entre les 2 boutons qui apparaissent à l'écran.
ChildWindowFromPoint_() renvoie le handle du gadget se trouvant sous la souris.
Code purebasic : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ButtonGadget(0, 10, 10, 200, 30, "Clic en dessous de moi") ButtonGadget(1, 10, 40, 200, 30, "Salut ... Je dormais !!!") ButtonGadget(2, 10, 70, 200, 30, "Clic au dessus de moi") HideGadget(1, 1) Repeat event = WaitWindowEvent() If event = #WM_LBUTTONDOWN rc = ChildWindowFromPoint_(WindowID(0), WindowMouseX(0) | WindowMouseY(0) << 32) If rc = GadgetID(1) HideGadget(1, 0) EndIf EndIf Until event = #PB_Event_CloseWindow EndIf |
En utilisant la fonction SetWindowTheme_() qui permet de changer le style d'une fenêtre.
Utilisez la fonction GadgetID() pour indiquer l'identifiant du gadget à modifier.
Code purebasic : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ;Activer les thèmes XP dans les options du compilateur avant de lancer ce code If OpenWindow(0, 0, 0, 220, 230, "Switch gadget's XP style", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) CompilerIf #PB_Compiler_Version < 430 CreateGadgetList(WindowID(0)) CompilerEndIf CalendarGadget(0, 10, 10, 200, 180) ButtonGadget(1, 10, 200, 200, 20, "Switch XP style") Repeat WindowEvent = WaitWindowEvent() If WindowEvent = #PB_Event_Gadget If EventGadget() = 1 If XPStyle SetWindowTheme_(GadgetID(0), @" ", @" ") XPStyle = #False Else SetWindowTheme_(GadgetID(0), 0, 0) XPStyle = #True EndIf EndIf EndIf Until WindowEvent = #PB_Event_CloseWindow EndIf |
PureBasic permet d'associer une simple valeur à n'importe quel gadget en utilisant les fonctions Set/GetGadgetData().
Ce code montre comment étendre cette possibilité pour associer autant de propriétés que l'on souhaite à un gadget en utilisant une map imbriquée dans une structure (valable à partir de la version 4.50). Le principe est similaire aux fonctions Set/GetProp_() de l'API Windows, tout en étant compatible avec toutes les plateformes supportées par PureBasic. Il est également très simple de le modifier pour ajouter d'autres informations comme des chaînes de caractères dans les propriétés.
Avant de supprimer un gadget avec des propriétés, appelez la fonction RemoveAllProps() en premier pour libérer la mémoire associée aux propriétés.
Vous pouvez aussi utiliser la fonction ClearList(AllPropMaps()), mais le pointeur stocké par SetGadgetData() sera faux, aussi faites le seulement si vous supprimez aussi tous les gadgets.
Solution proposée par Freak :
Code purebasic : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | ; Structure to store the property map. You can easily modify this to store other stuff than just an integer value ; A pointer to this structure is stored with Set/GetGadgetData() for every gadget that you set properties on ; Structure PropMap Map Props.i() EndStructure ; Store all the Map structures in a global list. This way a simple ClearList() cleans everything up, and ; there is no need to worry about things like Initialize/ClearStructure() which we would have to do for ; allocated memory blocks ; Global NewList AllPropMaps.PropMap() ; Helper function: ; Returns the PropMap structure for #Gadget, Create specifies wether or not to create ; one if none exists. ; Procedure GetPropMap(Gadget, Create) *PropMap.PropMap = GetGadgetData(Gadget) If *PropMap = 0 And Create AddElement(AllPropMaps()) *PropMap = @AllPropMaps() SetGadgetData(Gadget, *PropMap) EndIf ProcedureReturn *PropMap EndProcedure ; Set a property on the given #Gadget ; Procedure SetProp(Gadget, Name$, Value) *PropMap.PropMap = GetPropMap(Gadget, #True) *PropMap\Props(Name$) = Value EndProcedure ; Get a property from the given #Gadget. Returns 0 if the property does not exist ; Procedure GetProp(Gadget, Name$) *PropMap.PropMap = GetPropMap(Gadget, #False) If *PropMap ProcedureReturn *PropMap\Props(Name$) Else ProcedureReturn 0 EndIf EndProcedure ; Remove a peoperty from the given #Gadget (if it exists) ; Procedure RemoveProp(Gadget, Name$) *PropMap.PropMap = GetPropMap(Gadget, #False) If *PropMap DeleteMapElement(*PropMap\Props(), Name$) EndIf EndProcedure ; Remove all properties (and the map) from a given #Gadget. ; This should be called before FreeGadget() to make sure there are no leaks ; Procedure RemoveAllProps(Gadget) *PropMap.PropMap = GetPropMap(Gadget, #False) If *PropMap ChangeCurrentElement(AllPropMaps(), *PropMap) DeleteElement(AllPropMaps()) SetGadgetData(Gadget, 0) EndIf EndProcedure ; Example ; Enumeration #Spin1 #Spin2 #Text1 #Text2 EndEnumeration If OpenWindow(0, 0, 0, 210, 100, "SpinGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) SpinGadget(#Spin1, 20, 20, 80, 25, 0, 100, #PB_Spin_Numeric) SpinGadget(#Spin2, 20, 55, 80, 25, 0, 100, #PB_Spin_Numeric) TextGadget(#Text1, 110, 20, 80, 25, "", #PB_Text_Border) TextGadget(#Text2, 110, 55, 80, 25, "", #PB_Text_Border) SetProp(#Spin1, "TextGadget", #Text1) SetProp(#Spin1, "Multiplier", 5) SetGadgetState(#Spin1, 0) SetProp(#Spin2, "TextGadget", #Text2) SetProp(#Spin2, "Multiplier", 10) SetGadgetState(#Spin2, 0) Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget Gadget = EventGadget() SetGadgetText(GetProp(Gadget, "TextGadget"), Str(GetGadgetState(Gadget) * GetProp(Gadget, "Multiplier"))) EndIf Until Event = #PB_Event_CloseWindow EndIf |
Vous pouvez aussi utiliser une map globale à la place d'une liste, et il n'est plus nécessaire d'associer un pointeur aux gadgets avec les fonctions Get/SetGadgetData():
Code purebasic : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | ; Structure to store the property map. You can easily modify this to store other stuff than just an integer value ; A pointer to this structure is stored with Set/GetGadgetData() for every gadget that you set properties on ; Structure PropMap Map Props.i() EndStructure ; Store all the Map structures in a global map. This way a simple ClearMap() cleans everything up, and ; there is no need to worry about things like Initialize/ClearStructure() which we would have to do for ; allocated memory blocks ; Global NewMap AllPropMaps.PropMap() ; Set a property on the given #Gadget ; Procedure SetProp(Gadget, Name$, Value) AllPropMaps(Str(Gadget))\Props(Name$) = Value EndProcedure ; Get a property from the given #Gadget. Returns 0 if the property does not exist ; Procedure GetProp(Gadget, Name$) If AllPropMaps(Str(Gadget)) ProcedureReturn AllPropMaps()\Props(Name$) Else ProcedureReturn 0 EndIf EndProcedure ; Remove a property from the given #Gadget (if it exists) ; Procedure RemoveProp(Gadget, Name$) If AllPropMaps(Str(Gadget)) DeleteMapElement(AllPropMaps()\Props(), Name$) EndIf EndProcedure ; Remove all properties (and the map) from a given #Gadget. ; This should be called before FreeGadget() to make sure there are no leaks ; Procedure RemoveAllProps(Gadget) DeleteMapElement(AllPropMaps(), Str(Gadget)) EndProcedure ; Example ; Enumeration #Spin1 #Spin2 #Text1 #Text2 EndEnumeration If OpenWindow(0, 0, 0, 210, 100, "SpinGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) SpinGadget(#Spin1, 20, 20, 80, 25, 0, 100, #PB_Spin_Numeric) SpinGadget(#Spin2, 20, 55, 80, 25, 0, 100, #PB_Spin_Numeric) TextGadget(#Text1, 110, 20, 80, 25, "", #PB_Text_Border) TextGadget(#Text2, 110, 55, 80, 25, "", #PB_Text_Border) SetProp(#Spin1, "TextGadget", #Text1) SetProp(#Spin1, "Multiplier", 5) SetGadgetState(#Spin1, 0) SetProp(#Spin2, "TextGadget", #Text2) SetProp(#Spin2, "Multiplier", 10) SetGadgetState(#Spin2, 0) Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget Gadget = EventGadget() SetGadgetText(GetProp(Gadget, "TextGadget"), Str(GetGadgetState(Gadget) * GetProp(Gadget, "Multiplier"))) EndIf Until Event = #PB_Event_CloseWindow EndIf |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.