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.


SommaireGadgets (19)
précédent sommaire suivant
 

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

Mis à jour le 14 février 2008 Progi1984

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

Mis à jour le 31 mars 2008

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

Mis à jour le 15 juin 2008

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

Mis à jour le 8 décembre 2008

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
Solution différente de Fred
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

Mis à jour le 9 mai 2010

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2018 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.

 
Responsable bénévole de la rubrique PureBasic : comtois -