Page 1 sur 2

gadgettext avec couleur de fond transparent

Publié : sam. 14/mai/2005 14:48
par olivier
J'ai trouvé commment changer la couleur du texte ainssi que du fond, avec :
SetBkMode_(wParam,#TRANSPARENT)
SetTextColor_(wParam,RGB(55,146,23))

Mais je n'arrive pas à avoir un fond transparent, (pour voir l'image placer derrière le texte)

Merci d'avance pour les réponse :roll:

Publié : sam. 14/mai/2005 16:38
par Dr. Dri
Peut être en créant un RGBA...
Essaye avec ca : SetBkMode_(wParam,$FF000000)

Je ne garanti rien, c juste un truc au pîf

Dri

Publié : dim. 15/mai/2005 6:37
par olivier
Merci à toi :D
Mais ça marche pas :cry:

J'ai essayer comme tu as dit, pas de changement.
J'ai mis cette couleur dans la couleur de fond de texte :
HintergrundFarbe1=CreateSolidBrush_(RGB(0,0,255))
Mais cela m'a donnée un fond noir.

Mais qu'est ce que cela peut-il être :roll:

Publié : dim. 15/mai/2005 7:21
par Anonyme2
Je ne comprend pas bien ce que tu veux faire ?

Publié : dim. 15/mai/2005 7:54
par olivier
Si je met une image de fond j'aimerais ne pas voir la couleur de fond du texte, c'est moins jolie !

Image

Publié : dim. 15/mai/2005 7:59
par comtois
je ne sais pas si tu tiens absolument à utiliser l'API , mais pour écrire sur une image, le plus simple c'est d'utiliser

Code : Tout sélectionner

 Startdrawing(ImageOutput())
DrawingMode(1)
DrawText()
....
StopDrawaing()
enfin , c'est sûrement trop simple pour que ça corresponde à ce que tu veux faire :)

sur codearchiv , il y a ça

Code : Tout sélectionner

; English forum: http://purebasic.myforums.net/viewtopic.php?t=9202&highlight=
; Author: Num3
; Date: 17. January 2004

; Many thanks to Danilo for the base code 
;My contribution is getting the background color 
;so the text background always "looks" transparent! 

Global TextGadgetBackground, TextGadgetForeground 

