Page 1 sur 1

imprimer le contenu de ma fenetre ouverte avec OpenWindow

Publié : mer. 27/août/2014 14:29
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??)

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Publié : mer. 27/août/2014 17:27
par falsam
Supprimer : Réponse ne répondant pas à la demande.

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Publié : mer. 27/août/2014 18:04
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

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Publié : mer. 27/août/2014 18:29
par Micoute
Merci falsam, voilà un bon programme bien utile !

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Publié : mer. 27/août/2014 18:40
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.

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Publié : mer. 27/août/2014 20:06
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

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Publié : mer. 27/août/2014 23:28
par falsam
Changement de méthode, le code est mis à jour. La fenêtre comporte la bordure cette fois-çi.

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Publié : jeu. 28/août/2014 7:31
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

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Publié : jeu. 28/août/2014 8:21
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+

Re: imprimer le contenu de ma fenetre ouverte avec OpenWindo

Publié : jeu. 28/août/2014 9:29
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