Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Basic > PureBasic
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/02/2011, 15h43   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2007
Messages : 46
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 46
Points : 14
Points : 14
Par défaut Création d'un logiciel de dessin - gadgets

salut

voilà, je me suis mis à purebasic depuis 1 ou 2 jours (et je ne connaissais de langage de programmation avant, ou juste quelques notions de bases (variable et condition (if, else), et quelques boucles (for, repeat)), mais c'est tout .

Alors, déjà je trouve ce langage très sympathique et plutôt facile à apprendre pour le moment.

Afin d'apprendre, j'essaie de créer un petit logiciel de peinture numérique, avant de me lancer dans la création d'un jeu en 2D (rpg-aventure).

J'aurai donc quelques questions :
- j'ai réussi, grâce aux gadgets mdi, à créer une fenêtre pour le nouveau document. Mais j'aimerai pouvoir en créer autant que je veux (par exemple pour pouvoir aussi ouvrir plusieurs documents en même temps).

Pour ça,j'ai créé une procedure tout simple, et pour pouvoir créer plusieurs fenêtres, je dois changer le paramètre "position" ici :
Code :
1
2
3
4
5
6
7
8
9
 
Procedure NouveauDocument()
 
  nombre_de_fenetre = nombre_de_fenetre+1
  ;ReDim tableau_fenetre_fille.a(nombre_de_fenetre)
  AddGadgetItem(#fenetre_nouveauDocument,position, nom_document$)
  UseGadgetList(WindowID(#fenetre_principale)) 
 
EndProcedure
J'ai essayer de plusieurs manière : par un tableau, mais je ne sais pas comment aller la valeur du tableau à l'endroit donné (par exemple, par rapport à une variable).
J'ai regarder du coté des array, mais visiblement, on ne peut pas connaitre la valeur d'un array du tableau (ou alors, je n'ai pas trouvé).

Il faut mettre à chaque création un paramètre unique pour qu'il crée une nouvelle fenêtre.
J'aimerai donc savoir comment je peux changer ce paramètre ?
Dois-je plutôt passer par une liste ?

Autre question :
- lorsque je clique sur la croix du nouveau document créé, cela ferme le programme. Comment faire pour lui dire de ferme la fenêtre en question et non le programme ?

Merci pour vos réponses ou pour vos informations .
PS : pour le moment, j'utilise encore la version démo.
blendman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 17h10   #2
Invité régulier
 
Deimon
Inscription : octobre 2010
Messages : 45
Détails du profil
Informations personnelles :
Nom : Deimon

Informations forums :
Inscription : octobre 2010
Messages : 45
Points : 9
Points : 9
Yo!
Pour MDIGadget, tu as tous ici..
Et pour fermer une fenêtre spécifiques, tu dois creer un boutton n'importe ou (de preference dans la fenêtre à fermée), et la configuer comme ca:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
  Repeat
    event=WaitWindowEvent()
    EventGadget=EventGadget()
      Select event        
          Case #PB_Event_Gadget
            If EventGadget=#Boutton_quitter
              CloseWindow(#Fenetre_a_quitter)         
            EndIf
      EndSelect
  ForEver
Ou encore, comme tu l'as demandé, en cliquant sur la croix rouge de la fenêtre, comme ca:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
    Repeat 
      event=WaitWindowEvent()
      If event
        Window=EventWindow()
        Select event  
            Case #PB_Event_CloseWindow
            CloseWindow(Window)
        EndSelect        
      EndIf      
    Until WaitWindowEvent()=#PB_Event_CloseWindow
Dzoumaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 18h38   #3
Responsable Purebasic
 
Avatar de comtois
 
Inscription : avril 2003
Messages : 810
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 810
Points : 1 856
Points : 1 856
Citation:
Envoyé par blendman Voir le message
J'aurai donc quelques questions :
- j'ai réussi, grâce aux gadgets mdi, à créer une fenêtre pour le nouveau document. Mais j'aimerai pouvoir en créer autant que je veux (par exemple pour pouvoir aussi ouvrir plusieurs documents en même temps).
Il y a un exemple dans le répetoire PureBasic/examples/sources et le fichier se nomme MDI_ImageViewer.pb
Dans cet exemple il utilise une liste chainée pour gérer les fenêtres.


Citation:
Autre question :
- lorsque je clique sur la croix du nouveau document créé, cela ferme le programme. Comment faire pour lui dire de ferme la fenêtre en question et non le programme ?
Idem, regarde l'exemple indiqué ci-dessus.

Finalement regarde ci-dessous je te le copie ici :

Code :
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
;
; ------------------------------------------------------------
;
;   PureBasic - MDI example file
;
;    (c) 2004 - Fantaisie Software
;
; ------------------------------------------------------------
;
 
Structure MDIWindow
  ; info about the loaded image
  Image.i
  ImageWidth.l
  ImageHeight.l
 
  ; Our MDI Window  
  Window.i
 
  ; gadget numbers
  ScrollAreaGadget.i
  ImageGadget.i
EndStructure
 
Global NewList MDIWindow.MDIWindow()
 
#WINDOW = 0
#TOOLBAR = 0
#MENU = 0
 
#MDI_Base = 1
 
Enumeration
  #MENU_Open
  #MENU_Close
  #MENU_CloseAll
  #MENU_Quit
 
  #MENU_TileV
  #MENU_TileH
  #MENU_Cascade
  #MENU_Arrange
  #MENU_Previous
  #MENU_Next
 
  #MENU_FirstMDI
EndEnumeration
 
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
 
Procedure SelectMDIWindow(Window)
 
  ForEach MDIWindow()
    If MDIWindow()\Window = Window
      ProcedureReturn 1
    EndIf
  Next
 
EndProcedure
 
#GADGET_MDI = 0
 
#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
 
If OpenWindow(#WINDOW, 0, 0, 800, 600, "MDI ImageViewer", #WindowFlags)
  If CreateMenu(#MENU, WindowID(#WINDOW))
    MenuTitle("File")
      MenuItem(#MENU_Open, "Open")
      MenuItem(#MENU_Close, "Close")
      MenuItem(#MENU_CloseAll, "Close All")
      MenuBar()
      MenuItem(#MENU_QUit, "Quit")      
    MenuTitle("Windows")
      MenuItem(#MENU_TileV, "Tile vertically")
      MenuItem(#MENU_TileH, "Tile horizontally")
      MenuItem(#MENU_Cascade, "Cascade")
      MenuItem(#MENU_Previous, "Previous")
      MenuItem(#MENU_Next, "Next")
 
      ; MDI subwindows will get added here
  EndIf
 
  If CreateToolBar(#TOOLBAR, WindowID(#WINDOW))
    ToolBarStandardButton(#MENU_Open, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(#MENU_Close, #PB_ToolBarIcon_Delete)
    ToolBarSeparator()
    ToolBarStandardButton(#MENU_Previous, #PB_ToolBarIcon_Undo)
    ToolBarStandardButton(#MENU_Next, #PB_ToolBarIcon_Redo)
  EndIf
 
  MDIGadget(#GADGET_MDI, 0, 0, 0, 0, 1, #MENU_FirstMDI, #PB_MDI_AutoSize)
 
  Quit = 0
  Repeat
    Event = WaitWindowEvent()
 
    If Event = #PB_Event_CloseWindow
      Window = EventWindow()
 
      If Window = #WINDOW ; Out main window is closed, just quit
        Quit = 1
 
      Else ; It's one of our MDI children
 
        If SelectMDIWindow(Window) ; Check if it's one of our MDI window
          CloseWindow(Window)
          FreeImage(MDIWindow()\Image)
          DeleteElement(MDIWindow())   
        EndIf
 
      EndIf
 
    ElseIf Event = #PB_Event_Menu
      Select EventMenu()
        Case #MENU_Open
          FileName$ = OpenFileRequester("Open Image", DefautFile$, "Image Files (*.bmp,*.jpg,*.tiff,*.png,*.tga)|*.bmp;*.jpg;*.tiff;*.png;*.tga|All Files (*.*)|*.*", 0, #PB_Requester_MultiSelection)
          While FileName$
            DefaultFile$ = FileName$
 
            Image = LoadImage(#PB_Any, FileName$)
            If Image
 
              LastElement(MDIWindow())
              AddElement(MDIWindow())
 
              Item = ListIndex(MDIWindow())
 
              MDIWindow()\Image       = Image            
              MDIWIndow()\ImageWidth  = ImageWidth(Image)  ; ***
              MDIWindow()\ImageHeight = ImageHeight(Image)
 
              MDIWindow()\Window = AddGadgetItem(#GADGET_MDI, -1, FileName$)
 
                Width  = WindowWidth (MDIWindow()\Window)
                Height = WindowHeight(MDIWindow()\Window)
 
                MDIWindow()\ScrollAreaGadget = ScrollAreaGadget(#PB_Any, 0, 0, Width, Height, MDIWindow()\ImageWidth, MDIWindow()\ImageHeight, 10)
                  MDIWindow()\ImageGadget = ImageGadget(#PB_Any, 0, 0, MDIWindow()\ImageWidth, MDIWindow()\ImageHeight, ImageID(Image))
                CloseGadgetList()
 
            Else
              MessageRequester("Image Viewer","Could not load image: "+FileName$)
            EndIf            
 
            FileName$ = NextSelectedFileName()
          Wend
 
        Case #MENU_Close
          Window = GetGadgetState(#GADGET_MDI)
          If Window <> -1          
            CloseWindow(Window)
 
            SelectMDIWindow(Window)
            FreeImage(MDIWindow()\Image)
            DeleteElement(MDIWindow())
          EndIf
 
        Case #MENU_CloseAll
 
          ForEach MDIWindow()
            CloseWindow(MDIWindow()\Window)
            FreeImage(MDIWindow()\Image)  
          Next
          ClearList(MDIWindow())
 
        Case #MENU_Quit
          Quit = 1     
 
        Case #MENU_TileV
          SetGadgetState(#GADGET_MDI, #PB_MDI_TileVertically)
 
        Case #MENU_TileH
          SetGadgetState(#GADGET_MDI, #PB_MDI_TileHorizontally)
 
        Case #MENU_Cascade
          SetGadgetState(#GADGET_MDI, #PB_MDI_Cascade)
 
        Case #MENU_Arrange
          SetGadgetState(#GADGET_MDI, #PB_MDI_Arrange)
 
        Case #MENU_Previous
          SetGadgetState(#GADGET_MDI, #PB_MDI_Previous)
 
        Case #MENU_Next
          SetGadgetState(#GADGET_MDI, #PB_MDI_Next)
 
      EndSelect
 
 
    ElseIf Event = #PB_Event_SizeWindow
 
      Window = EventWindow()
 
      If SelectMDIWindow(Window)
        ResizeGadget(MDIWindow()\ScrollAreaGadget, 0, 0, WindowWidth(Window), WindowHeight(Window))
      EndIf
 
    EndIf
 
  Until Quit = 1  
EndIf
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.
comtois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 07h55   #4
Responsable Purebasic
 
Avatar de comtois
 
Inscription : avril 2003
Messages : 810
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 810
Points : 1 856
Points : 1 856
Citation:
J'ai regarder du coté des array, mais visiblement, on ne peut pas connaitre la valeur d'un array du tableau (ou alors, je n'ai pas trouvé).
Il faut utiliser la commande ArraySize() pour connaitre la taille d'un tableau. Si c'est bien ça ta question ?

Citation:
Il faut mettre à chaque création un paramètre unique pour qu'il crée une nouvelle fenêtre.
J'aimerai donc savoir comment je peux changer ce paramètre ?
Il faut utiliser #PB_Any, de cette façon c'est PureBasic qui numérote le gadget.

Dans l'exemple ça se trouve à la ligne 135
Code :
MDIWindow()\Window = AddGadgetItem(#GADGET_MDI, -1, FileName$)
En fait le -1 correspond à #PB_Any, je le changerai dans la doc.

MDIWindow()\Window permet de mémoriser le numéro de la nouvelle fenêtre (dans une liste chainée)

la fermeture d'une fenêtre en cliquant sur la croix est traitée ici

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    If Event = #PB_Event_CloseWindow
      Window = EventWindow()
 
      If Window = #WINDOW ; Out main window is closed, just quit
        Quit = 1
 
      Else ; It's one of our MDI children
 
        If SelectMDIWindow(Window) ; Check if it's one of our MDI window
          CloseWindow(Window)
          FreeImage(MDIWindow()\Image)
          DeleteElement(MDIWindow())   
        EndIf
 
      EndIf
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.
comtois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 09h17   #5
Candidat au titre de Membre du Club
 
Inscription : avril 2007
Messages : 46
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 46
Points : 14
Points : 14
Merci beaucoup à vous deux pour vos réponses . Cela m'aide énormément.

Citation:
Envoyé par Dzoumaka Voir le message
Pour MDIGadget, tu as tous ici..
MErci . J'avais déjà regardé ce lien, en long et en large, mais je n'avais pas trouvé les informations concernant la création de plusieurs fenêtres, ou de fermeture de gadget.

Citation:
Et pour fermer une fenêtre spécifiques, tu dois creer un boutton n'importe ou (de preference dans la fenêtre à fermée), et la configuer comme ca:
Merci pour tes codes. Je vais regarder ça très attentivement .


Citation:
Envoyé par comtois Voir le message
Il y a un exemple dans le répetoire PureBasic/examples/sources et le fichier se nomme MDI_ImageViewer.pb
Dans cet exemple il utilise une liste chainée pour gérer les fenêtres.
MErci pour cet exemple. J'avais essayé presque tous les exemples, sauf celui-ci. JE suis passé à coté.
C'est exactement ce que je recherchai en plus !

Citation:
Envoyé par comtois Voir le message
Il faut utiliser la commande ArraySize() pour connaitre la taille d'un tableau. Si c'est bien ça ta question ?
Pas tout à fait.
En fait , je voulais connaître la valeur précise d'un élément du tableau. J'avais vu ArraySize(), mais je n'avais pas trouvé pour ce que je cherchai.
Finalement, j'ai réussi, je voulais juste faire ça (c'est bête, mais je débute ) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
;je crée une Structure pour les ennemis
Structure ennemi_st
  ennemi_x.l
  ennemi_y.l
  ennemi_vie.l
  ennemi_vitesse.l
  EndStructure
 
Dim tableau_ennemi.ennemi_st(3) ; je crée un tableau avec 3 ennemis 
 
;j'entre quelques paramètres pour tester
tableau_ennemi(1)\ennemi_vie = 21
tableau_ennemi(2)\ennemi_vie = 21
tableau_ennemi(3)\ennemi_vie = 21
 
Debug tableau_ennemi(1)\ennemi_vie
En fait, je voulais juste connaitre la valeur précise dun élément du tableau, et voilà, c'était tout simple, comme toujours .

Citation:
Il faut utiliser #PB_Any, de cette façon c'est PureBasic qui numérote le gadget.

Dans l'exemple ça se trouve à la ligne 135
Code :
MDIWindow()\Window = AddGadgetItem(#GADGET_MDI, -1, FileName$)
En fait le -1 correspond à #PB_Any, je le changerai dans la doc.
J'avais vu ce paramètre #PB_any, mais je n'était pas certain de pouvoir l'utiliser là.
Merci pour ton information, je vais tester cela rapidement .

Citation:
MDIWindow()\Window permet de mémoriser le numéro de la nouvelle fenêtre (dans une liste chainée)

la fermeture d'une fenêtre en cliquant sur la croix est traitée ici

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    If Event = #PB_Event_CloseWindow
      Window = EventWindow()
 
      If Window = #WINDOW ; Out main window is closed, just quit
        Quit = 1
 
      Else ; It's one of our MDI children
 
        If SelectMDIWindow(Window) ; Check if it's one of our MDI window
          CloseWindow(Window)
          FreeImage(MDIWindow()\Image)
          DeleteElement(MDIWindow())   
        EndIf
 
      EndIf
Encore un grand merci pour vos réponses, et votre disponibilité, toute cette aide va m'être très utile .
blendman est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h18.


 
 
 
 
Partenaires

Hébergement Web