Page 1 sur 1

Dessiner un onglet

Publié : jeu. 23/avr./2009 19:47
par Le Soldat Inconnu
Salut,

un extrait de code qui peut servir.

Il permet de dessiner un onglet avec du texte dedans.
Les bords sont arrondis

Besoin de ma librairie Effect
Si vous ne l'avez pas, il faut décommenter les 2 fonctions dans le code

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Dessiner un onglet pour un logiciel
; Utilisation d'un code pour dessiner des cercles avec anti-aliazing
; Utilisation d'un code pour récupérer la police des fenêtres de Window
; Utilisation de la librairie Effect (Activer les 2 procédures en commentaire si vou n'avez pas cette librairie)

Procedure CircleAA(x, y, Radius, Color, Thickness = 1, Mode = #PB_2DDrawing_Default)
  Protected n, nn, Distance.f, Application.f, Couleur_Fond.l
  If Mode & #PB_2DDrawing_Outlined ; Cercle vide
    ; on dessine 1/4 du cercle et on duplique pour le reste
    For n = 0 To Radius
      For nn = 0 To Radius
        Distance.f = Sqr(n * n + nn * nn)
        If Distance <= Radius And Distance > Radius - 1
          Application.f = Abs(Radius - 1 - Distance)
          Couleur_Fond = Point(x + n, y + nn)
          Plot(x + n, y + nn, ColorBlending(Couleur_Fond, Color, Application))
          Couleur_Fond = Point(x - n, y + nn)
          Plot(x - n, y + nn, ColorBlending(Couleur_Fond, Color, Application))
          Couleur_Fond = Point(x + n, y - nn)
          Plot(x + n, y - nn, ColorBlending(Couleur_Fond, Color, Application))
          Couleur_Fond = Point(x - n, y - nn)
          Plot(x - n, y - nn, ColorBlending(Couleur_Fond, Color, Application))
        ElseIf Distance <= Radius - Thickness And Distance > Radius - Thickness - 1
          Application.f = Abs(Radius - Thickness - Distance)
          Couleur_Fond = Point(x + n, y + nn)
          Plot(x + n, y + nn, ColorBlending(Couleur_Fond, Color, Application))
          Couleur_Fond = Point(x - n, y + nn)
          Plot(x - n, y + nn, ColorBlending(Couleur_Fond, Color, Application))
          Couleur_Fond = Point(x + n, y - nn)
          Plot(x + n, y - nn, ColorBlending(Couleur_Fond, Color, Application))
          Couleur_Fond = Point(x - n, y - nn)
          Plot(x - n, y - nn, ColorBlending(Couleur_Fond, Color, Application))
        ElseIf Distance <= Radius - 1 And Distance > Radius - Thickness
          Plot(x + n, y + nn, Color)
          Plot(x - n, y + nn, Color)
          Plot(x + n, y - nn, Color)
          Plot(x - n, y - nn, Color)
        EndIf
      Next
    Next
  Else ; Cercle plein
    ; on dessine 1/4 du cercle et on duplique pour le reste
    For n = 0 To Radius
      For nn = 0 To Radius
        Distance.f = Sqr(n * n + nn * nn)
        If Distance <= Radius And Distance > Radius - 1
          Application.f = 1 - (Radius - Distance)
          Couleur_Fond = Point(x + n, y + nn)
          Plot(x + n, y + nn, ColorBlending(Couleur_Fond, Color, Application))
          Couleur_Fond = Point(x - n, y + nn)
          Plot(x - n, y + nn, ColorBlending(Couleur_Fond, Color, Application))
          Couleur_Fond = Point(x + n, y - nn)
          Plot(x + n, y - nn, ColorBlending(Couleur_Fond, Color, Application))
          Couleur_Fond = Point(x - n, y - nn)
          Plot(x - n, y - nn, ColorBlending(Couleur_Fond, Color, Application))
        ElseIf Distance <= Radius - 1
          Plot(x + n, y + nn, Color)
          Plot(x - n, y + nn, Color)
          Plot(x + n, y - nn, Color)
          Plot(x - n, y - nn, Color)
        EndIf
      Next
    Next
  EndIf
EndProcedure

Procedure.l LoadWindowFont(Bold = -1, Italic = -1, UnderLine = -1, Size.f = -1)
  Protected ncm.NONCLIENTMETRICS
  ncm\cbSize = SizeOf(NONCLIENTMETRICS)
  SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
  If Bold = 0
    ncm\lfMessageFont\lfWeight = 0
  ElseIf Bold = 1
    ncm\lfMessageFont\lfWeight = 700
  EndIf
  If Italic = 0
    ncm\lfMessageFont\lfItalic = 0
  ElseIf Italic = 1
    ncm\lfMessageFont\lfItalic = 1
  EndIf
  If UnderLine = 0
    ncm\lfMessageFont\lfUnderline = 0
  ElseIf UnderLine = 1
    ncm\lfMessageFont\lfUnderline = 1
  EndIf
  If Size > 0
    ncm\lfMessageFont\lfheight * Size
  EndIf
  
  ProcedureReturn CreateFontIndirect_(@ncm\lfMessageFont)
EndProcedure

;{ Librairie Effect
; ProcedureDLL.l ColorBlending(Couleur1.l, Couleur2.l, Echelle.f) ; Mélanger 2 couleurs
  ; Protected Rouge, Vert, Bleu, Rouge2, Vert2, Bleu2
  ; 
  ; Rouge = Couleur1 & $FF
  ; Vert = Couleur1 >> 8 & $FF
  ; Bleu = Couleur1 >> 16
  ; Rouge2 = Couleur2 & $FF
  ; Vert2 = Couleur2 >> 8 & $FF
  ; Bleu2 = Couleur2 >> 16
  ; 
  ; Rouge = Rouge * Echelle + Rouge2 * (1-Echelle)
  ; Vert = Vert * Echelle + Vert2 * (1-Echelle)
  ; Bleu = Bleu * Echelle + Bleu2 * (1-Echelle)
  ; 
  ; ProcedureReturn (Rouge | Vert <<8 | Bleu << 16)
; EndProcedure
; ProcedureDLL.l ColorLuminosity(Couleur, Echelle.f) ; Eclaicir ou foncer une couleur
  ; Protected Rouge, Vert, Bleu
  ; 
  ; Rouge = Couleur & $FF
  ; Vert = Couleur >> 8 & $FF
  ; Bleu = Couleur >> 16
  ; Rouge * Echelle
  ; Vert * Echelle
  ; Bleu * Echelle
  ; 
  ; If Rouge > 255 : Rouge = 255 : EndIf
  ; If Vert > 255 : Vert = 255 : EndIf
  ; If Bleu > 255 : Bleu = 255 : EndIf
  ; 
  ; ProcedureReturn (Rouge | Vert <<8 | Bleu << 16)
; EndProcedure
;}


; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Onglet", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

Police = LoadWindowFont(1, 0, 0, 1.4)

;- Création de l'image qui va contenir l'onglet
Largeur = 256
Hauteur = 32
Texte.s = "Texte de l'onglet"

CreateImage(0, Largeur, Hauteur)
StartDrawing(ImageOutput(0))
  Box(0, 0, Largeur, Hauteur, GetSysColor_(#COLOR_3DFACE))
  CircleAA(10, 10, 10, $000000)
  CircleAA(10, 10, 9, $FFFFFF)
  CircleAA(Largeur - 1 - 10, 10, 10, $000000)
  CircleAA(Largeur - 1 - 10, 10, 9, $FFFFFF)
  Box(11, 1, Largeur - 22, 20, $FFFFFF)
  ; Bord haut avec un petit effet
  For x = 10 To Largeur - 10
    Couleur = ColorLuminosity($999999, 4 *(x / Largeur - x * x / Largeur / Largeur))
    Plot(x, 1, Couleur)
  Next
  Box(1, 10, Largeur - 2, 50, $FFFFFF)
  For y = 10 To Hauteur - 1
    ; Bord gauche et droit en dégradé
    Couleur = ColorBlending($FFFFFF, $000000, (y - 10) / 40)
    Plot(1, y, Couleur)
    Plot(Largeur - 2, y, Couleur)
    ; Fond en dégradé
    Couleur = ColorBlending(GetSysColor_(#COLOR_3DFACE), $FFFFFF, (y - 10) / (Hauteur - 10))
    Line(2, y, Largeur - 4, 0, Couleur)
  Next
  
  DrawingFont(Police)
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText((Largeur - TextWidth(Texte)) / 2, (Hauteur - TextHeight(Texte)) / 2, Texte)
StopDrawing()

ImageGadget(0, 10, 10, Largeur, Hauteur, ImageID(0))


Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Menu
      Select EventMenu() ; Menus
          
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget() ; Gadgets
          
      EndSelect
  EndSelect
  
Until Event = #PB_Event_CloseWindow

If Police
  DeleteObject_(Police)
EndIf

Publié : sam. 25/avr./2009 20:38
par Kwai chang caine
Merci soldat.....
Super code 8)