Page 1 sur 1

image sur le bureau

Publié : lun. 18/juil./2016 16:53
par ChaudEf
Bonjour, j'ai essaye de faire un petit code qui afficherait une petite image sur le bureau (genre de watermark), ca marche bien, mais au bout de qqe minutes l'image devient blanche.
ci joint mon code, apparement ca n'est pas la bonne facon de le faire, je crois avoir vu une fois un code pour ca sur le forum mais je ne l'ai pas retrouve

Code : Tout sélectionner

#position = "bottom"
#taille_image = 70
#distance_from_border = 4

UsePNGImageDecoder()
UseJPEGImageDecoder()
ExamineDesktops()
Declare Toast_RemoveFromTaskBar(Window.l, state.l)
Declare move_window()
Define.l position
Define.RECT ScreenSize
SystemParametersInfo_(#SPI_GETWORKAREA, 0, @ScreenSize.RECT, 0) ;on recupere les informations sur la taille de l'ecran

If #position = "up"
  position = #distance_from_border
Else
  position = ScreenSize\bottom - #taille_image - #distance_from_border
EndIf

If OpenWindow(0, #distance_from_border, position, #taille_image, #taille_image, "", #PB_Window_BorderLess)
  Toast_RemoveFromTaskBar(0, 1)
  StartDrawing(WindowOutput(0))
  CatchImage(0, ?naki)
  ResizeImage(0,#taille_image, #taille_image)
  DrawImage(ImageID(0), 0,0)
  StopDrawing()
  AddKeyboardShortcut(0, #PB_Shortcut_Escape, 0)
  AddKeyboardShortcut(0, #PB_Shortcut_F10, 1)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_EventType_RightClick
     ;  move_window()
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1
            move_window()
          Case 0
            End
        EndSelect
    EndSelect
  ForEver    
EndIf

DataSection
  naki:
  IncludeBinary "nak.png"
EndDataSection

Procedure move_window()
  
  If WindowX(0) = #distance_from_border
    posX = DesktopWidth(0) - #distance_from_border - #taille_image
  Else
    posX = #distance_from_border
  EndIf
  
  ResizeWindow(0, posX, #PB_Ignore, #PB_Ignore, #PB_Ignore)
EndProcedure

Procedure Toast_RemoveFromTaskBar(Window.l, state.l)
  Protected hwnd.l = WindowID(Window)
  
  ; cache la fen?tre
  ShowWindow_(hwnd, #SW_HIDE)
  
  ; change le style de la fen?tre ( le plus important )
  If state
    SetWindowLong_(hwnd, #GWL_EXSTYLE, GetWindowLong_(hwnd, #GWL_EXSTYLE) | #WS_EX_TOOLWINDOW)
  Else
    SetWindowLong_(hwnd, #GWL_EXSTYLE, GetWindowLong_(hwnd, #GWL_EXSTYLE) & (~#WS_EX_TOOLWINDOW))
  EndIf
  
  ; notifie la fen?tre que son apparence a chang? (mais ni sa taille, ni sa position)
  If SetWindowPos_(hwnd, 0, 0, 0, 0, 0, #SWP_NOSIZE|#SWP_NOMOVE|#SWP_SHOWWINDOW| #SWP_FRAMECHANGED)
    ProcedureReturn #True
  EndIf
EndProcedure

Re: image sur le bureau

Publié : lun. 18/juil./2016 17:32
par JohnJohnsonSHERMAN
La réponse : Quand tu dessine sur une fenêtre, cette surface de dessin est temporaire. Lorsque la fenêtre est masquée, qu'elle sort de l'écran ou qu'une autre passe dessus, la surface est alors effacée. Pour éviter cela, le systéme renvoie l'événement #PB_Event_Repaint à la fenêtre. Cela lui signifie qu'elle doit redessiner sa surface.
Exemple avec ce petit code qui reprend l'esprit du tien, mais sans les API :

Code : Tout sélectionner

UsePNGImageDecoder()

#Image = 1
#Quit = 0
#TailleImage = 70
#MargeDroite = 10
#MargeBas = 10
#HauteurTaskBar = 35

CatchImage(#Image,?monimage)
ResizeImage(#Image,#TailleImage,#TailleImage)

ExamineDesktops()
X = DesktopWidth(0)-(70+#MargeDroite) ;Position du coin supérieur gauche, en X et Y
Y = DesktopHeight(0)-(70+#MargeBas+#HauteurTaskBar);Il faut retirer la hauteur de la barre des taches en plus pour pas se coller dessus si les marges sont trop faibles

OpenWindow(0,X,Y,70,70,"ToastWindow (style watermark)", #PB_Window_BorderLess)
StartDrawing(WindowOutput(0))
DrawImage(ImageID(#Image),0,0)
StopDrawing()
AddKeyboardShortcut(0,#PB_Shortcut_Escape,#Quit)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Repaint;Et c'est là toute la différence ! Quand la fenêtre est cachée, sa surface de dessin est effacée.
      StartDrawing(WindowOutput(0));Il suffit alors de redessiner l'image dessus.
      DrawImage(ImageID(#Image),0,0)
      StopDrawing()
    Case #PB_Event_Menu
      If EventMenu() = #Quit
        End
      EndIf
  EndSelect
ForEver

DataSection
  monimage:
  IncludeBinary #PB_Compiler_FilePath+"sherman.png";Modifie cela par le chemin de ton image
EndDataSection
Tu constateras qu'en ajoutant les 4 lignes de #PB_Event_Repaint dans ton code, il fonctionnera comme prévu !
Tu peux essayer mon code, en commentant les 4 lignes, puis en passant au dessus de la toastwindow (ou watermark si tu préfére) une autre fenêtre, la surface devient blanche, puisqu'elle a été effacée.

Et voila, c'est tout ! 8)

Re: image sur le bureau

Publié : lun. 18/juil./2016 18:50
par Zorro
JohnJohnsonSHERMAN a écrit : ;Modifie cela par le chemin de ton image
pour ne plus avoir a lire ce genre de chose dans un code partagé sur le forum
utilisez les fonctions de la librairie Load_net() que Ar-s et moi avons donné sur le site ;) :)
http://www.purebasic.fr/french/viewtopi ... =6&t=16131



Code : Tout sélectionner

UsePNGImageDecoder()


#Quit = 0
#TailleImage = 70
#MargeDroite = 10
#MargeBas = 10
#HauteurTaskBar = 35
Declare catchimage_net(adr$)
adr$="http://pngimg.com/upload/tank_PNG1294.png"
Image=CatchImage_Net(adr$)  ;Modifie cela par le chemin de ton image

ResizeImage(Image,#TailleImage,#TailleImage)

ExamineDesktops()
X = DesktopWidth(0)-(70+#MargeDroite) ;Position du coin supérieur gauche, en X et Y
Y = DesktopHeight(0)-(70+#MargeBas+#HauteurTaskBar);Il faut retirer la hauteur de la barre des taches en plus pour pas se coller dessus si les marges sont trop faibles

OpenWindow(0,X,Y,70,70,"ToastWindow (style watermark)", #PB_Window_BorderLess)
StartDrawing(WindowOutput(0))
		DrawImage(ImageID(Image),0,0)
StopDrawing()
AddKeyboardShortcut(0,#PB_Shortcut_Escape,#Quit)

Repeat
		Select WaitWindowEvent()
		Case #PB_Event_Repaint;Et c'est là toute la différence ! Quand la fenêtre est cachée, sa surface de dessin est effacée.
				StartDrawing(WindowOutput(0));Il suffit alors de redessiner l'image dessus.		
						DrawImage(ImageID(Image),0,0)
				StopDrawing()
		Case #PB_Event_Menu
				If EventMenu() = #Quit
						End
				EndIf
		EndSelect
ForEver





Procedure CatchImage_Net(Adr$)
		InitNetwork()
		Protected image
		; By Ar-S  
		*Buffer = ReceiveHTTPMemory(Adr$)
		If *Buffer
				Image = CatchImage(#PB_Any, *Buffer, MemorySize(*Buffer) )
				FreeMemory(*Buffer)
				ProcedureReturn Image
		Else
				ProcedureReturn #false   
		EndIf
EndProcedure

Re: image sur le bureau

Publié : mar. 19/juil./2016 11:05
par JohnJohnsonSHERMAN
Ca sent le placement de produit... :mrgreen: :mrgreen:
Comme ce qu'il veut faire, c'est afficher une image spécifique, je ne vais pas choisir pour lui non? C'est à lui de mettre son image (ou d'utiliser Load_net s'il le souhaite).
Cela dit cette lib est trés utile !

Re: image sur le bureau

Publié : mar. 19/juil./2016 14:04
par Zorro
JohnJohnsonSHERMAN a écrit :Ca sent le placement de produit... :mrgreen: :mrgreen:
ben non je ne touche rien (Free) , de plus la procedure en question est de Ar-s
je ne fais qu'informer, ce qui est aussi le role de ce forum ..

Re: image sur le bureau

Publié : mar. 19/juil./2016 14:12
par JohnJohnsonSHERMAN
Je plaisantais Dobro :P (en même temps avec des :mrgreen: , je suis sans doute pas trés sérieux...)