color= GetSysColor_(#COLOR_3DFACE) ; get color of the background 
TextGadgetBackground = CreateSolidBrush_(color) 
TextGadgetForeground = RGB($FF,$FF,$00) 

Procedure WinProc(hWnd,Msg,wParam,lParam) 
  If Msg = #WM_CTLCOLORSTATIC And lParam = GadgetID(0) 
    SetBkMode_(wParam,#TRANSPARENT) 
    SetTextColor_(wParam,TextGadgetForeground) 
    ProcedureReturn TextGadgetBackground 
  Else 
    ProcedureReturn #PB_ProcessPureBasicEvents 
  EndIf 
EndProcedure 

OpenWindow(0,0,0,200,25,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"TextGadget Color") 
SetWindowCallback(@WinProc()) 
CreateGadgetList(WindowID()) 
TextGadget(0,5,5,190,15,"This text is colored") 
Repeat:Until WaitWindowEvent()=#PB_EventCloseWindow 

DeleteObject_(TextGadgetBackground) 
mais ça ressemble à ce que tu as déjà testé :?

Publié : dim. 15/mai/2005 9:00
par Jacobus
Il me semble que la Lib PureTools permet de faire ce que tu veux, puisque tu peux utiliser une image bmp en fond de ta fenêtre et afficher les gadgets par dessus.

Sinon, tu as deux bonnes Lib, "MoreGadgetColor" de Denis et "PureColor" de Gnozal, qui donnent d'excellents résultats, j'utilise les deux et ensemble sans difficulté.

Publié : dim. 15/mai/2005 9:04
par bernard13
moi j'utilise celle de GNOZAL
qui m'aide beaucoup

Merci GNOZAL d'avoir crée cette lib

Publié : dim. 15/mai/2005 10:23
par olivier
Salut et merci pour vos réponse.

- Je ne veux pas utiliser de dessin car c'est un texte que je doit rafraichir rapidement, et il me faut rafficher l'image pour redessiner le texte, sinon celui d'avant est encore présent.(trop long)

- J'aimerais vraiment un GadgetText avec un fond transparent. Et je n'ai rien trouvé dans la lib de GNOZAL. On peut changer de couleur mais pas supprimer le fond. Où j'ai pas vu. Mais je suis tres content de connaitre cette lib elle va surement me servir !!!

Donc mon problème reste entier

:cry:

Publié : dim. 15/mai/2005 10:46
par Anonyme2
Lorsque tu écris le texte avec le message #WM_CTLCOLORSTATIC dans une callback, tu retourne la brush de la couleur.

Pour écrire sur une image, tu doit retourner une brush.

Utilise l'API CreatePatternBrush() pour le faire

Tu dessines ton image.

tu récupères les coordonnées de ton textgadget avec GetClientRect() ou tu le fait directement avec les valeurs, pour avoir les coordonnées (voir la doc sur l'API).

Tu crées une image de la taille de ton textgadget basée sur ton image d'origine, il faut donc absolument créer une image qui soit le reflet exact de ton image d'origine à l'endroit ou va être écrit ton textgadget. Cette nouvelle image devra avoir les pixels de la position de textgadget.

Voici un petit code pas parfait mais pour t'aider

Code : Tout sélectionner

Enumeration
  #MainWindow
  #image
  #image1
  #imageGadget
  #textgadget
  #font
EndEnumeration

Global Brush

#PositionX = 200
#PositionY = 100
#DecalageX = 10    ; position en x de #Image
#DecalageY = 10    ; position en Y de #Image
#TailleImageX = 100
#TailleImageY = 100

Procedure MaCallBack(Fenetre,Message,wParam,lParam)
  
    If Message = #WM_CTLCOLORSTATIC And lParam = GadgetID(#textgadget)
       SetBkMode_(wParam,#transparent)
       SetTextColor_(wParam,#white)
       ProcedureReturn Brush
    Else 
       ProcedureReturn #PB_ProcessPureBasicEvents
    EndIf

EndProcedure

If OpenWindow(#MainWindow, 0, 0, 390, 270, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "")
   If CreateGadgetList(WindowID()) And CreateImage(#image, 370, 250)
      If StartDrawing(ImageOutput())
         For i = 0 To 369
            Line(i, 0, i, 249, RGB(150+i,90+i, 35+i))
         Next i
        StopDrawing()
        TextGadget(#textgadget, #PositionX, #PositionY, 100, 20, "ESSAI")
        SetGadgetFont(#textgadget, LoadFont(#font,"ARIAL",14,#PB_Font_Bold))
        GetClientRect_(GadgetID(#textgadget), rc.RECT)
        image2 = GrabImage(#image, #Image1, #PositionX-#DecalageX,#PositionY-#DecalageY , rc\right, rc\bottom)
        Brush = CreatePatternBrush_(image2)
        ImageGadget(#imageGadget, #DecalageX, #DecalageY, #TailleImageX, #TailleImageY, UseImage(#image))
        SetWindowCallback(@MaCallBack())
        Repeat
           Select WaitWindowEvent()
              Case #PB_EventCloseWindow
                 Quit + 1
           EndSelect
        Until Quit
       EndIf
   EndIf
EndIf
 DeleteObject_(Brush)
End

Publié : dim. 15/mai/2005 10:51
par Jacobus
Lorsque tu as créé ta fenêtre avec une couleur spécifique
de cette façon avec PureColor (je détaille pas)

Code : Tout sélectionner

PureCOLOR_SetWindowColor(0, RGB($40,$5C,$80))
Il te suffit d'utiliser la même couleur pour le fond de ton texte
comme ceci

Code : Tout sélectionner

PureCOLOR_SetGadgetColor(#text1, RGB($FF,$FF,$FF), RGB($40,$5C,$80))
Ainsi tu as un texte à fond transparent, sur lequel tu agis comme tu veux.

Publié : dim. 15/mai/2005 11:19
par olivier
Merci encore

@ Jacobus : Oui, mais quand tu veux mettre une image de fond pour faire jolie, comment tu fais ?

@Denis : Ouai, j'ai penser à ça. Mais j'éspérais plus simple. :?

Publié : dim. 15/mai/2005 11:57
par nico
Il faut savoir que les Gadgets ne sont capable que de simuler la transparence en affichant la même couleur que celle du fond.

Le meilleur moyen serait d'utiliser ImageGadget() je pense!

Publié : dim. 15/mai/2005 12:36
par Anonyme2
olivier a écrit :@Denis : Ouai, j'ai penser à ça. Mais j'éspérais plus simple. :?
Je ne sais pas si on peut faire plus simple, à creuser.

L'idéal c'est d'écrire une petite librairie avec une commande pour écrire le texte sur une image, donc la librairie doit subclasser le gadget pour #WM_CTLCOLORSTATIC, la commande doit créer la brush en fonction des coordonnées de l'image (à passer en paramètre ou plus simplement l'identifiant de l'image, on retrouve ensuite les coordonnées)

la fonction doit en suite détruire la brush à la fin du prog

la commande pourrait ressembler à ça
SetgadgetTextOnImage(#gadget, #Image, Texte, CouleurText)

Avec Taillbite ça doit pouvoir se faire.

Publié : dim. 15/mai/2005 16:35
par Jacobus
Il y a aussi la Lib PureTools 0.21 de Danilo
qui propose de skiner la fenêtre, mais en utilisant une fenêtre Popup, car la barre de titre d'une fenêtre normale gênerait l'affichage.

Exemple de sa Lib (page d'aide)

SkinWin()

Syntax

SkinWin( hWnd, hBitmap )

hWnd
=
Handle to the Window ( WindowID() )

hBitmap
=
Handle to a Bitmap ( LoadImage() )


Description

This command takes the BitmapHandle provided by hBitmap

and skins the Window with this Bitmap.

The first color in the Bitmap (location 0,0) is used as the

transparency color for the skin.


How to use

;première façon :
hWnd = OpenWindow(0, x, y, x2, y2, #WS_POPUP, "Window Name")

hBitmap = LoadImage(0, "Image.bmp")

SkinWin(hWnd, hBitmap)



;deuxieme façon :
hWnd = OpenWindow(0, x, y, x2, y2, #WS_POPUP, "Window Name")

SkinWin(hWnd, LoadImage(0, "Image.bmp"))



;troisième façon :
OpenWindow(0, x, y, x2, y2, #WS_POPUP, "Window Name")

SkinWin(WindowID(), LoadImage(0, "Image.bmp"))




Remarks

The 1st color in the image (x=0,y=0) is used as

the transparency color.


The bigger the image, the slower is the window "skinned".

Its the best to open the Window hidden (#PB_Window_Invisible),

skin the window, and show it with HideWindow(#Win,#FALSE).

Look at the Skin-Examples for more info.



Open the Window in the same dimension as the image.



You must use the #PB_Window_BorderLess / #WS_POPUP flag for

the Window.

If you use a window with a normal titlebar, the image doesnt show correctly.

************************
En utilisant la première couleur de l'image comme couleur transparente, on doit pouvoir afficher les gadgets en fond transparent, enfin je crois.

Bon, mais j'ai pas encore essayé.