Page 1 sur 2

ScrollAreaGadget transparent

Publié : jeu. 21/juin/2012 15:13
par supercdfr
Bonjour,

je cherche a crée un ScrollAreaGadget transparent.
J'explique :

Je crée un fenêtre windows, sur laquelle j'applique un imagegadget pour crée un fond.
quand je rajoute un ScrollAreaGadget, le fond est de la couleur d'origine de ma fenêtre (gris dans mon cas). J'aimerais un fond transparent pour pouvoir voir l'image de fond de ma fenêtre.

Cdlt.

Re: ScrollAreaGadget transparent

Publié : jeu. 21/juin/2012 15:55
par dayvid
Je pense que c'est pas possible se que tu demande !

Re: ScrollAreaGadget transparent

Publié : jeu. 21/juin/2012 16:16
par falsam
@Dayvid : C'est possible :)

Juste parce que je me suis trompé :p

Code : Tout sélectionner

Enumeration
  #Mainform
  #MyScrollArea  
EndEnumeration

Procedure Open_MainForm()
  hwnd = OpenWindow(#Mainform, 0, 0, 500, 400, "Test")
  ScrollAreaGadget(#MyScrollArea, 40, 40, 200, 200, 250, 250)
  CloseGadgetList() 
  SetGadgetColor(#MyScrollArea, #PB_Gadget_BackColor ,#Red)
  SetWindowLongPtr_(WindowID(#Mainform),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(#Mainform),#GWL_EXSTYLE)|#WS_EX_LAYERED)
  SetLayeredWindowAttributes_(WindowID(#Mainform), #Red, 0, #LWA_COLORKEY)
EndProcedure
  
Open_MainForm()


Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
  
ForEver
Je retrouve le bon code et je poste.

Re: ScrollAreaGadget transparent

Publié : jeu. 21/juin/2012 16:24
par falsam
Code de Rashad sur le forum anglais

Code : Tout sélectionner

Procedure WndProc(hwnd, uMsg, wParam, lParam)

      GetWindowRect_(WindowID(0), r.RECT)
      result = #PB_ProcessPureBasicEvents 

 Select uMsg
      
        Case #WM_SIZE,#WM_MOVE,#WM_PAINT
          MoveWindow_(WindowID(1),r\left+3,r\top+25,r\right-r\left-6,r\bottom-r\top-28,1)             
   EndSelect
   
  ProcedureReturn result 
EndProcedure

CreateImage(0, 800, 600)
StartDrawing(ImageOutput(0))
  For x = 0 To 799
    For y = 0 To 599
      Plot(x, y, RGB(x, y, x*y/15))
    Next
  Next
StopDrawing()
  
hBrush = CreatePatternBrush_(ImageID(0))

hwnd = OpenWindow(0, 0, 0, 800, 600, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetClassLongPtr_(WindowID(0), #GCL_HBRBACKGROUND, hBrush)
InvalidateRect_(WindowID(0), 0, 1)

OpenWindow(1,  WindowX(0)+3, WindowY(0)+25, WindowWidth(0), WindowHeight(0), "", #WS_POPUP,WindowID(0))
ScrollAreaGadget(0, 10, 10, 780,580, 1500,1000, 30)
SetGadgetColor(0,#PB_Gadget_BackColor ,#Red)
SetWindowLongPtr_(WindowID(1),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(1),#GWL_EXSTYLE)|#WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(1),#Red,0,#LWA_COLORKEY)
ButtonGadget  (1, 10, 10, 230, 30,"Button 1")
ButtonGadget  (2, 50, 50, 230, 30,"Button 2")
ButtonGadget  (3, 90, 90, 230, 30,"Button 3")
TextGadget    (4,130,130, 230, 20,"This is the content of a ScrollAreaGadget!",#PB_Text_Right)
CloseGadgetList()

SetWindowCallback(@WndProc())
Repeat
  If GetActiveWindow() <> 0
    SetActiveWindow(0)
  EndIf
  
      Select WaitWindowEvent()
        Case  #PB_Event_CloseWindow
          End
        Case  #PB_Event_Gadget
      EndSelect
    ForEver

Re: ScrollAreaGadget transparent

Publié : jeu. 21/juin/2012 16:41
par dayvid
Ouoi la vache, pas mal Falsam :o :)
Merci, je prends :)

Falsam, tu pense que c'est possible avec un StringGadget, EditorGadget et les autres gadget du style ?!
Je vais faire des testes, encore merci ! :)

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 10:52
par supercdfr
Malheureusement, aucun des 2 codes n'est bons.

Dans le 1er, le fond est tellement transparent, qu'on voit au travers, et plus la fenetre Mainform.

Dans le 2eme, tu crée 2 fenetres.

Mon but de mettre une image de fond sur la fenetre (#Mainform) et que le scrollgadget devienne transparent pour que l'on voit l'image de fond.

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 11:15
par falsam
Le 1er c'était juste pour que Dayvid constate qu'un fond transparent sur un ScrollAreaGadget est possible à condition de connaitre les API Windows ainsi que les callbacks, et en la matière je suis plutôt novice.

Un ScrollAreaGadget avec un fond invisible n'est pas possible, pour le moment, en natif avec Pure Basic.

La 2eme fenetre que tu as vu n'est qu'un container ou wrapper qui contient ton ScrollAreaGadget et sur lequel on va utiliser les fonctionnalités des API.

Essaye le code suivant et je pense qu'il répondra à tes attentes. (Windows Of Course:)

Code : Tout sélectionner

Enumeration
  #Mainform
  #MainWrapper 
EndEnumeration

Procedure WndProc(hwnd, uMsg, wParam, lParam)
  Protected X, Y, Width, Height
  GetWindowRect_(WindowID(#MainForm), r.RECT)
  
  result = #PB_ProcessPureBasicEvents 
  
  Select uMsg
    Case #WM_SIZE,#WM_MOVE,#WM_PAINT
      MoveWindow_(WindowID(#MainWrapper), r\left+20, r\top+100, 500, 300,1) 
      
  EndSelect
  ProcedureReturn Result
EndProcedure

;Création du background de #MainForm
CreateImage(0, 800, 600)
  
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_Gradient)     
LinearGradient(0, 0, 800, 600)
GradientColor(0.00, $03FEFC)
GradientColor(0.25, $83FD7C)
GradientColor(1.00, $0803F7)
Box(0,0,800,600)
StopDrawing()
  
hBrush = CreatePatternBrush_(ImageID(0))

;Fenetre principale
hwnd = OpenWindow(#Mainform, 0, 0, 800, 600, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetClassLongPtr_(WindowID(#Mainform), #GCL_HBRBACKGROUND, hBrush)
InvalidateRect_(WindowID(#Mainform), 0, 1)

;ScrollArea dans son wrapper 
OpenWindow(#MainWrapper, 20, 100, 500, 300, "", #WS_POPUP, WindowID(#Mainform))
ScrollAreaGadget(0, 0, 0, 500, 300, 700, 400)
  SetGadgetColor(0,#PB_Gadget_BackColor ,#White)

  ;SetWindowLongPtr_ : Modifie un attribut de la fenêtre spécifiée.
  ;GetWindowLongPtr_ : Récupère des informations à propos de la fenêtre spécifiée 
  SetWindowLongPtr_(WindowID(#MainWrapper),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(#MainWrapper),#GWL_EXSTYLE)|#WS_EX_LAYERED)

  ;SetLayeredWindowAttributes : Définit l'opacité et/ou la transparence
  SetLayeredWindowAttributes_(WindowID(#MainWrapper),#White, 0, #LWA_COLORKEY)

  TextGadget(11, 20, 30, 100, 30, "TextGadget")
  SetGadgetColor(11,#PB_Gadget_BackColor ,#White)

  ButtonGadget  (12, 380, 50, 80, 30,"Test Button")

  StringGadget(12, 20, 50, 200, 22,"Essai")
CloseGadgetList()

;SetWindowCallback(@WndProc(), #MainWrapper)
SetWindowCallback(@WndProc(), #Mainform)



Repeat
  Select WaitWindowEvent()  
    Case  #PB_Event_CloseWindow
      End
          
  EndSelect
ForEver
Tu remarqueras que les api sont exécutés uniquement sur le wrapper de la fenetre qui contient ton ScrollArrea et les gagets inclus dans cet area.

Le principe est de mettre de rendre transparents les fenetres et les gadgets colorés avec du blanc.
-Le wrapper (#MainWrapper) est coloré en blanc, le fond du gadget Textgadget est coloré en blanc etc ....
Attention ça ne fonctionne pas avec tous les gadgets.

Mais comme je l'ai dit, je ne suis pas un expert en API :)

J'ai corrigé GetWindowRect_(WindowID(0), r.RECT) en le remplaçant par GetWindowRect_(WindowID(#MainForm), r.RECT)

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 11:58
par dayvid
C'est pas mal :)

Cependant le scroll se trouve pour moi en dehors de la fenêtre :mrgreen:
Il reviens sur la fenêtre si je déplace la fenêtre :wink:

C'est pas mal je trouve :)

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 12:11
par falsam
dayvid a écrit :Cependant le scroll se trouve pour moi en dehors de la fenêtre :mrgreen:
Il reviens sur la fenêtre si je déplace la fenêtre :wink:
Pour moi c'est correct sous windows 7

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 12:17
par Kwai chang caine
Marche niquel aussi sur XP sp3 v4.61, y'a juste au début ou la scroll est en dehors de la fenêtre
Mais des qu'on bouge la fenetre elle saute dedans 8O
Juste un peu laborieux le déplacement de la fenêtre :(
Merci Falsam 8)

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 12:25
par dayvid
Kwai chang caine a écrit :Marche niquel aussi sur XP sp3 v4.61, y'a juste au début ou la scroll est en dehors de la fenêtre
Mais des qu'on bouge la fenetre elle saute dedans 8O
Juste un peu laborieux le déplacement de la fenêtre :(
Merci Falsam 8)
C'est pas ce que je viens de dire !!! 8O

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 12:39
par Kwai chang caine
Bah si !!! Ca n’empêche pas que le fond transparent marche niquel et que je confirme ce que ça fait sur XP SP3
Et c'est pas parce que t'as dit quelque chose, que j'ai pas le droit de dire ce que ça fait chez moi, pour guider FALSAM 8O
Et t'a oublié de dire que ça labourait :mrgreen:

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 19:26
par supercdfr
En modifiant comme ca juste avant le repeat :

SetWindowCallback(@WndProc(), #Mainform)
GetWindowRect_(WindowID(0), r.RECT)
MoveWindow_(WindowID(#MainWrapper), r\left+20, r\top+100, 500, 300,1)

le gadget arrive bien au bon emplacement. :)

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 19:40
par falsam
supercdfr a écrit :En modifiant comme ca juste avant le repeat :

SetWindowCallback(@WndProc(), #Mainform)
GetWindowRect_(WindowID(0), r.RECT)
MoveWindow_(WindowID(#MainWrapper), r\left+20, r\top+100, 500, 300,1)

le gadget arrive bien au bon emplacement. :)
et remplacer GetWindowRect_(WindowID(0), r.RECT) par GetWindowRect_(WindowID(#MainForm), r.RECT)

Une chance que #MainForm soit la première énumération :)

Re: ScrollAreaGadget transparent

Publié : ven. 22/juin/2012 20:35
par Kwai chang caine
C'est vrai pour le positionnement de la Scroll, y'a du mieux.
Y'a plus besoin de déplacer pour qu'elle saute...Mais elle saute quand même, elle est rigolote cette scroll qui se promène :lol:
Surement une scroll mexicaine :roll: