Page 2 sur 2

Publié : sam. 12/févr./2005 17:25
par Le Soldat Inconnu

Code : Tout sélectionner

UseJPEGImageDecoder() ; on charge l'image
Fichier.s = OpenFileRequester("Ouvrir une image", "", "Image|*.bmp;*.jpg", 1)
LoadImage(0, Fichier)
PanoramaX = ImageWidth() ; largeur du panorama
PanoramaY = ImageHeight() ; hauteur du panorama
WindowX = PanoramaX ; largeur de la fenêtre
WindowY = PanoramaY ; même hauteur que le panorama
; CreateImage(#PB_Any, WindowX, WindowY);  fenêtre horizontale pour symétrie H
CreateImage(#PB_Any, WindowY, WindowX) ; fenêtre verticale pour Rotation 90

InitSprite()
WindowID = OpenWindow(1, 0, 0, WindowX, WindowY, #PB_Window_SystemMenu | #PB_Window_BorderLess, "Panorama")
OpenWindowedScreen(WindowID, 0, 0, WindowX, WindowY, 1, 0, 0)


If OpenWindow(0, 0, 0, WindowY, WindowX, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Effect - Rotation d'image") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

; ImageSymetrieH = ImageSymmetryH(UseImage(0))
; TextGadget( #PB_Any, 0, 0, 100, 15, "Symétrie Horizontale")
; ImageGadget( #PB_Any,0, 0,WindowX,  WindowY, UseImage(ImageSymetrieH))

ImageRotation90 = RotateImage(UseImage(0), 90)
TextGadget( #PB_Any, 0, 0, 100, 15, "Rotation 90")
ImageGadget(#PB_Any, 0, 0, WindowY, WindowX, UseImage(ImageRotation90))

Repeat
  Event = WindowEvent()
  
  StartDrawing(ScreenOutput())
    ; affichage de l'image de départ
    DrawImage(UseImage(0), 0, 0)
  StopDrawing()
  FlipBuffers()
  
Until Event = #PB_Event_CloseWindow
End

bon alors tu es prêt, je t'explique tes erreurs

Code : Tout sélectionner

WindowID = OpenWindow(1, 0, 0, ...
WindowID = WindowID(1)
La deuxième ligne est inutile car openwindow te renvoie déjà le WindowID
donc ceci suffit

Code : Tout sélectionner

WindowID = OpenWindow(1, 0, 0, ...
par contre, si tu utilises PB_Any, il faut faire comme ça

Code : Tout sélectionner

WindowNumero = OpenWindow(#PB_Any, 0, 0, ...
WindowID = WindowID(WindowNumero)[/

Code : Tout sélectionner

StartDrawing(WindowOutput()) 
  ; affichage de l'image de départ 
  DrawImage(UseImage(0), 0, 0) 
StopDrawing()
Il faut mettre le stop drawing dès qu'on a finit le dessin
Il faut éviter d'avoir des openwindow ou des fonctions du genre au milieu d'un dessin ;)
Sinon, tu dessines sur la fenêtre alors qu'on a un OpenWindowedScreen dessus
mieux vaut dessiner sur le screen et faire un flipbuffers
Quand on dessine directement sur la fen, l'image n'est pas stable, si tu passe une autre fenêtre par dessus l'image, elle disparait

Code : Tout sélectionner

Result = OpenWindowedScreen(WindowID, ...
Si on ne vérifie pas le Result autant mettre directement ceci

Code : Tout sélectionner

OpenWindowedScreen(WindowID, ...

Publié : lun. 14/févr./2005 16:01
par Frenchy Pilou
Merci, merci,et non, non, les erreurs ne me font pas peur ! :lol:
Encore un bout de code à examiner à la loupe ;)

Quel est le mot "magique" qui permet au programme de savoir qu'il doit utiliser une bibliothèque spécifique, ici pour faire une rotation ?
(je supose "RotateImage" : ce mot devient-il interdit pour la déclaration d'une variable qui aurait par hasard le même nom ?
Et ajoute-t-on dans l'Exe toute la bibliothèque ou juste la partie qui fait la rotation ? (je suppose que dans l'absolu, il faudrait des mini-bibliothèques n'utilisant qu'une fonction?)

Publié : lun. 14/févr./2005 19:02
par Le Soldat Inconnu
je pense que ça n'ajoute que la fonction dont tu as besoin. Mais la je ne suis pas sur.
faut essayer plusieur prog, un utilisant une seule fonction de la lib et l'autre en utilisant plusieurs, puis comparer la taille l'exe.

Après essai, visblement, on a que la fonction utilisée qui est inclu dans l'exe



Sinon les noms de procedure utilisé dans une lib sont réservés.

En clair tu ne peux pas faire une Procedure Machin si machin est une fonction d'une lib, que ce soit une lib perso et une lib de Pure

Par contre, rien ne t'empèche de faire une liste s'appellant Machin() ou de faire une variable Machin.l
ça ne pose aucun problème, après, a toi de pas de perdre dans le code, c'est tout.

Publié : mer. 16/févr./2005 2:32
par Frenchy Pilou
Autre incendie pour les pompiers :)
Je voulais simplement rentrer des données jusqu'à l'appui du Bouton Ok !
mais.... :roll:

Code : Tout sélectionner

UseJPEGImageDecoder() ; on charge l'image
Fichier.s = OpenFileRequester("Ouvrir une image", "", "Image|*.bmp;*.jpg", 1)

LoadImage(0, Fichier)
PanoramaX = ImageWidth() ; largeur du panorama
PanoramaY = ImageHeight() ; hauteur du panorama
WindowX = PanoramaX ; largeur de la fen
WindowY = PanoramaY ; même hauteur que le panorama
Enumeration
   #Window_0
  #Window_1
EndEnumeration
Enumeration
#Gadget_0
#Gadget_1  
#Gadget_2
#Gadget_3 
#Gadget_4 
#Gadget_5
#Gadget_6
EndEnumeration
InitKeyboard()
InitSprite()

a$= "Votre fenêtre de départ fait  " + Str(WindowX)+ "*" + Str(WindowY)+ " pixels"
 OpenWindow(#Window_0, 0, 0, 400, 200,#PB_Window_ScreenCentered | #PB_Window_SystemMenu, a$)
  
  Repeat
        Event = WindowEvent()
    If CreateGadgetList(WindowID()) 
      TextGadget(#Gadget_3, 20, 10,300, 30, "Quelle taille souhaitez-vous pour votre Panorama?") 
      StringGadget(#Gadget_0, 20, 70, 150, 30, "") 
      TextGadget(#Gadget_4, 200, 70, 270, 30, "en  X  pixels")
      StringGadget(#Gadget_1, 20, 100, 150, 30, "")
      TextGadget(#Gadget_5, 200, 100, 270, 30, "en  Y  pixels")
      TexteX$ = GetGadgetText(#Gadget_0) 
      TexteY$ = GetGadgetText(#Gadget_1)
      ButtonGadget(#Gadget_6, 100, 150, 200, 20, "OK")
    EndIf 
    Gadget = EventGadgetID()
  Until  Gadget=6
;************************************
 
WindowX = Val(TexteX$); nouvelle valeur en X
WindowY =Val(TexteY$); nouvelle valeur en Y
OpenWindow(1, 0, 0, WindowX, WindowY, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Fin = Escape...Souris à gauche freine")
OpenWindowedScreen(WindowID(1), 0, 0, WindowX, WindowY, 1, 0, 0)

; On calcul le nombre de Panorama nécessaire pour remplir l'écran etc..

Publié : mer. 16/févr./2005 11:25
par Le Soldat Inconnu

Code : Tout sélectionner

  Repeat 
        Event = WindowEvent() 
    If CreateGadgetList(WindowID()) 
      TextGadget(#Gadget_3, 20, 10,300, 30, "Quelle taille souhaitez-vous pour votre Panorama?") 
      StringGadget(#Gadget_0, 20, 70, 150, 30, "") 
      TextGadget(#Gadget_4, 200, 70, 270, 30, "en  X  pixels") 
      StringGadget(#Gadget_1, 20, 100, 150, 30, "") 
      TextGadget(#Gadget_5, 200, 100, 270, 30, "en  Y  pixels") 
      TexteX$ = GetGadgetText(#Gadget_0) 
      TexteY$ = GetGadgetText(#Gadget_1) 
      ButtonGadget(#Gadget_6, 100, 150, 200, 20, "OK") 
      Gadget = EventGadgetID()
   Else
      Gadget = 0
   EndIf  
  Until  Gadget=6

Publié : mer. 16/févr./2005 11:53
par Frenchy Pilou
Non, cela ne marche pas :) Rien ne s'affiche (ou n'a le temps de s'afficher)

Mais étant un peu plus en forme, j'ai trouvé une solution :)
Le problème maintenant c'est que la 2ème fenêtre n'a pas l'air de prendre en compte les données introduites! :roll:
Et que s'il on remet le mot "repeat" au dessus on retombe dans le même travers, on ne voit pas les boîtes d'entrées, ni le bouton!
Il y a quelque chose qui cloche :wink:

Code : Tout sélectionner

  If CreateGadgetList(WindowID())
    TextGadget(#Gadget_3, 20, 10,300, 30, "Quelle taille souhaitez-vous pour votre Panorama?")
    StringGadget(#Gadget_0, 20, 70, 150, 30, "")
    TextGadget(#Gadget_4, 200, 70, 270, 30, "en  X  pixels")
    StringGadget(#Gadget_1, 20, 100, 150, 30, "")
    TextGadget(#Gadget_5, 200, 100, 270, 30, "en  Y  pixels")
    TexteX$ = GetGadgetText(#Gadget_0)
    TexteY$ = GetGadgetText(#Gadget_1)
    ButtonGadget(#Gadget_6, 100, 150, 200, 20, "OK")
  EndIf
Repeat
  Event = WaitWindowEvent()
  Gadget = EventGadgetID()
Until  Gadget=6
;************************************

WindowX = Val(TexteX$); nouvelle valeur en X
WindowY =Val(TexteY$); nouvelle valeur en Y
 CloseWindow(#Window_0)
OpenWindow(1, 0, 0, WindowX, WindowY, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Fin = Escape...Souris à gauche freine")
OpenWindowedScreen(WindowID(1), 0, 0, WindowX, WindowY, 1, 0, 0)

Publié : mer. 16/févr./2005 12:04
par Le Soldat Inconnu
désolé, j'avais pas bien régardé ton code

regarde donc ou tu as mis la créatioon des gadgets :lol: , en plein milieu de la boucle de gestion des évènements

Code : Tout sélectionner

OpenWindow(0, 0, 0, 400, 200, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "test")
If CreateGadgetList(WindowID())
    TextGadget(#PB_Any, 20, 10, 300, 30, "Quelle taille souhaitez-vous pour votre Panorama?")
    StringGadget(0, 20, 70, 150, 30, "")
    TextGadget(#PB_Any, 200, 70, 270, 30, "en  X  pixels")
    StringGadget(1, 20, 100, 150, 30, "")
    TextGadget(#PB_Any, 200, 100, 270, 30, "en  Y  pixels")
    TexteX$ = GetGadgetText(0)
    TexteY$ = GetGadgetText(1)
    ButtonGadget(2, 100, 150, 200, 20, "OK")
  EndIf
  
  Gadget = 0
Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_EventGadget
    Gadget = EventGadgetID()
  ElseIf  Event = #PB_Event_CloseWindow
    End ; On quitte
  EndIf
  
Until Gadget = 2

Si tu veux plus d'explication, va voir ici :
http://purebasic.hmt-forum.com/viewtopic.php?t=185
Il y a plein d'exmple différent tout commenté

Publié : mer. 16/févr./2005 12:39
par Frenchy Pilou
Il me semblait bien qu'il devait y avoir un truc monstrueux de ce style :)
Mais...
Il doit y avoir encore un gros vice de forme :lol:
Car ces nouveaux paramètres ne "passent pas" à la 2ème fenêtre !
Quelle pataugeoire :)

Code : Tout sélectionner

UseJPEGImageDecoder() ; on charge l'image
Fichier.s = OpenFileRequester("Ouvrir une image", "", "Image|*.bmp;*.jpg", 1)

LoadImage(0, Fichier)
PanoramaX = ImageWidth() ; largeur du panorama
PanoramaY = ImageHeight() ; hauteur du panorama
WindowX = PanoramaX ; largeur de la fen
WindowY = PanoramaY ; même hauteur que le panorama
Enumeration
   #Window_0
  #Window_1
EndEnumeration
Enumeration
#Gadget_0
#Gadget_1  
#Gadget_2

EndEnumeration
InitKeyboard()
InitSprite()

a$= "Votre fenêtre de départ fait  " + Str(WindowX)+ "*" + Str(WindowY)+ " pixels"
OpenWindow(#Window_0, 0, 0, 400, 200,#PB_Window_ScreenCentered | #PB_Window_SystemMenu, a$)

If CreateGadgetList(WindowID())
  TextGadget(#PB_Any, 20, 10, 300, 30, "Quelle taille souhaitez-vous pour votre Panorama?")
  StringGadget(0, 20, 70, 150, 30, "")
  TextGadget(#PB_Any, 200, 70, 270, 30, "en  X  pixels")
  StringGadget(1, 20, 100, 150, 30, "")
  TextGadget(#PB_Any, 200, 100, 270, 30, "en  Y  pixels")
  TexteX$ = GetGadgetText(0)
  TexteY$ = GetGadgetText(1)
  ButtonGadget(2, 100, 150, 200, 20, "OK")
EndIf
 
Gadget = 0
Repeat
  Event = WaitWindowEvent()
   If Event = #PB_EventGadget
    Gadget = EventGadgetID()
  ElseIf  Event = #PB_Event_CloseWindow
    End ; On quitte
  EndIf
 Until Gadget = 2

WindowX = Val(TexteX$); nouvelle valeur en X
WindowY =Val(TexteY$); nouvelle valeur en Y
OpenWindow(1, 0, 0, WindowX, WindowY, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Fin = Escape...Souris à gauche freine")
OpenWindowedScreen(WindowID(1), 0, 0, WindowX, WindowY, 1, 0, 0)

Publié : mer. 16/févr./2005 14:47
par Le Soldat Inconnu
deéaplce ceci après la boucle d'évènement

Code : Tout sélectionner

TexteX$ = GetGadgetText(0) 
  TexteY$ = GetGadgetText(1)

Publié : mer. 16/févr./2005 17:40
par Frenchy Pilou
Bingo ce coup-ci cela marche impec :D
Tout n'est qu'une question d'ordre en fait :roll:
J'attaque le dernier morceau de bravoure qui va être, je n'en doute pas source de nouvelles bourdes mirifiques :)
(à savoir collage de l'original + son symétrique vertical ) (vive la biblio Effect :)
Je sens déjà les sprites s'exciter d'impatience sur ma carcasse :lol:

Qu'appelle t-on ouvrir "un écran" dans une fenêtre ?
OpenWindowedScreen
Est-ce le fond de la fenêtre, peut-il être plus petit que la fenêtre ?...
J'ai vu qu'il peut y en avoir 2 par fenêtres
Cela me laisse perplexe :)

Il n'y a pas dans un coin un schéma récapitulatif explicatif visuel qui résume tout ce galimatias "Windosique"?
Merci de votre patience!
Ps Il n'y a pas de petites biblio spécialisées dans les cases "d'entrées numériques" ou "alphabétiques" ?
Ca je crois que j'ai trouvé #PB_String_Numeric :idea:

Publié : mer. 16/févr./2005 18:45
par Le Soldat Inconnu
Pour l'openwindowedscreen, oui, on peut le réduire pour qu'il ne prenne pas toute la fenêtre, regarde l'aide :roll: :lol:

A savoir que l'OpenWindowedScreen est plus lent qu'un openscreen.

Mais l'intérêt est de pouvoir faire des animations simplement est sans scintillement (comparé a une imagegadget ou l'on change l'image affiché pour l'animé)
Par contre, il faut gérer son rafraichissement, à savoir que son réduit la fen et qu'on la réagrandie, le screen est vide si on a pas réactualiser l'affichage, idem quand une fenêtre passe par dessus la tienne.