Canvas Boost - Procedures utiles

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Canvas Boost - Procedures utiles

Message par Ar-S »

Image

Je compte me faire une lib pour me faciliter la vie lors de l'utilisation de Canvas.

Voilà les deux 1ères procédures et un exemple d'utilisation.
- PaintBackGround_Canvas(Gadget, Color, BorderColor = $0, BorderSize = 2)
- CanvasText(Gadget, canvas_text.s, Fcolor, BGcolor, FONT_NAME.s, FONT_SIZE = 12)

S'en serve qui voudra ;)

Code : Tout sélectionner

; LIB Canvas_Boost par Ar-S / 2012 - PB 5.00 / Nov 2012

; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; // Repeindre le canvas avec ou sans bordure. Pour ne pas mettre la bordure, indiquez juste la même couleur pour Color et BorderColor
; // Paint Canvas With or Without a border. To not see border color, just put the same color to Color and BorderColor value
; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Procedure.i PaintBackGround_Canvas(Gadget, Color, BorderColor = $0, BorderSize = 2)
  StartDrawing(CanvasOutput(Gadget))
    Box(0, 0, GadgetWidth(Gadget), GadgetHeight(Gadget), BorderColor) 
    Box(BorderSize, BorderSize, GadgetWidth(Gadget)-(BorderSize*2), GadgetHeight(Gadget)-(BorderSize*2), Color) 
  StopDrawing()
EndProcedure


; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; Resultat = CanvasText(Gadget, canvas_text.s, Fcolor, BGcolor, FONT_NAME.s, FONT_SIZE = 12)
; Retourne 1 si réussi, 0 si echec
; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Procedure CanvasText(Gadget, canvas_text.s, Fcolor, BGcolor, FONT_NAME.s, FONT_SIZE = 12)
  Protected  LF, LC, HC, LTxt, Htxt, DiffL, DiffH, XTexte, YTexte
  If LF = 0
    FontB = LoadFont(#PB_Any, FONT_NAME, FONT_SIZE , #PB_Font_HighQuality)
    LF = 1
  EndIf 
  
  If StartDrawing(CanvasOutput(Gadget)) <> 0
      DrawingFont(FontID(FontB))
      LC = GadgetWidth(Gadget)
      HC = GadgetHeight(Gadget)
      
      LTxt = TextWidth(canvas_text.s)
      HTxt = TextHeight(canvas_text.s)
      
      DiffL = LC - LTxt
      DiffH = HC - HTxt
      
      XTexte = DiffL / 2
      YTexte = DiffH / 2
      
      ; Ecriture du texte et ombre portée
      ; Text and DropShadow
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(XTexte-1, YTexte+1, canvas_text, BGcolor) 
      
      
      DrawText(XTexte, YTexte, canvas_text, Fcolor ) 
      
    StopDrawing()
    
    retour = 1
  Else
    retour = 0
  EndIf
  
  ProcedureReturn  retour
EndProcedure






;; ////////////////////////////////////////////////////// EXEMPLE  //////////////////////////////////////////////////////

hwnd = OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 400, "Canvas", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
If hwnd <> 0
  CanvasGadget (1, 1, 1, 150,150)
  CanvasGadget (2, 151, 1, 200,200)
  CanvasGadget (3, 1, 201, 350,100)
  
  
  ; ; ////////////// TEST DU RESULTAT ICI / TEST & RESULT HERE ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  ; Peindre le canvas en noir avec une bordure rouge ($FF) de 10 pixels. / Paint Canvas with a 10 px Red ($FF) border
  PaintBackGround_Canvas(1, $0 ,$FF, 10) 


  PaintBackGround_Canvas(2, $0 ,#Green, 2)
  PaintBackGround_Canvas(3, #Red , $0, 4)
    
    ; Centre le texte en police Microsoft Sans Serif de taille 24 ; Draw a Center Text with shadow in  "Microsoft Sans Serif" size 24
  CanvasText(1, "Hello World !", $FFFFFF, $FF,  "Microsoft Sans Serif", 16) 
  
  
  CanvasText(2, "Hello World !", $00CCFF, $0,  "Microsoft Sans Serif", 20) 
  CanvasText(3, "PURE BASIC !", $0, $0,  "Microsoft Sans Serif", 25)
  ; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
  
  Repeat
    If WaitWindowEvent() = #PB_Event_CloseWindow And EventWindow() = 0
      CloseWindow(0)
      End
    EndIf   
    
  ForEver
  
EndIf

; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ FIN EXEMPLE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Fred
Site Admin
Messages : 2805
Inscription : mer. 21/janv./2004 11:03

Re: Canvas Boost - Procedures utiles

Message par Fred »

Il vaut mieux appeler une fois CanvasOutput() faire toutes les operations d'un coup, car l'appel est couteux.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Canvas Boost - Procedures utiles

Message par Ar-S »

Il faudrait donc fusionner les 2 procédures ?
Sinon je ne vois pas comment simplifier le nombre d'appels de CanvasOutput()
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Canvas Boost - Procedures utiles

Message par graph100 »

bah non, tu ne mets que le dessin dans tes procédures, que tu peux garder séparée (mais l'appel d'une procedure prend bcp de temps), et tu appelles tes procédures au milieu du startdrawing(canvasoutput()) / stopdrawing.

Comme des proc de dessin standart de PB
évidement, pour les loadfonts etc... faut que tu le fasse avant, pour le préparer. Et puis si tu utilises tes procédures plusieurs fois, charger la même font à chaque fois n'est pas nécessaire.

utilise une map pour charger les fonts dont tu as besoin dès le début. Dans ce que j'avais fait sur les CG_CustomGadget, le chargement des fonts pour l’éditeur de texte (et tout les autres gadgets à texte) fonctionne comme ça.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Canvas Boost - Procedures utiles

Message par Ar-S »

graph100 a écrit :bah non, tu ne mets que le dessin dans tes procédures, que tu peux garder séparée (mais l'appel d'une procedure prend bcp de temps), et tu appelles tes procédures au milieu du startdrawing(canvasoutput()) / stopdrawing.

Comme des proc de dessin standart de PB
évidement, pour les loadfonts etc... faut que tu le fasse avant, pour le préparer. Et puis si tu utilises tes procédures plusieurs fois, charger la même font à chaque fois n'est pas nécessaire.

utilise une map pour charger les fonts dont tu as besoin dès le début. Dans ce que j'avais fait sur les CG_CustomGadget, le chargement des fonts pour l’éditeur de texte (et tout les autres gadgets à texte) fonctionne comme ça.
Pour ce qui est du chargement des fonts, l'avantage ici est de changer la taille/police au choix plutôt que de toutes les charger.
Mais j'ai surtout fait ça pour que la procédure soit indépendante pour l'exemple. Il va de soit que dans la majorité des codes on charge les fonts nécessaires une fois pour toute en début de code.
tu appelles tes procédures au milieu du startdrawing(canvasoutput()) / stopdrawing.
Je modifierai ça demain.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Canvas Boost - Procedures utiles

Message par graph100 »

oui mais on ne peux pas appeler loadfont au milieu d'un startdrawing / stopdrawing :roll:
c'est pour ça que j'ai suggéré de le faire au début.
Après l’intérêt d'utiliser une map, c'est que tu peux quand même appeler la police que tu veux.

et, mettons qu'elle ne soit pas dans la map, tu fait un stopdrawing, tu ajoutes la police dans la map, puis tu dessines :D
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Canvas Boost - Procedures utiles

Message par Golfy »

Ca me rappelle l'époque de Dunjeon Master sur Atari ST :)

J'avais entrepris l'idée de créer ma propre interface graphique avec un affichage comme les fenêtre de DM.
J'avais fait des équivalent MessageRequest avec les boutons, etc. (à la place des hideuses fenêtres GEM)

Fenêtre GEM :
Image

Fenêtre DM :
Image

Bon courage Ar-S :|
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Canvas Boost - Procedures utiles

Message par Ar-S »

Pas de soucis, j'aime les canvas et je vais me faire une lib, mais j'ai eu un manque de temps soudain.
Mais "je reviendrai" comme dirait schwarzy :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Fred
Site Admin
Messages : 2805
Inscription : mer. 21/janv./2004 11:03

Re: Canvas Boost - Procedures utiles

Message par Fred »

Pareil, j'avais refait pas mal de controles sur Amiga pour avoir un look plus sympa:

Image

ha la jeunesse :D
Répondre