image sur le bureau

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
ChaudEf
Messages : 179
Inscription : dim. 27/déc./2015 17:02
Localisation : Strasbourg

image sur le bureau

Message 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
Windows 10 x64 -- Purebasic 5.70 LTS x86
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: image sur le bureau

Message 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)
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: image sur le bureau

Message 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
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: image sur le bureau

Message 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 !
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: image sur le bureau

Message 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 ..
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: image sur le bureau

Message par JohnJohnsonSHERMAN »

Je plaisantais Dobro :P (en même temps avec des :mrgreen: , je suis sans doute pas trés sérieux...)
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Répondre