Dessiner un onglet

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Dessiner un onglet

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci soldat.....
Super code 8)
Répondre