Image et fenetre transparente [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Image et fenetre transparente [Résolu]

Message 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
Dernière modification par Kwai chang caine le sam. 25/nov./2006 18:35, modifié 4 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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
Dernière modification par Kwai chang caine le ven. 17/nov./2006 21:56, modifié 2 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Anonyme

Message 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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Anonyme

Message 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 ?

@++
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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 ???
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message 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?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message 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
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message 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]
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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

;-
;-
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

et pour faire plaisir à Dobro j'ai mis ma procédure en bas :)
Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Flype a écrit :et pour faire plaisir à Dobro j'ai mis ma procédure en bas :)
Merci M'sieur ! :D
Répondre