imprimer le contenu de ma fenetre ouverte avec OpenWindow

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

imprimer le contenu de ma fenetre ouverte avec OpenWindow

Message par david »

bonjour,

j'ai un programme qui ouvre une fenetre avec OpenWindow qui affiche des gadgets.... (jusque là tout va bien)
je voudrais faire une copie d'écran sur imprimante de ma fenetre ((un peu comme la touche ImprEcrSyst avec un copier/coller dans word et imprimer))
lles gadgets affichés changent suivant certaines options... donc trop difficile de récupérer les valeurs et de faire drawtext


après :

Code : Tout sélectionner

If PrintRequester()
  If StartPrinting("")
    If StartDrawing(PrinterOutput())
c'est le vide (lol)

merci d'avance car j'ai regardé dans les exemples... et je n'ai pas trouvé grand chose
(j'ai trouvé un programme qui fait une copie de tout l'écran en un fichier jpeg/bmp et que j'arrive a charger en mémoire et imprimer
mais bon, il doit bien y avoir moyen de dire "pixelise ma windows et imprime la-moi , non??)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Message par falsam »

Supprimer : Réponse ne répondant pas à la demande.
Dernière modification par falsam le mer. 27/août/2014 23:24, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Message par falsam »

Ne sachant pas si tu captures une fenêtre depuis une autre fenêtre, ce code comporte deux fenêtres.
-La première est une fenêtre qui contient uniquement un bouton Print Screen.
-La deuxième sera la fenêtre à capturer et à imprimer.
-Employant des API Windows, ce code n'est pas Cross Platform.

Code : Tout sélectionner

Enumeration File
  #Library
EndEnumeration

Enumeration Window
  #Window1
  #Window2
EndEnumeration

Enumeration  
  #PrintScreen
  #List
  #Button1
  #Button2
EndEnumeration


Declare CaptureScreen()
Declare Window_Open1()
Declare Window_Open2()

Prototype.i ptPrintWindow(hWnd, hdc, flags)
If OpenLibrary(#Library, "User32.dll")
  Global PrintWindow.ptPrintWindow = GetFunction(#Library, "PrintWindow")
Else
  MessageRequester("Information","Souci durant l'ouverture du fichier user32.dll")
  End
EndIf

;Cette première fenêtre contient le bouton de capture de la seconde fenêtre
Procedure Window_Open1()
  ExamineDesktops()
  
  OpenWindow(#Window1, 0, 0, DesktopWidth(0), DesktopHeight(0), "#Window1", #PB_Window_SystemMenu)
  ButtonGadget(#PrintScreen, 100, 10, 80, 22, "Capture")
  
  ProcedureReturn #True
EndProcedure

;Fenêtre à capturer
Procedure Window_Open2()
  OpenWindow(#Window2, 0, 0, 800, 600, "#Window2", #PB_Window_SystemMenu|#PB_Window_WindowCentered)
  ListViewGadget(#List, 10, 10, 675, 580)
  ButtonGadget(#Button1, 700, 10, 80, 22, "Button1")
  ButtonGadget(#Button2, 700, 35, 80, 22, "Button2")
  
  StickyWindow(#Window2, #True) ;Fenetre au premier plan
EndProcedure

Procedure CaptureScreen()
  Protected Window.s  = GetWindowTitle(#Window2)
  Protected Left      
  Protected Top       
  Protected Width     
  Protected Height    
  Protected Image
 
  hWnd = FindWindow_(0, Window)
  If hWnd
    SetWindowLongPtr_(hwnd,#GWL_EXSTYLE,#WS_EX_LAYERED)
    SetLayeredWindowAttributes_(hwnd,0,0,#LWA_ALPHA)
    ShowWindow_(hWnd,#SW_RESTORE)
    GetWindowRect_(hWnd, r.RECT)
    Width = r\Right-r\Left
    Height = r\Bottom-r\Top
    
    Image = CreateImage(#PB_Any, Width, Height, 24)
    Result = StartDrawing(ImageOutput(Image))
    Delay(100)
    PrintWindow(hWnd, Result, 0)
    StopDrawing()
    
    If PrintRequester()
      If StartPrinting("Test d'impression")
        If StartDrawing(PrinterOutput())
          BackColor(RGB(255, 255, 255))
          FrontColor(RGB(0, 0, 0)) 
                
          Scale = PrinterPageWidth()/ImageWidth(Image)
        
          Width  = ImageWidth(Image) * Scale
          Height = ImageHeight(Image) * Scale
                
          DrawImage(ImageID(Image), 0, 0, Width, Height)
          StopDrawing()
        EndIf
        StopPrinting()
      EndIf
    EndIf  
    
  Else
    MessageRequester("Information", "La fenêtre " + Window + " N'est pas ouverte")  
  EndIf
EndProcedure

If Window_Open1()
  Window_Open2()
EndIf

BindGadgetEvent(#PrintScreen, @CaptureScreen())

Repeat : Until WaitWindowEvent(100) = #PB_Event_CloseWindow
Dernière modification par falsam le mer. 27/août/2014 23:32, modifié 3 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Message par Micoute »

Merci falsam, voilà un bon programme bien utile !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Message par falsam »

Si quelqu'un pouvait améliorer l'API de capture de la fenetre car je ne comprend pas pourquoi je n'ai pas la totalité de la bordure.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Message par nico »

Getwindowrect ne retourne pas effectivement les bonnes dimensions lorsque AERO est activé; pour retrouver les bonnes coordonnées, il faut utiliser des API spécifiques a Vista et supérieur.

La solution a fait l'objet d'un post sur le forum anglais:
http://www.purebasic.fr/english/viewtop ... 12&t=40353
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Message par falsam »

Changement de méthode, le code est mis à jour. La fenêtre comporte la bordure cette fois-çi.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Message par david »

ouahh... merci falsam
on ne peut pas trouver une réponse qui colle aussi bien à la question que celle-là!

bon, c'est cool car le code est clair, je vais pouvoir l'intégrer facilement
pour ce qui est du reste, il y a beaucoup de nouveaux mots pour moi, je vais essayer de le comprendre

merci encore
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Message par PAPIPP »

Merci falsam pour ce prg

Et Bonjour à tous
Pourquoi les API GDI print de MS ne sont pas pris en compte par PB (Exemple : PrintWindow_(…) ) et qu’il faut passer par un prototype
PrintWindow est une API de MS

Infos MS :
PrintWindow function
The PrintWindow function copies a visual window into the specified device context (DC), typically a printer DC.
Syntax
C++

BOOL PrintWindow( HWND hwnd, HDC hdcBlt, UINT nFlags);

Parameters
hwnd
A handle to the window that will be copied.
hdcBlt
A handle to the device context.
nFlags
The drawing options. It can be one of the following values.
Value Meaning
PW_CLIENTONLY Only the client area of the window is copied to hdcBlt. By default, the entire window is copied.

Return value
If the function succeeds, it returns a nonzero value.
If the function fails, it returns zero.
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Message par falsam »

PAPIPP a écrit :Pourquoi les API GDI print de MS ne sont pas pris en compte par PB
Depuis l'arrivée de Windows 7, Microsoft pense que GDI est arrivé à son terme. Peut être que c'est pour cette raison que les API GDI ne sont pas natives.

La meilleurs réponse sera de Fred :)
With the introduction of Windows Vista a few years ago, it was clear that the era of the Windows Graphics Device Interface (GDI) was coming to an end.
Source : http://msdn.microsoft.com/fr-fr/magazine/dd861344.aspx
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre