Créer des régions en couleur.
Publié : jeu. 08/janv./2026 17:30
Bonsoir,
Toujours dans ma quête de connaissance, je souhaite créer une simple fenêtre que j’aimerais peindre en vert, la percer et y écrire un texte en couleur.
Mon programme ressemble à ceci :
La ligne 11 me pose un énorme problème :
Si je la laisse, j'obtiens bien une fenêtre percée, mais sans couleur et sans texte.
Si je la passe en commentaire, j'obtiens une fenêtre bien peinte, avec le texte et avec un rond blanc "opaque", qui ne laisse pas voir l'arrière de la fenêtre.
Pourriez-vous m'expliquer pourquoi lorsque je perce la fenêtre je ne peux plus dessiner dessus ? Pour moi, mais apparemment je me trompe, SetWindowRgn redéfini que la forme de la fenêtre et conserve le handle hwnd et donc le HDc ce qui, a mes yeux, me permettrait de peindre.
J'aurais voulu aller plus loin en trouant également le texte, mais déjà là avec des couleurs pas terribles, j'avoue sécher lamentablement.
Un très grand merci pour vos lumières.
François.
Toujours dans ma quête de connaissance, je souhaite créer une simple fenêtre que j’aimerais peindre en vert, la percer et y écrire un texte en couleur.
Mon programme ressemble à ceci :
Code : Tout sélectionner
WId.i = OpenWindow(#PB_Any,50,100,800,300,"My name is James...",#PB_Window_SystemMenu)
If WId
HWnd = WindowID(WId) ; Récupère le handle de la fenêtre
HDc = GetDC_(HWnd) ; Récupère le handle du DC de la fenêtre (DC : Device context)
rc.RECT ; Structure définissant une région
GetClientRect_(hwnd, rc) ; Récupère les coordonnées de la zone client de la fenêtre
rgnWindow = CreateRectRgn_(0, 0, rc\right, rc\bottom) ; Crée une région de dimensions égales à la zone client de la fenêtre
rgnHole = CreateEllipticRgn_(80, 80, 260, 260) ; Crée une région en forme de cercle
CombineRgn_(rgnWindow, rgnWindow, rgnHole, #RGN_DIFF) ; Perce la fenêtre
SetWindowRgn_(hwnd, rgnWindow, #True) ; Déclare que la fenêtre prendra désormais l'aparence d'une fenêtre trouée.
; Crée une police logique
HFont = CreateFont_(120,0,0,0,#FW_BOLD,#False,#False,#False,#DEFAULT_CHARSET,#OUT_DEFAULT_PRECIS,#CLIP_DEFAULT_PRECIS,#PROOF_QUALITY,#DEFAULT_PITCH | #FF_DONTCARE,"Comic Sans MS")
; Crée un pinceau logique
HBrush = CreateSolidBrush_(#Green)
FillRgn_(hDC, rgnWindow, hBrush) ; Peint la fenêtre en vert
; Sélectionne des objects dans le DC
Old_Font = SelectObject_(HDc,HFont)
Old_Brush = SelectObject_(HDc,HBrush) ; Ne semble pas nécessaire ?
BeginPath_(rgnWindow) ; Ouvre le chemin vers la région définie
SetTextColor_(HDc, #Red ) ; Couleur des caractères
SetBkColor_(HDc, #Blue ) ; Couleur d'arrière plan des caractères
SetBkMode_(HDc, #OPAQUE) ; #OPAQUE ou #TRANSPARENT -> pour l'arrière plan des caractères uniquement, pas pour la fenêtre
Text.s = "007"
DrawText_(HDc,Text,Len(Text),rc,#DT_SINGLELINE | #DT_CENTER | #DT_VCENTER)
;TextOut_(HDc,0,0,Text,Len(Text))
EndPath_(rgnWindow) ; Ferme le chemin (Il n'y a plus de dessin a réaliser
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
MessageRequester("Test","Sorti par la fenêtre !",#PB_MessageRequester_Error)
End
Default
EndSelect
ForEverCode : Tout sélectionner
SetWindowRgn_(hwnd, rgnWindow, #True)Si je la passe en commentaire, j'obtiens une fenêtre bien peinte, avec le texte et avec un rond blanc "opaque", qui ne laisse pas voir l'arrière de la fenêtre.
Pourriez-vous m'expliquer pourquoi lorsque je perce la fenêtre je ne peux plus dessiner dessus ? Pour moi, mais apparemment je me trompe, SetWindowRgn redéfini que la forme de la fenêtre et conserve le handle hwnd et donc le HDc ce qui, a mes yeux, me permettrait de peindre.
J'aurais voulu aller plus loin en trouant également le texte, mais déjà là avec des couleurs pas terribles, j'avoue sécher lamentablement.
Un très grand merci pour vos lumières.
François.