Création de gadgets avec CanvasGadget() + VectorDrawing

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Jacobus
Messages : 1590
Inscription : mar. 06/avr./2004 10:35
Contact :

Création de gadgets avec CanvasGadget() + VectorDrawing

Message par Jacobus »

Salut :)
Aujourd'hui je vous propose la création simple de gadgets en utilisant Le CanvasGadget() comme support et les fonctions de VectorDrawing pour obtenir un joli rendu. C'est une manière simple de faire une interface d'application qui retient l'oeil et agréable à utiliser.
Vous pouvez très facilement modifier les fonctions créées pour vous les approprier et les ajuster à vos besoins, voire en créer de nouvelles. Tout est modifiable vu qu'au final ce n'est que du dessin.
Voici donc 5 fonctions sous forme de procédures et un exemple d'utilisation :
+ LargeGradientButton() = Créer de larges boutons avec images et textes aux couleurs en mode dégradées, option vertical ou horizontal pour le dégradé.
+ ButtonMovementEffect() = Donne un effet de mouvement aux boutons lors du survol de la souris
+ GradientTextArea() = Création d'une Zone de texte + image, en couleurs dégradées
+ GradientHeaderBar() = Créer une barre d'entête de fenêtre avec icone et textes de couleurs différentes
+ GradientExpanderBar() = Créer une barre de simulation de pliage de zone

- Testé sur Windows 11 pro, 64 bits avec PB 6.30b7 32 et 64 bits.
- Les icônes et images utilisées sont chargées depuis le système (Shell32.dll)

Code : Tout sélectionner

;-ID PROGRAM
;==============================================================
; Library functions:      + LargeGradientButton()  = Créer de larges boutons avec images et textes aux couleurs en mode dégradées
;                         + ButtonMovementEffect() = Donne un effet de mouvement aux boutons lors du survol de la souris 
;                         + GradientTextArea()     = Création d'une Zone de texte + image, en couleurs dégradées
;                         + GradientHeaderBar()    = Créer une barre d'entête de fenêtre avec icone et textes de couleurs différentes
;                         + GradientExpanderBar()  = Créer une barre de simulation de pliage de zone
;
; Version:.................1.0
; Author:..................Jacobus
; Date:....................11 janvier, 2026
; Target OS:...............Microsoft Windows 10 & 11 (All ??)
; Target Compiler:.........PureBasic 6.30 Beta 7
; License:.................Free, unrestricted, no warranty

;==============================================================

;- CONSTANTES
Enumeration Fenetres
  #MAIN_WINDOW 
EndEnumeration

Enumeration Gadgets
  #CANVAS_HEADER
  #TEXT_CANVAS
  #CANVAS_BTN_ONE
  #CANVAS_BTN_TWO
  #CANVAS_TEXTAREA
  #CANVAS_EXPAND
  #CONTAINER_EXPAND
  #EDITORNOTES
  #BTN_QUIT
  #STATUS
EndEnumeration

;-DPI (prise en compte nécessaire pour les grands écrans)
CompilerIf #PB_Compiler_DPIAware = 1
  Global dpix.d = DesktopResolutionX()
  Global dpiy.d = DesktopResolutionY() 
CompilerElse 
  Global dpix.d = 1
  Global dpiy.d = 1 
CompilerEndIf

