Page 1 sur 1

[Résolu] Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 11:46
par Micoute
Bonjour à tous,

je viens vers vous parce je rame pour trouver une solution que je n'ai pas trouvée sur les forum PB.

Mon programme est sensé afficher des images et du texte sur un écran graphique, mais le problème, c'est que j'ai soit les images ou alors le texte, mais jamais les deux ensembles !

Et comme je sais qu'il y en a qui ont déjà la réponse, c'est pour cela que je m'adresse à vous les mémoires vivantes du PureBasic !

Je vous en remercie tous par anticipation.

Michel

Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 12:17
par falsam
Bibliothéque Canvas ? 2D ? ... ?

Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 12:52
par Fig
Un bout de code surtout, parce que je ne vois pas où est le problème de mixer graphique et texte, tout est une question d'ordre d'affichage...

Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 14:46
par Micoute
Un petit bout de code bien sûr

Code : Tout sélectionner

Enumeration
	#Fenetre_principale
	#f_sortie
	#f_aucune
	#Image
EndEnumeration

ExamineDesktops()
Global Largeur_Ecran = GetSystemMetrics_(#SM_CXSCREEN)
Global Hauteur_Ecran = GetSystemMetrics_(#SM_CYSCREEN) -20

;programme principal
If InitSprite() = 0
	MessageRequester("ERREUR","L'initialisation à échoué",#MB_ICONERROR)
EndIf
If InitKeyboard() = 0
	MessageRequester("ERREUR","L'initialisation du clavier a échoué",#MB_ICONERROR)
EndIf

Global Police =FontID(LoadFont(#PB_Any, "Arial Rounded MT", 20, #PB_Font_Bold | #PB_Font_Italic))
Global Police2 =FontID(LoadFont(#PB_Any, "Brush Script MT", 40, #PB_Font_Italic))

ExamineDesktops()
Global x,y,z,Texte.s
Global FichierImageLogo$ = #PB_Compiler_FilePath + "Acronyme.png"
Largeur_Ecran-5 : Hauteur_Ecran-10 

Global H_Fenetre_principale = OpenWindow(#Fenetre_principale, 0, 0, Largeur_Ecran, Hauteur_Ecran, "", #PB_Window_SystemMenu ) 
OpenWindowedScreen(H_Fenetre_principale,0,0,Largeur_Ecran,Hauteur_Ecran,0,0,0,#PB_Screen_SmartSynchronization)
ClearScreen($303030)
;StartDrawing(ScreenOutput()) 
;DrawingFont(Police2)
;DrawingMode(#PB_2DDrawing_Transparent)

; appel des procédures
y + 18 : x =(Largeur_Ecran/2)-150

;Texte = "ACRONYME"
;For i = x To x + 5
;	Y + 1
;	DrawText(i, y, Texte, $8A8A8A, $303030)
;Next
;DrawText(i, y, Texte, $FFFFFF, $303030)

;création et affichage de l'image
UsePNGImageDecoder()
Resultat = CreateImage(#Image,375,93)
;
If Resultat
	Resultat2 = LoadImage(#Image, FichierImageLogo$)
	If Resultat2
		ImageGadget(#Image, X,Y,375,93, ImageID(#Image))
	EndIf
EndIf
;fin de traitement de l'image


StartDrawing(ScreenOutput()) 
DrawingFont(Police2)
DrawingMode(#PB_2DDrawing_Transparent)

DrawingFont(Police)

... 

DrawText(x,y, ...

StopDrawing() 

Global action.i = #f_aucune
Repeat
	Global Evenement = WindowEvent()
	Select Evenement
		Case #PB_Event_CloseWindow
			action = #f_sortie
		Case 0
			ExamineKeyboard()
			If KeyboardPushed(#PB_Key_All)
				action = #f_sortie
			EndIf
			FlipBuffers()
	EndSelect
Until action = #f_sortie
CloseScreen()
CloseWindow(#Fenetre_principale)
de toute façon, c'est un code généraliste, c'est juste pour apprendre une nouvelle approche de Purebasic et je suis sûr que c'est faisable, je vous remercie tous encore une fois !

Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 15:11
par falsam

Code : Tout sélectionner

ImageGadget(#Image, X,Y,375,93, ImageID(#Image))
Tu ne peux pas avoir un imagegadget qui est comme identification d'image son gadget.

tu ne peux pas positionner un ImageGadget dans un OpenWindowedScreen

Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 15:20
par falsam
un exemple d'insertion de texte et d'image avec l'utilisation des sprites

Code : Tout sélectionner

Enumeration Font
  #Font
EndEnumeration

Enumeration Window
  #MainForm
EndEnumeration

Enumeration Sprite
  #Logo
  #Text
EndEnumeration

Global Width = 500, Height = 500
  
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 And InitSound() = 0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf
    
If OpenWindow(#mainform, 0, 0, Width, Height, "Texte & Image", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  LoadFont(#font, "Arial", 25)
  
  If OpenWindowedScreen(WindowID(#mainform), 0, 0, Width, Height)
    ;Texte
    CreateSprite(#Text, 200, 40)
    StartDrawing(SpriteOutput(#Text))
    Box(0, 0, 200, 40, RGB(255, 255, 255))
    DrawingFont(FontID(#Font))
    DrawText(0, 0, "Hello Micoute", RGB(222, 184, 135), RGB(255, 255, 255))
    StopDrawing()
        
    ;Image
    LoadSprite(#Logo, #PB_Compiler_Home+"examples\sources\data\PureBasic.bmp")
  EndIf
EndIf
  
Repeat  
  Repeat
    Event = WindowEvent()
     
    Select event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until event=0
    
  FlipBuffers()
  ClearScreen(RGB(255, 255, 255))
  
  DisplaySprite(#Logo, 200, 200)
  DisplaySprite(#Text, 150, 300)
  
  ExamineKeyboard()
  
Until KeyboardPushed(#PB_Key_Escape)



Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 15:23
par MLD
@falsam
Tu ma devancé :( :wink:

Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 16:50
par Micoute
Un grand merci à falsam qui m'a sorti de ma galère, c'est tout simplement prodigieux, il y avait longtemps que je cherchais à faire ce genre d'exercice.

Bonjour en passant à mon voisin de région, je veux dire, ce cher MLD !

Ce qui ne signifie pas que je dédaigne les autres !

Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 17:51
par Fig
Falsam affiche sur un sprite puis l'affiche mais tu peux évidemment afficher directement sur l'écran ton texte avec startdrawing(screenoutput()): drawtext():stopdrawing() dans ta boucle principale.

Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 18:08
par Micoute
Merci Fig, c'est toujours bon à savoir !

Re: Images et texte sur un écran graphique ensemble

Publié : mar. 27/mai/2014 20:07
par falsam
Fig a écrit :Falsam affiche sur un sprite puis l'affiche mais tu peux évidemment afficher directement sur l'écran ton texte
J'aurais pu effectivement.

L'avantage du sprite même si c'est du texte, est que tu en fais ce que tu veux (ou presque)

Code : Tout sélectionner

Enumeration Font
  #Font
EndEnumeration

Enumeration Window
  #MainForm
EndEnumeration

Enumeration Sprite
  #Logo
  #Text1
  #Text2
  #Text3
EndEnumeration

Global Width = 500, Height = 500
  
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 And InitSound() = 0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf
    
If OpenWindow(#mainform, 0, 0, Width, Height, "Texte & Image", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  LoadFont(#font, "Arial", 25)
  
  If OpenWindowedScreen(WindowID(#mainform), 0, 0, Width, Height)
    ;Text 1
    CreateSprite(#Text1, 200, 40)
    StartDrawing(SpriteOutput(#Text1))
    Box(0, 0, 200, 40, RGB(255, 255, 255))
    DrawingFont(FontID(#Font))
    DrawText(0, 0, "Hello Micoute", RGB(222, 184, 135), RGB(255, 255, 255))
    StopDrawing()
        
    ;Image
    LoadSprite(#Logo, #PB_Compiler_Home+"examples\sources\data\PureBasic.bmp")
    
    ;Text 2
    CopySprite(#Text1, #Text2) ;copie du sprite
    ZoomSprite(#Text2, 400, 80) ;Zoom
    RotateSprite(#Text2, 90, #PB_Absolute)
    
    ;Text 3
    CopySprite(#Text1, #Text3) ;copie du sprite
    ZoomSprite(#Text3, 100, 40) ;Zoom
    y=99
    
  EndIf
EndIf
  
Repeat  
  Repeat
    Event = WindowEvent()
     
    Select event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until event=0
    
  FlipBuffers()
  ClearScreen(RGB(255, 255, 255))
  
  DisplaySprite(#Logo, 200, 200) 
  DisplaySprite(#Text1, 150, 300)
  
  DisplaySprite(#Text2, -150, 50) ;Affichage
    
  If y=99  : Sens=1: EndIf
  If y=401 : Sens=-1 : EndIf
  
  y=y+(1*Sens)
  
  RotateSprite(#Text3, 1, #PB_Relative)
  DisplaySprite(#Text3, 390, y)
  
  
  ExamineKeyboard()
  
Until KeyboardPushed(#PB_Key_Escape)

Re: [Résolu] Images et texte sur un écran graphique ensemble

Publié : mer. 28/mai/2014 9:07
par Fig
Un autre avantage du "sprite-texte" c'est la rapidité d'affichage qui est plus grande si tu as beaucoup de texte. (ton texte est bitmap donc plus rapide à afficher alors que la fonction drawtext est relativement lente: font, couleur, espace entre les caractères, traitement de chaque caractère l'un après l'autre etc...)

Un inconvénient: si ton texte change souvent, il faut effacer et modifier le sprite à chaque fois... Autant afficher le texte directement sur l'écran.

Re: [Résolu] Images et texte sur un écran graphique ensemble

Publié : mer. 28/mai/2014 12:35
par Micoute
Un grand merci à vous deux, c'est vraiment magnifique tout ce qu'on peut faire avec PB, J'ignorais ou alors j'avais oublié qu'on pouvait faire tant de chose avec les sprites.

J'adore !!!