Page 1 sur 3

Image et fenetre transparente [Résolu]

Publié : jeu. 16/nov./2006 11:30
par Kwai chang caine
Bonjour à tous

Comme dab j'ai encore une question à la c.. :lol:
Je voudrais mettre une image a fond transparent sur une fenetre qui elle meme est transparente.

Je m'explique :
J'ai trouvé 2 splendides codes, le premier de FLYPE (Fenetre transparente avec fond du bureau), le second de DANILO (Image a fond transparent), et je voudrais les marier pour qu'ils vivent heureux et avoir de beaux ... :lol:

Malheureusement, comme vous le savez je ne suis pas un bon curé, et je ne connais pas la messe qui permet de faire ce miracle. :lol:
Peut etre qu'un dieu de ce site peu aider le petit pretre de cette paroisse :lol:

L'image est bien a fond transparent, mais elle prend le fond system de la fenetre et comme la fenetre n'a pas de fond ou de couleur ?????? 8O

Ou bien si quelqu'un connait un mariage plus judicieux pour faire ce que j'aimerais faire ???

Code : Tout sélectionner

Procedure CatchTransparentImage(Number,ImageLabel,TransColor,NewColor) 
  ;> 
  ;> Number     = ImageNumber 
  ;> ImageLabel = Label of the included Image 
  ;> TransColor = RGB: Transparent Color,        -1 = First Color in Picture 
  ;> NewColor   = RGB: New Color for TransColor, -1 = System Window Background 
  ;> 
  Structure _CTI_BITMAPINFO 
    bmiHeader.BITMAPINFOHEADER 
    bmiColors.RGBQUAD[1] 
  EndStructure 

  Structure _CTI_LONG 
   l.l 
  EndStructure 

  Structure _CTI_WORD 
   w.w 
  EndStructure 

  hBmp = CatchImage(Number,ImageLabel) 
  If hBmp 
    hDC  = StartDrawing(ImageOutput(Number)) 
    If hDC 
      ImageWidth  = ImageWidth(Number) : ImageHeight = ImageHeight(Number) : ImageDepth = ImageDepth(Number) 
      mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4) 
      If mem 
        bmi._CTI_BITMAPINFO 
        bmi\bmiHeader\biSize   = SizeOf(BITMAPINFOHEADER) 
        bmi\bmiheader\biWidth  = ImageWidth 
        bmi\bmiheader\biHeight = ImageHeight 
        bmi\bmiheader\biPlanes = 1 
        bmi\bmiheader\biBitCount = ImageDepth 
        bmi\bmiheader\biCompression = #BI_RGB 
        If GetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0 
          If TransColor = -1 
            If ImageDepth=32 
              *pixels._CTI_LONG = mem+((ImageHeight-1)*ImageWidth*4) 
              TransColor = *pixels\l 
              ;Debug Hex(TransColor) 
            ElseIf ImageDepth=16 
              *pixelsW._CTI_WORD = mem+((ImageHeight-1)*ImageWidth*2) 
              TransColor2 = *pixelsW\w&$FFFF 
              ;Debug Hex(TransColor2) 
            EndIf 
          Else 
            If ImageDepth=32 
              TransColor = RGB(Blue(TransColor),Green(TransColor),Red(TransColor)) 
            ElseIf ImageDepth=16 
              r.l = ((TransColor>>3)&%11111) 
              g.l = ((TransColor>>6)&%11111100000) 
              b.l = ((TransColor>>9)&%1111100000000000) 
              TransColor2 = (r|g|b)&$FFFF 
              ;Debug Hex(TransColor2) 
            EndIf 
          EndIf 

          If NewColor = -1 
            NewColor = GetSysColor_(#COLOR_BTNFACE) ; #COLOR_WINDOW 
          EndIf 
          NewColor = RGB(Blue(NewColor),Green(NewColor),Red(NewColor)) 

          If ImageDepth=32 
            *pixels._CTI_LONG = mem 
            For a = 1 To ImageWidth*ImageHeight 
              If *pixels\l = TransColor 
                *pixels\l = NewColor 
              EndIf 
              *pixels + 4 
            Next a 
          ElseIf ImageDepth=16 
            r = ((NewColor>>3)&%11111) 
            g = ((NewColor>>6)&%11111100000) 
            b = ((NewColor>>9)&%1111100000000000) 
            NewColor2.w   = (b|g|r)&$FFFF 
            *pixelsW._CTI_WORD = mem 
            For a = 1 To ImageWidth*ImageHeight 
              If *pixelsW\w&$FFFF = TransColor2 
                *pixelsW\w  = NewColor2 
              EndIf 
              *pixelsW + 2 
            Next a 
          EndIf 

          If SetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0 
            Result = hBmp 
          EndIf 
        EndIf 
        GlobalFree_(mem) 
      EndIf 
    EndIf 
    StopDrawing() 
  EndIf 
  ProcedureReturn Result 
EndProcedure 

Procedure.l myCallback(Hwnd.l, uMsg.l, wParam.l, lParam.l) 
 
 Select uMsg 
 
  Case #WM_ERASEBKGND 
   
   ProcedureReturn 
  
  Case #WM_PAINT 
  
   
    For i = 1000 To 1002
    
    If IsGadget(i) And Intro = 0
   
     x = GadgetX(i) 
     y = GadgetY(i) 
     SetRect_(Rect.RECT, x, y, x + GadgetWidth(i), y + GadgetHeight(i)) 
     ValidateRect_(Hwnd, Rect) 
     RedrawWindow_(GadgetID(i),0,0,$407) 
     
    EndIf
   
   Next 
  
   PaintDesktop_(BeginPaint_(Hwnd, ps.PAINTSTRUCT)) 
   EndPaint_(Hwnd, ps) 
  
  Case #WM_SIZING,#WM_MOVING 
  
   InvalidateRect_(Hwnd, 0, 1) 
 
 EndSelect 
 
 ProcedureReturn #PB_ProcessPureBasicEvents 
 
EndProcedure

Image1 = CatchTransparentImage(10, ?Image_01, -1, -1) 
HwndStartER = OpenWindow(0, 216, 0, 350, 250, "StartER",#PB_Window_ScreenCentered| #PB_Window_WindowCentered)
SetWindowCallback(@myCallback(), 0) 
InvalidateRect_(WindowID(0), 0, 1) 
CreateGadgetList(WindowID(0)) 

If ImageGadget(15,0,0,ImageWidth(10),ImageHeight(10),image1) 
 Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
Else 
  MessageRequester("ERROR","Cant load image!",#MB_ICONERROR) 
EndIf 

DataSection 
 Image_01: 
 IncludeBinary "c:\Canon.bmp" 
EndDataSection
Merci d'avance d'avoir écouté mon sermon, AMEN :lol:
Bonne journée

Publié : ven. 17/nov./2006 19:22
par Kwai chang caine
Y'a personne qui a une petite idée ????? :cry:

Pour y arriver, j'ai triché :oops:
J'ai créé 7 mini fenetres skinables du canon, et je les ai affiché les unes derriere les autres, pour faire l'effet d'un canon qui tire.
Le bleme c'est qu'aparement 7 fenetres c'est plus long que 7 images que l'on change, alors ça réduit dur dur mon appli.
Si quelqu'un connaissait une combine, pour donc afficher une aimge a fond transaprent sur une fenetre a fond transparent, ça m'eviterais cette succession de fenetre. :0:

Bonne soiree

Publié : ven. 17/nov./2006 20:34
par Anonyme
Désolé mais je suis incapable de t'aider :?
mais pourquoi cherché à faire du "farfelu" au lieu du fonctionnel ?
car après tout , le fonctionnel est plus intéressant que le "farfelu", non?
les caïds de windoze ne devrait pas tarder à voir ton post :D

Publié : ven. 17/nov./2006 21:55
par Kwai chang caine
je te remercie quand meme de me repondre. 8)

Tu as en partie raison sur le coté ludique de la chose.
J'ai pas mal de personnes de mon entourage qui etaient de ton avis.

Mais quand il voient ce que peux faire pure, pourquoi s'en priver ???
et ils prennent gout au graphisme.

Une application peut bien fonctionner et etre en plus originale et/ou jolie, cela ne gache rien.
Je suis un peu lassé de tous ces programmes rectangles et gris.
Et au niveau de l'interessant, je pense que l'on apprend autant à faire du graphisme qu'a faire de l'utile.

Ma passion depuis l'age de 16 ans, c'est les utilitaires, je n'ai jamais aimé les jeux, donc je programme que de "l'utile", ce doit etre pour cette raison,
que j'y adjoint du "toubo" pour étendre un peu mes connaissances (qui en ont bien besoin :lol: )
En outre, je me trompe peut etre, mais je pense que la prog de jeux fait appel à bien plus de connaissances, pour avoir une appli rapide et innovante qui utilise toutes les ressources d'un "proce".

Le monde du graphisme et de l'utilitaire n'ont rien de commun ou presque, mais cela ne les empechent pas de jouer ensemble dans la cour pendant la récré. :lol: :lol: :lol:

Mais ça, c'est une opinion personnelle, chacun voit le midi à sa porte, et chacun ses passions, le fait que nous ne soyons pas sur la meme longueur d'onde aujourd'hui toi et moi à ce sujet, prouve bien que ds la prog ya de la place pour tout le monde :wink:

Je te souhaite une bonne journée.

Publié : dim. 19/nov./2006 19:02
par Kwai chang caine
Ca fait trois jours que j'attend désespérément un coup de main. :cry:

Cpl.bator m'a conseillé d'attendre les CAIDS de windows, car je sais que y'en a quelque uns sur ce bon forum. 8)

J'espere qu'ils sont pas déja passé et que mon probleme ne les a pas intéréssé :cry:

Publié : dim. 19/nov./2006 19:11
par Anonyme
bon j'y connais rien , mais si tu colle une imagegadget puis si tu rend la fenetre transparente, cela ne fonctionne t'il pas ?

@++

Publié : dim. 19/nov./2006 19:21
par Kwai chang caine
Bah, le probleme, c'est que l'image a un fond transparent qui reprend la couleur de fond de la fenetre.

Apparement c'est comme ça que ça donne l'illusion d'un fond transparent.
Tour du personnage blanc sur fond de fenetre blanc = image transparente

Le compliqué c'est qu'avec le mega code de FLYPE, la fenetre elle a pas de fond, puisqu'elle reprend elle, le bureau qui change tout le temps quand on bouge la dite fenetre. 8O
Mais bien sur, elle a un fond d'origine avant que la callback lui redessine le fond d'ecran.
Et c'est cette couleur d'origine que l'on retrouve autour de l'image soit disant transparente. 8O

Mon bleme c'est comment dire à cette image de reprendre elle aussi le fond du bureau ???

Publié : dim. 19/nov./2006 20:35
par Gillou
Si je comprends bien tu veux faire un découpage de ta fenêtre en fonction de ton image ou je suis à coté de la plaque? est ce de la transparence (niveau de transparence) ou un découpage?

Publié : dim. 19/nov./2006 22:06
par Kwai chang caine
C'est de la transparence.
Je voudrais que l'image ai un fond transparent, c'est a dire dans ce cas que l'on voit le bureau tout autour d'elle.

J'ai triché en découpant une fenetre de la forme de l'image, comme ça le fond de l'image est bien le meme que le bureau, mais j'aurais voulu faire ça avec une image et non une fenetre.

Merci de ton interet

Publié : dim. 19/nov./2006 22:42
par Gillou
Seule une fenêtre peut etre transparente, donc si tu veux que l'on voit le bureau à travers ton image (exemple une image png ou gif), il faut récup l'image de bureau comme une impression d'écran et lui appliquer ton image comme masque. Si j'ai bien compris ta définition de transparence.

Dès que j'ai le temps je m'y penche dessus

Publié : lun. 20/nov./2006 8:46
par Frenchy Pilou
Désolé c'est pas du tout une aide mais un petit plug qui fait des fenêtres transparentes :)

http://home.insightbb.com/~ryanvm/tinyu ... /shot1.png[/img]

Publié : lun. 20/nov./2006 11:37
par Kwai chang caine
Bon, je me suis encore mal exprimé :cry:
Je ferais bien d'apprendre le français avant d'apprendre a programmer :lol:

Alors c'est bien du découpage, excusez moi.
Ce qui m'a induit en erreur c'est que Gillou m'a demandé si je voulais faire du decoupage de "MA FENETRE".

Non non, je veux (enfin j'aimerais, car seul sont ceux qui paient qui veulent :lol: ) sur cette fenetre que je ne touche pas, donc que je laisse transparente et qui reprend le fond d'ecran (procedure de FLYPE myCallback) déposer dessus une image qui elle, est découpée. Donc sans son fond.
En fin de compte, je veux que juste l'image apparaisse et pas son cadre. (Procedure de DANILO CatchTransparentImage)

Le code de FLYPE est encore plus impressionnant que celui d'une fenetre transparente (à mon gout) car il fait disparaitre tout ce qui est sur son passage pour ne laisser que le fond d'ecran, et c'est ça que je trouve génial.
:10:
En effet les fenetre transparentes, on voit les icones du bureau dessous et pour ce que je fais, ce n'est pas l'idéal.

Il n'y a pas de bleme avec les bouttons qui glissent car ils sont carré, mais l'image que je voudrais mettre dans l'angle a la forme d'un canon et donc pas carré.

Mais avec la procedure de danilo l'image prend le fond de la fenetre avant la callback donc gris :?

J'espere que cette fois, j'ai pu me faire comprendre.
C'est vrai c'est pas simple qd on ne peux pas poser d'image de parler de graphisme :lol:

Publié : jeu. 23/nov./2006 20:36
par Flype
je suis un peu long à la détente mais je crois avoir trouvé exactement ce que tu veux - enfin j'espère :mrgreen:

essaye tu devrais pas être déçu. :wink:

prérequis:
tout les windows en principe
j'ai testé avec cette image (PNG, noir pour le fond transparent) :
Image

Code : Tout sélectionner

;-
;-

UsePNGImageDecoder()

Declare.l myCallback(hwnd.l, uMsg.l, wParam.l, lParam.l)

Global hImage.l = CatchImage(1, ?Image_01)
Global hImageList.l = ImageList_Create_(ImageWidth(1), ImageHeight(1), #ILC_COLOR32|#ILC_MASK, 1, 0)

ImageList_AddMasked_(hImageList, hImage, #Black)

If OpenWindow(0, 216, 0, 350, 250, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  
  SetWindowCallback(@myCallback(), 0)
  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
  
EndIf

ImageList_Destroy_(hImageList)

;-
;-

DataSection
Image_01: IncludeBinary "c:\pb.png"
EndDataSection

;-
;-

Procedure.l myCallback(hwnd.l, uMsg.l, wParam.l, lParam.l)
  
  Protected hdc.l, result.l = #PB_ProcessPureBasicEvents
  
  Select uMsg
    
    Case #WM_PAINT
      hdc = BeginPaint_(hwnd, ps.PAINTSTRUCT)
      PaintDesktop_(hdc)
      ImageList_Draw_(hImageList, 0, hdc, 20, 20, #ILD_TRANSPARENT)
      EndPaint_(hwnd, ps)
      result = #True
      
    Case #WM_SIZING, #WM_MOVING
      InvalidateRect_(hwnd, 0, 1)
      
    Case #WM_ERASEBKGND
      result = #False
      
  EndSelect
  
  ProcedureReturn result
  
EndProcedure

;-
;-

Publié : jeu. 23/nov./2006 20:52
par Flype
et pour faire plaisir à Dobro j'ai mis ma procédure en bas :)

Publié : jeu. 23/nov./2006 23:13
par Backup
Flype a écrit :et pour faire plaisir à Dobro j'ai mis ma procédure en bas :)
Merci M'sieur ! :D