;-FONTS
Global Font0 = LoadFont(0, "Bahnschrift Light SemiCondensed", 9, #PB_Font_Bold|#PB_Font_HighQuality)
Global Font1 = LoadFont(1, "Segoe UI Semibold", 10, #PB_Font_HighQuality|#PB_Font_Underline)
Global Font2 = LoadFont(2, "Segoe UI Semibold", 9, #PB_Font_HighQuality)

Global TEXTAREA$ ; extrait de l'Apocalypse selon St Jean.
;{
TEXTAREA$ = "Chapitre 12"+#CRLF$
TEXTAREA$ + "La femme, le dragon et l'enfant"+#CRLF$
TEXTAREA$ + "1 Un grand signe parut dans le ciel: une femme enveloppée du soleil, la lune sous ses pieds, et une couronne de douze étoiles sur sa tête."+#CRLF$
TEXTAREA$ + "2 Elle était enceinte, et elle criait, étant en travail et dans les douleurs de l'enfantement."+#CRLF$ 
TEXTAREA$ + "3 Un autre signe parut encore dans le ciel; et voici, c'était un grand dragon rouge, ayant sept têtes et dix cornes, et sur ses têtes sept diadèmes."+#CRLF$ 
; TEXTAREA$ + "4 Sa queue entraînait le tiers des étoiles du ciel, et les jetait sur la terre. Le dragon se tint devant la femme qui allait enfanter, afin de dévorer son enfant, lorsqu'elle aurait enfanté."+#CRLF$ 
; TEXTAREA$ + "5 elle enfanta un fils, qui doit paître toutes les nations avec une verge de fer. Et son enfant fut enlevé vers Dieu et vers son trône."+#CRLF$ 
; TEXTAREA$ + "6 et la femme s'enfuit dans le désert, où elle avait un lieu préparé par Dieu, afin qu'elle y fût nourrie pendant mille deux cent soixante jours."+#CRLF$ 
; TEXTAREA$ + "7 et il y eut guerre dans le ciel. Michel et ses anges combattirent contre le dragon. Et le dragon et ses anges combattirent,"+#CRLF$ 
; TEXTAREA$ + "8 mais ils ne furent pas les plus forts, et leur place ne fut plus trouvée dans le ciel."+#CRLF$ 
; TEXTAREA$ + "9 et il fut précipité, le grand dragon, le serpent ancien, appelé le diable et Satan, celui qui séduit toute la terre, il fut précipité sur la terre, et ses anges furent précipités avec lui."+#CRLF$ 
; TEXTAREA$ + "10 et j'entendis dans le ciel une voix forte qui disait: Maintenant le salut est arrivé, et la puissance, et le règne de notre Dieu, et l'autorité de son Christ; car il a été précipité, l'accusateur de nos frères, celui qui les accusait devant notre Dieu jour et nuit."+#CRLF$ 
; TEXTAREA$ + "11 ils l'ont vaincu à cause du sang de l'agneau et à cause de la parole de leur témoignage, et ils n'ont pas aimé leur vie jusqu'à craindre la mort."+#CRLF$ 
; TEXTAREA$ + "12 c'est pourquoi réjouissez-vous, cieux, et vous qui habitez dans les cieux. Malheur à la terre et à la mer! car le diable est descendu vers vous, animé d'une grande colère, sachant qu'il a peu de temps."+#CRLF$ 
; TEXTAREA$ + "13 quand le dragon vit qu'il avait été précipité sur la terre, il poursuivit la femme qui avait enfanté l'enfant mâle."+#CRLF$ 
; TEXTAREA$ + "14 et les deux ailes du grand aigle furent données à la femme, afin qu'elle s'envolât au désert, vers son lieu, où elle est nourrie un temps, des temps, et la moitié d'un temps, loin de la face du serpent."+#CRLF$ 
; TEXTAREA$ + "15 et, de sa bouche, le serpent lança de l'eau comme un fleuve derrière la femme, afin de l'entraîner par le fleuve."+#CRLF$ 
; TEXTAREA$ + "16 et la terre secourut la femme, et la terre ouvrit sa bouche et engloutit le fleuve que le dragon avait lancé de sa bouche."+#CRLF$ 
; TEXTAREA$ + "17 et le dragon fut irrité contre la femme, et il sen alla faire la guerre aux restes de sa postérité, à ceux qui gardent les commandements de Dieu et qui ont le témoignage de Jésus." 
;}

;-PROCEDURES
; Avec VectorDrawing, les couleurs sont de type RGBA (RGB + Canal Alpha) pour un meilleur rendu.
; ex: RGBA(125, 141, 172, 253) ou RGBA(213, 228, 223, 103)
Procedure GradientHeaderBar(canvasID, ColorZero, ColorOne, Title$, Text$, Enterprise$, ImageHeader, HV = 1)
  
  ; canvasID:...............N° ID du CanvasGadget() 
  ; ColorZero:..............Couleur du début du gradient, ex: RGBA(99, 184, 255, 255)
  ; ColorOne:...............Couleur de fin du gradient,   ex: RGBA(0, 0, 128, 255)
  ; Title$:.................Titre affiché en haut à gauche de la barre d'entête de fenêtre 
  ; Text$:..................Texte affiché en bas à gauche, sous le titre. 
  ; Enterprise$:............Texte ou nom qui sera affiché au milieu à droite de la barre d'entête de fenêtre  
  ; ImageHeader:............Image qui sera affichée à gauche de la barre d'entête de fenêtre
  ; HV:.....................Option: HV = 1 gradient vertical (par défaut) ou HV = 0 gradient horizontal
  
  Protected wc = GadgetWidth(canvasID)
  Protected hc = GadgetHeight(canvasID)
  Protected outputc = CanvasVectorOutput(canvasID, #PB_Unit_Pixel)
  
  If StartVectorDrawing(outputc)    
    ; Choix de l'orientation du dégradé de couleur
    If HV = 0  ; Fond gradient Horizontal (par défaut)
      VectorSourceLinearGradient(0, 0, wc*dpix, hc*dpiy)
      VectorSourceGradientColor(ColorZero, 0.0)
      VectorSourceGradientColor(ColorOne, 1.0)
    ElseIf HV = 1 ; Fond gradient vertical
      VectorSourceLinearGradient(1, hc*dpiy, 1, 1 )
      VectorSourceGradientColor(ColorZero, 0.0)
      VectorSourceGradientColor(ColorOne, 1.0)
    EndIf  
    FillVectorOutput() ; remplissage
    
    If ImageHeader <> 0
      MovePathCursor(10, 4)
      DrawVectorImage(ImageHeader, 255) 
    EndIf 
    
    If Title$ <> ""
      VectorFont(Font0, 20)
      VectorSourceColor(RGBA(231, 234, 238, 255)) ; gris clair 
      MovePathCursor(70, 5)   
      DrawVectorText(Title$)
    EndIf 
    
    If Text$ <> ""
      ;VectorFont(Font2)
      ;VectorSourceColor(RGBA(231, 234, 238, 255)) ; gris clair   
      MovePathCursor(70, 30)   
      DrawVectorText(Text$)
    EndIf 
    
    If Enterprise$ <> ""
      ; Modification de la couleur pour le texte Enterprise$
      VectorSourceColor(RGBA(145, 0, 0, 255)) ; rouge foncé
      MovePathCursor((wc*dpix)-(VectorTextWidth(Enterprise$)+30), 20)  ; positionnement à droite de la barre 
      DrawVectorText(Enterprise$)
    EndIf   
    
    StopVectorDrawing()
  EndIf   
EndProcedure

Procedure LargeGradientButton(canvasID, ColorZero, ColorOne, Title$, Text$, Image, PosImage = 0, HV = 1)
  
  ; canvasID:...............N° ID du CanvasGadget() 
  ; ColorZero:..............Couleur du début du gradient, ex: RGBA(105, 133, 187, 255)
  ; ColorOne:...............Couleur de fin du gradient,   ex: RGBA(213, 228, 223, 255)
  ; Title$:.................Titre affiché en haut à gauche du bouton et à droite de l'icône 
  ; Text$:..................Texte affiché en bas à gauche, sous le titre. 
  ; Image:..................Image qui sera affichée sur le bouton, à gauche du titre et du texte ou du côté droit du bouton
  ; PosImage:...............Option position de l'icône, 0 = à gauche, 1 = à droite
  ; HV:.....................Option: HV = 1 gradient horizontal (par défaut) ou HV = 0 gradient vertical
  
  Protected w = GadgetWidth(canvasID)
  Protected h = GadgetHeight(canvasID)
  Protected output = CanvasVectorOutput(canvasID, #PB_Unit_Pixel)
  
  If StartVectorDrawing(output) 
    
    ; Choix de l'orientation du dégradé de couleur
    If HV = 1  ; Fond gradient Horizontal (par défaut)
      VectorSourceLinearGradient(0, 0, w*dpix, h*dpiy)
      VectorSourceGradientColor(ColorZero, 0.0) ; 0,0 (le début du gradient)
      VectorSourceGradientColor(ColorOne, 1.0)  ; 1.0 (la fin du gradient). 
    ElseIf HV = 0 ; Fond gradient vertical
      VectorSourceLinearGradient(1, h*dpiy, 1, 1 )
      VectorSourceGradientColor(ColorOne, 1.0)
      VectorSourceGradientColor(ColorZero, 0.0)
    EndIf   
    FillVectorOutput()
    
    If PosImage = 0      ; l'image sera placée à gauche 
      MovePathCursor(10, 10)     
      DrawVectorImage(Image, 255) 
      
      VectorSourceColor(RGBA(0, 0, 0, 255)) ; noir   
      MovePathCursor(100, 40)   
      DrawVectorText(Text$)
      
      VectorFont(Font1, 20)
      VectorSourceColor(RGBA(28, 113, 218, 255)) ; bleu  
      MovePathCursor(100, 7)   
      DrawVectorText(Title$)
  
    ElseIf PosImage = 1  ; positionnement à droite
      MovePathCursor((w*dpix)-(48+10), 10) 
      DrawVectorImage(Image, 255)
      
      VectorSourceColor(RGBA(0, 0, 0, 255)) ; noir   
      MovePathCursor(10, 40)   
      DrawVectorText(Text$)
      
      VectorFont(Font1, 20)
      VectorSourceColor(RGBA(28, 113, 218, 255)) ; bleu  
      MovePathCursor(10, 7)   
      DrawVectorText(Title$)   
    EndIf 

    StopVectorDrawing()
  EndIf   
    
EndProcedure

Procedure GradientTextArea(canvasID, ColorZero, ColorOne, Title$, Text$, Image, ImgWidth, ImgHeight, HV = 1)
   
  ; canvasID:...............N° ID du CanvasGadget() 
  ; ColorZero:..............Couleur du début du gradient, ex: RGBA(105, 133, 187, 255)
  ; ColorOne:...............Couleur de fin du gradient,   ex: RGBA(213, 228, 223, 255)
  ; Title$:.................Titre affiché en haut à gauche du bouton et à droite de l'icône 
  ; Text$:..................Texte affiché en bas à gauche, sous le titre. 
  ; Image:..................Image qui sera affichée 
  ; ImgWidth:...............Largeur de l'image
  ; ImgHeight:..............Hauteur de l'image
  ; HV:.....................Option: HV = 1 gradient horizontal (par défaut) ou HV = 0 gradient vertical
  
  Protected w = GadgetWidth(canvasID)
  Protected h = GadgetHeight(canvasID)
  Protected output = CanvasVectorOutput(canvasID, #PB_Unit_Pixel)
  
  If StartVectorDrawing(output)
    ; Chargement d'une police préalablement déclarée en Global
    VectorFont(Font0, 20)
    
    ; Choix de l'orientation du dégradé de couleur
    If HV = 1  ; Fond gradient Horizontal (par défaut)
      VectorSourceLinearGradient(0, 0, w*dpix, h*dpiy)
      VectorSourceGradientColor(ColorZero, 0.0) ; 0,0 (le début du gradient)
      VectorSourceGradientColor(ColorOne, 1.0)  ; 1.0 (la fin du gradient). 
    ElseIf HV = 0                               ; Fond gradient vertical
      VectorSourceLinearGradient(1, h*dpiy, 1, 1 )
      VectorSourceGradientColor(ColorOne, 1.0)
      VectorSourceGradientColor(ColorZero, 0.0)
    EndIf   
    FillVectorOutput()
    
    If Image <> 0
      If ImgWidth < 24 Or ImgHeight < 24
        ImgWidth = 24 : ImgHeight = 24 ; On donne une taille minimale de 24x24 à l'image
      ElseIf ImgWidth >= 24 And ImgHeight >= 24
        ImgWidth = ImgWidth : ImgHeight = ImgHeight
      EndIf 
      MovePathCursor(10, 10)
      DrawVectorImage(Image, 255, ImgWidth*dpix, ImgHeight*dpiy) 
    EndIf 
        
    If Title$ <> ""
      VectorFont(Font0, 20)
      VectorSourceColor(RGBA(255, 0, 0, 255)) ; rouge   
      MovePathCursor((ImgWidth*dpix)+30, 30)   
      DrawVectorText(Title$)
    EndIf  
    
    If Text$ <> ""
      VectorSourceColor(RGBA(0,0,0,255)) ; texte en noir    
      MovePathCursor(20, (ImgHeight*dpiy)+30)
      ; Le texte peut être long, il est placé dans un paragraphe avec retour à la ligne automatique
      DrawVectorParagraph(Text$, w*dpix, h*dpiy)
    EndIf 
    
    StopVectorDrawing()
  EndIf 
  
EndProcedure

Procedure GradientExpanderBar(canvasIDexp, ColorZero, ColorOne, Text$, ImageExp, HV = 1)
  
  ; canvasID:...............N° ID du CanvasGadget() 
  ; ColorZero:..............Couleur du début du gradient, ex: RGBA(99, 184, 255, 255)
  ; ColorOne:...............Couleur de fin du gradient,   ex: RGBA(0, 0, 128, 255)
  ; Text$:..................Texte affiché en bas à gauche, sous le titre. 
  ; Image:..................Image qui sera affichée du côté droit
  ; HV:.....................Option: HV = 1 gradient horizontal (par défaut) ou HV = 0 gradient vertical
  
  Protected wexp = GadgetWidth(canvasIDexp)
  Protected hexp = GadgetHeight(canvasIDexp)
  Protected outputexp = CanvasVectorOutput(canvasIDexp, #PB_Unit_Pixel)
  
  If StartVectorDrawing(outputexp)
    
    ; Choix de l'orientation du dégradé de couleur
    If HV = 1  ; Fond gradient Horizontal (par défaut)
      VectorSourceLinearGradient(0, 0, wexp*dpix, hexp*dpiy)
      VectorSourceGradientColor(ColorZero, 0.0) ; 0,0 (le début du gradient)
      VectorSourceGradientColor(ColorOne, 1.0)  ; 1.0 (la fin du gradient). 
    ElseIf HV = 0 ; Fond gradient vertical
      VectorSourceLinearGradient(1, hexp*dpiy, 1, 1 )
      VectorSourceGradientColor(ColorOne, 1.0)
      VectorSourceGradientColor(ColorZero, 0.0)
    EndIf   
    FillVectorOutput()
    
    VectorFont(Font0, 20)
    VectorSourceColor(RGBA(117, 136, 157, 255)) ; gris clair   
    MovePathCursor(10, 5)   
    DrawVectorText(Text$)
    
    MovePathCursor((wexp-30)*dpix, 5)
    DrawVectorImage(ImageExp, 255, 24, 24) ; image redimensionnée en 24x24
    
    StopVectorDrawing()
  EndIf 

EndProcedure

Procedure ButtonMovementEffect(CanvasID, x1, y1, x2, y2)
  ; Lorsque la souris survole le bouton il est déplacé de x1 en x2 et de y1 en y2
  ; Lorsque la souris quitte le bouton il revient à sa place initiale
  ; donnant un effet de mouvement du gadget.
  If EventType() = #PB_EventType_MouseEnter ;#CUSTOM_MSG_MOUSEENTER    
    ResizeGadget(CanvasID, x2, y2, #PB_Ignore, #PB_Ignore)    
  ElseIf EventType() = #PB_EventType_MouseLeave ;#CUSTOM_MSG_MOUSELEAVE    
    ResizeGadget(CanvasID, x1, y1, #PB_Ignore, #PB_Ignore)   
  EndIf
            
EndProcedure

Procedure Resize_MAIN_WINDOW()
  
  WinWidth  = WindowWidth(#MAIN_WINDOW,#PB_Window_InnerCoordinate)
  WinHeight = WindowHeight(#MAIN_WINDOW,#PB_Window_InnerCoordinate)
  
  ResizeGadget(#CANVAS_HEADER, #PB_Ignore, PB_Ignore, WinWidth, #PB_Ignore)
  GradientHeaderBar(#CANVAS_HEADER, RGBA(99, 184, 255, 255), RGBA(0, 0, 128, 255), "Fenêtre principale", "Création d'un bouton avec un Canvas. Lecteur de fichiers musicaux MP3 et WMA. (Ctrl+M)", "Jacobus Software", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",207))
  
  ResizeGadget(#CANVAS_TEXTAREA, #PB_Ignore, #PB_Ignore, WinWidth-524, WinHeight-110)
  GradientTextArea(#CANVAS_TEXTAREA, RGBA(125, 141, 172, 253), RGBA(213, 228, 223, 103)," --\\-- TEST IMAGE ET TEXTE --//--", TEXTAREA$, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",13), 64, 64)
  
  ResizeGadget(#BTN_QUIT, #PB_Ignore, WinHeight-50, #PB_Ignore, #PB_Ignore)
  
EndProcedure

;- Interface graphique
If OpenWindow(#MAIN_WINDOW, 0, 0, 1024, 300, "Fenêtre principale", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
  WindowBounds(#MAIN_WINDOW, 1024, 300, 1280, 600)
  WidthWMain  = WindowWidth(#MAIN_WINDOW, #PB_Window_InnerCoordinate)
  HeightWMain = WindowHeight(#MAIN_WINDOW, #PB_Window_InnerCoordinate) 
  
  CanvasGadget(#CANVAS_HEADER, 0, 0, WidthWMain, 40)
  GradientHeaderBar(#CANVAS_HEADER, RGBA(99, 184, 255, 255), RGBA(0, 0, 128, 255), "Fenêtre principale", "Création d'un bouton avec un Canvas. Lecteur de fichiers musicaux MP3 et WMA. (Ctrl+M)", "WolfoRan Software", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",207))
  
  TextGadget(#TEXT_CANVAS, 10, 50, 500, 20, "Utilisation de CanvasGadget() pour la création de gadgets...")
  SetGadgetFont(#TEXT_CANVAS, FontID(0))
  
  CanvasGadget(#CANVAS_BTN_ONE, 10, 80, 500, 60) 
  LargeGradientButton(#CANVAS_BTN_ONE, RGBA(213, 228, 223, 255), RGBA(105, 133, 187, 255),"Jacobus Mp3 Player", "Création d'un bouton avec un CanvasGadget()"+#CRLF$+"Ceci est peut-être un lecteur de fichiers MP3. (Ctrl+M)", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",13), 0, 0)
  
  CanvasGadget(#CANVAS_BTN_TWO, 10, 145, 500, 60, #PB_Canvas_Border)
  LargeGradientButton(#CANVAS_BTN_TWO, RGBA(125, 141, 172, 255), RGBA(213, 228, 223, 255), "Création d'un gros bouton long", "avec un CanvasGadget()"+#CRLF$+"Ceci est peut-être un lecteur de fichiers MP3, ou pas. (Ctrl+M)", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",80), 1, 1)
  
  CanvasGadget(#CANVAS_EXPAND, 10, 210, 500, 25, #PB_Canvas_DrawFocus)
  GradientExpanderBar(#CANVAS_EXPAND, RGBA(213, 228, 223, 255), RGBA(105, 133, 187, 255), "Ouvrir l'accès aux autres fonctions", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",247))
  ContainerGadget(#CONTAINER_EXPAND, 10, 235, 500, 300, #PB_Container_Single) ;{
  EditorGadget(#EDITORNOTES, 0, 0, 500, 300, #PB_Editor_WordWrap)
  SetGadgetColor(#EDITORNOTES, #PB_Gadget_BackColor, RGB(255, 250, 205))
  SetGadgetColor(#EDITORNOTES, #PB_Gadget_FrontColor, RGB(40, 56, 86))
  ;}
  CloseGadgetList()
  HideGadget(#CONTAINER_EXPAND, #True)
  
  CanvasGadget(#CANVAS_TEXTAREA, 520, 80, 500, HeightWMain-110, #PB_Canvas_Border|#PB_Canvas_DrawFocus)
  GradientTextArea(#CANVAS_TEXTAREA, RGBA(125, 141, 172, 253), RGBA(213, 228, 223, 103), "TEST IMAGE ET TEXTE", TEXTAREA$, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",13), 64, 64)
 
  ButtonGadget(#BTN_QUIT, 10, HeightWMain-50, 60, 25, "Quitter")
  
  ;-Statusbar
  If CreateStatusBar(#STATUS, WindowID(#MAIN_WINDOW)) ;{
    AddStatusBarField(150)
    AddStatusBarField(#PB_Ignore)
    StatusBarText(#STATUS, 0, "Fenêtre principale", #PB_StatusBar_Center|#PB_StatusBar_Raised)
    StatusBarText(#STATUS, 1, "Information", #PB_StatusBar_Raised)    
    SendMessage_(StatusBarID(#STATUS),#WM_SETFONT,FontID(0),0) ; modifie la police de caractère de la statusbar
    ;}
  EndIf
  
  ;-Curseur
  Curseur = LoadCursor_(0, #IDC_HAND)       ; Charge le curseur main
  SetGadgetCursor(#CANVAS_BTN_ONE,    Curseur)  ; Applique le curseur aux gadgets voulus
  SetGadgetCursor(#CANVAS_BTN_TWO,    Curseur)
  SetGadgetCursor(#CANVAS_EXPAND, Curseur)
  
  ;Redimensionnement de la fenêtre et des gadgets
  BindEvent(#PB_Event_SizeWindow, @Resize_MAIN_WINDOW())

;- Boucle principale
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
            
          Case #CANVAS_BTN_ONE ;{
            ButtonMovementEffect(#CANVAS_BTN_ONE, 10, 80, 12, 78)           
            If EventType() = #PB_EventType_MouseEnter ;#CUSTOM_MSG_MOUSEENTER
              StatusBarText(#STATUS, 1, "Démarrer l'application de lecture des mp3 et autres fichiers audio wma", #PB_StatusBar_Raised)
            ElseIf EventType() = #PB_EventType_MouseLeave ;#CUSTOM_MSG_MOUSELEAVE
              StatusBarText(#STATUS, 1, "Zone d'information", #PB_StatusBar_Raised)
            ElseIf EventType() = #PB_EventType_LeftClick
              AddGadgetItem(#EDITORNOTES, -1, "Démarrer l'application de lecture des mp3 et autres fichiers audio wma")
            EndIf        
            ;} 
            
          Case #CANVAS_BTN_TWO ;{
            ButtonMovementEffect(#CANVAS_BTN_TWO, 10, 145, 12, 143)
            If EventType() = #PB_EventType_MouseEnter
              StatusBarText(#STATUS, 1, "Démarrer DirAnalyser qui fait l'invetaire des fichiers se trouvant sur votre PC.", #PB_StatusBar_Raised)
            ElseIf EventType() = #PB_EventType_MouseLeave
              StatusBarText(#STATUS, 1, "Zone d'information", #PB_StatusBar_Raised)
            ElseIf EventType() = #PB_EventType_LeftClick
              AddGadgetItem(#EDITORNOTES, -1, "Démarrer DirAnalyser qui fait l'invetaire des fichiers se trouvant sur votre PC.")
            EndIf        
            ;} 
            
          Case #CANVAS_EXPAND ;{
            If EventType() = #PB_EventType_MouseEnter
              StatusBarText(#STATUS, 1, "Extension de la fenêtre et affichage d'autres fonctions disponibles", #PB_StatusBar_Raised)
            ElseIf EventType() = #PB_EventType_MouseLeave
              StatusBarText(#STATUS, 1, "Zone d'information", #PB_StatusBar_Raised)
            ElseIf EventType() = #PB_EventType_LeftClick
              If WindowHeight(#MAIN_WINDOW) = 300 
                GradientExpanderBar(#CANVAS_EXPAND, RGBA(213, 228, 223, 255), RGBA(105, 133, 187, 255), "Refermer l'accès aux autres fonctions", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",246))
                ResizeWindow(#MAIN_WINDOW, #PB_Ignore, #PB_Ignore, #PB_Ignore, WindowHeight(#MAIN_WINDOW)+300)
                HideGadget(#CONTAINER_EXPAND, #False)
                AddGadgetItem(#EDITORNOTES, -1, "Ouverture de l'éditeur de texte.")
              ElseIf WindowHeight(#MAIN_WINDOW) > 300 And WindowHeight(#MAIN_WINDOW) <= 600 
                GradientExpanderBar(#CANVAS_EXPAND, RGBA(213, 228, 223, 255), RGBA(105, 133, 187, 255), "Ouvrir l'accès aux autres fonctions", ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",247))
                ResizeWindow(#MAIN_WINDOW, #PB_Ignore, #PB_Ignore, #PB_Ignore, 300)
                HideGadget(#CONTAINER_EXPAND, #True) 
                AddGadgetItem(#EDITORNOTES, -1, "Fermeture de l'éditeur de texte.")
              EndIf 
            EndIf        
            ;} 
            
          Case #BTN_QUIT
            Break
            
        EndSelect
        
      Case #PB_Event_Menu  
        Select EventMenu()
            
        EndSelect
        
      Case #PB_Event_CloseWindow
        Break
        
    EndSelect
    
  ForEver
  
EndIf 
Correction apportée. Une petite erreur... :?
C'est réparé :)
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.