[R] Imprimer une listview

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[R] Imprimer une listview

#1

Message par jpascal »

Bonjour,

Je souhaiterai pouvoir imprimer une listview générée dans une GUI.

Pour l'instant, je peux imprimer la GUI mais la ligne _ScreenCapture_CaptureWnd($sFilePrint, $g_hListview) ne fonctionne pas.

De plus lorsque l'aperçu de l'impression apparaît, la GUI apparaît sur toute la page.

En recherchant, je suis tombé sur différents scripts :
Printing using UDF and a dll : https://www.autoitscript.com/forum/topi ... and-a-dll/
PrintWinAPI.au3 : https://www.autoitscript.com/forum/topi ... om-autoit/
Print Preview : https://www.autoitscript.com/forum/topi ... t-preview/
mais ils sont anciens ou ne fonctionnent pas.

Dans l'idéal, je souhaiterais imprimer la liste dans une taille de caractère normale et de façon automatique (sans aperçu) de manière à ce que cela ne s'imprime pas sur toute la feuille A4.

Je peux aussi créer un fichier texte à partir de la liste et l'imprimer mais si vous avez une autre idée.

#Region Includes
#include <ColorConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <MsgBoxConstants.au3>
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>
#EndRegion Includes

#Region Variables
Global Const $g_sTitleApp = "TEST"

Global $g_hGUI = 0, $g_hListview = 0, $g_idButton_Print = 0
Global Const $g_iWitdhGUI = 300, $g_iMarge = 15, $g_iHeightButton = 25
Global $g_iHeightListview = 0, $g_iHeightListviewGroup = 22, $g_iHeightListviewLine = 18
#EndRegion Variables

Go()


Func Go()
   Local $iTotalPrinter = 0, $iHeightGUI = 0
   Local $sFilePrint = @TempDir & '\Alertes Conso Matabiau.jpg'

   CreateGUI()

   $iHeightGUI = 42 + $g_iHeightButton + $g_iMarge + $g_iHeightListview + 2 * $g_iMarge

   WinMove($g_hGUI, '', (@DesktopWidth - $g_iWitdhGUI) / 2, (@DesktopHeight - $iHeightGUI) / 2, $g_iWitdhGUI + 10, $iHeightGUI)
   Sleep(1000)
   ProgressOff()

   GUISetState(@SW_SHOW)
   While 1
      $nGUIMsg = GUIGetMsg()
      Switch $nGUIMsg
         Case $GUI_EVENT_CLOSE
            Exit
         Case $g_idButton_Print
            _ScreenCapture_CaptureWnd($sFilePrint, $g_hGUI)
;~             _ScreenCapture_CaptureWnd($sFilePrint, $g_hListview)
            _FilePrint($sFilePrint)
;~             FileDelete($sFilePrint)
      EndSwitch
   WEnd
EndFunc   ;==>Go

Func CreateGUI()
   Local $iHeightGUI = 800
   Local $iIndex = 0

   $g_hGUI = GUICreate($g_sTitleApp, $g_iWitdhGUI, $iHeightGUI, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
   GUISetBkColor($COLOR_WHITE, $g_hGUI)
   $g_idButton_Print = GUICtrlCreateButton("Imprimer", $g_iMarge, $g_iMarge, $g_iWitdhGUI - 2 * $g_iMarge, $g_iHeightButton)
   $g_hListview = _GUICtrlListView_Create($g_hGUI, "", $g_iMarge, 2 * $g_iMarge + $g_iHeightButton, $g_iWitdhGUI - 2 * $g_iMarge, 800, BitOR($LVS_NOCOLUMNHEADER, $LVS_REPORT))

   _GUICtrlListView_AddColumn($g_hListview, "", $g_iWitdhGUI - 2 * $g_iMarge - 40)
   _GUICtrlListView_AddColumn($g_hListview, "", 40)
   _GUICtrlListView_EnableGroupView($g_hListview)

   For $iGroup = 1 To 5
      $bFirstLine = True
      _GUICtrlListView_InsertGroup($g_hListview, -1, $iGroup, 'Group ' & $iGroup)
      For $iLine = 1 To Random(1, 4, 1)
         $iIndex = _GUICtrlListView_AddItem($g_hListview, 'Line ' & $iLine)
         _GUICtrlListView_SetItemGroupID($g_hListview, $iIndex, $iGroup)
         _GUICtrlListView_AddSubItem($g_hListview, $iIndex, Random(1, 99, 1) & ' %', 1)
         If $bFirstLine Then
            $g_iHeightListview += $g_iHeightListviewGroup
            $bFirstLine = False
         EndIf
         $g_iHeightListview += $g_iHeightListviewLine
      Next
   Next
EndFunc   ;==>CreateGUI
Modifié en dernier par jpascal le mer. 12 juin 2019 08:53, modifié 1 fois.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Imprimer une listview

#2

Message par walkson »

Bonjour,
Il y a plusieurs solutions
Avec _ScreenCapture_CaptureWnd(), c'est possible avec le gros inconvénient de ne pas reproduire entièrement la LV si elle utilise un scroll
Dans ce cas, vous imprimez le scroll (ascenseur) mais pas toutes les données.
L'impression reste délicat, je vous mets 2 solutions pour éviter d'imprimer en format paysage
Dans l'exemple, vous pouvez redimensionner l'image (_GDIPlus_ImageResize)

#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <ScreenCapture.au3>
#include <GDIPlus.au3>

$GUI = GUICreate("(UDF Created) ListView Create", 400, 300)

$cBtn_ScreenCapture = GUICtrlCreateButton("Print", 10, 272, 50)

$hListView = _GUICtrlListView_Create($GUI, "", 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
GUISetState()

; Load images
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

; Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
_GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

; Add items
_GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)


FileDelete(@ScriptDir & "\Table_Screenshot.jpg")
FileDelete(@ScriptDir & "\Table_Screenshot1.jpg")
; Loop until user exits
While 1
    Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         FileDelete(@ScriptDir & "\Table_Screenshot.jpg")
         FileDelete(@ScriptDir & "\Table_Screenshot1.jpg")
            Exit
        Case $cBtn_ScreenCapture
            _ScreenCapture_CaptureWnd(@ScriptDir & "\Table_Screenshot.jpg", $hListView)
         _GDIPlus_Startup()
         $image = _GDIPlus_ImageLoadFromFile ( @ScriptDir & "\Table_Screenshot.jpg" )
         $dim = _GDIPlus_ImageGetDimension ( $image)
         $image_1 = _GDIPlus_ImageResize($image, $dim[0]*1.5, $dim[1]*1.5)
         _GDIPlus_ImageSaveToFile ( $image_1, @ScriptDir & "\Table_Screenshot1.jpg")
         _GDIPlus_ImageDispose($image)
         _GDIPlus_ImageDispose($image_1)
         _GDIPlus_Shutdown()

         $tempFile = @ScriptDir & "\Table_Screenshot1.jpg"
         Run('Rundll32.exe "' & @SystemDir & '\mshtml.dll",PrintHTML "' & $tempFile & '"', @SystemDir)
         Sleep(3000)
         ControlClick("Imprimer","","Button13")
         ;_PrintImage($tempFile, "PDFCreator")
    EndSwitch
WEnd
Func _PrintImage($filename, $printer)
    If Not FileExists($filename) Then
        SetError(1, "Specified file couldn't be found")
        Return(0)
    EndIf
    $command = "RunDLL32.EXE shimgvw.dll,ImageView_PrintTo /pt " & $filename & " " & $printer
    Run($command)
EndFunc


Autres solutions, qui consistent à récupérer la LV dans un array. Cela sous entend que la LV a été construite autrement que par un array ou que les données ont été modifiées, sinon on récupère directement les données de l'array du départ pour les écrire dans un fichier
Dans l'exemple suivant, on écrit les données dans un TXT. C'est simple mais l’inconvénient est que si les données sont de tailles changeantes, le TXT ne ressemble plus à un tableau
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <Debug.au3>
Example()

Func Example()
    Local $aItem, $sText, $idListview

    GUICreate("ListView Get Item Text Array", 400, 300)

    $idListview = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
    GUICtrlCreateListViewItem("line1|data1|more1", $idListview)
    GUICtrlCreateListViewItem("line2|data2|more2", $idListview)
    GUICtrlCreateListViewItem("line3|data3|more3", $idListview)
    GUICtrlCreateListViewItem("line4|data4|more4", $idListview)
    GUICtrlCreateListViewItem("line5|data5|more5", $idListview)

    GUISetState(@SW_SHOW)


   $ColumnCount = _GUICtrlListView_GetColumnCount ( $idListview )
   $ItemCount = _GUICtrlListView_GetItemCount ( $idListview )
   Local $aArray[0][$ColumnCount]

   For $i = 0 To $ItemCount - 1
      $aItem_1 = _GUICtrlListView_GetItemTextArray($idListview,$i)
      _ArrayDelete($aItem_1, 0)
      _ArrayTranspose($aItem_1)
      _ArrayAdd($aArray,$aItem_1)
   Next
   _DebugArrayDisplay($aArray)
   $string = _ArrayToString($aArray)
   FileWrite("Array.txt",$string)
   ShellExecuteWait("Array.txt","","",$SHEX_PRINT )
   FileDelete("Array.txt")
    ; Boucle jusqu'à ce que l'utilisateur quitte.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    GUIDelete()
EndFunc   ;==>Example


Même punition avec Excel, la, le tableau reste un tableau
#include <Excel.au3>
#include <GuiListView.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <Debug.au3>
; Create application object and create a new workbook
Local $oExcel = _Excel_Open()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeWrite Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
Local $oWorkbook = _Excel_BookNew($oExcel)
If @error Then
   MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeWrite Example", "Error creating the new workbook." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
   _Excel_Close($oExcel)
   Exit
EndIf

; Write a part of a 2D array to the active sheet in the active workbook
Local $aArray2D = gui()
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aArray2D, "A1")
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeWrite Example 3", "Error writing to worksheet." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Excel_Print($oExcel, $oExcel.ActiveSheet)
Sleep(5000)
_Excel_Close($oExcel)

Func gui()
    Local $aItem_1, $idListview

    GUICreate("ListView Get Item Text Array", 400, 300)

    $idListview = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
    GUICtrlCreateListViewItem("line1|data1|more1", $idListview)
    GUICtrlCreateListViewItem("line2|data2|more2", $idListview)
    GUICtrlCreateListViewItem("line3|data3|more3", $idListview)
    GUICtrlCreateListViewItem("line4|data4|more4", $idListview)
    GUICtrlCreateListViewItem("line5|data5|more5", $idListview)

    GUISetState(@SW_SHOW)


   $ColumnCount = _GUICtrlListView_GetColumnCount ( $idListview )
   $ItemCount = _GUICtrlListView_GetItemCount ( $idListview )
   Local $aArray[0][$ColumnCount]

   For $i = 0 To $ItemCount - 1
      $aItem_1 = _GUICtrlListView_GetItemTextArray($idListview,$i)
      _ArrayDelete($aItem_1, 0)
      _ArrayTranspose($aItem_1)
      _ArrayAdd($aArray,$aItem_1)
   Next
   _DebugArrayDisplay($aArray)
Return $aArray
EndFunc
 
Et pour le plaisir, avec Word
#include <MsgBoxConstants.au3>
#include <Word.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <Debug.au3>
; Create application object
Local $oWord = _Word_Create()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocTableWrite Example", _
      "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
; Open the test document
Local $oDoc = _Word_DocAdd($oWord)

; Write the content of a 0-based two dimensional array to a Word table
Local $asArray = gui()
Local $oRange = _Word_DocRangeSet($oDoc, 0)
_Word_DocTableWrite($oRange, $asArray, 0, "|")
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocTableWrite Example", _
      "Error creating the table." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Word_DocPrint($oDoc)
MsgBox(0,"","Doc print")
_Word_Quit($oWord)


Func gui()
    Local $aItem_1, $idListview

    GUICreate("ListView Get Item Text Array", 400, 300)

    $idListview = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
    GUICtrlCreateListViewItem("line1|data1|more1", $idListview)
    GUICtrlCreateListViewItem("line2|data2|more2", $idListview)
    GUICtrlCreateListViewItem("line3|data3|more3", $idListview)
    GUICtrlCreateListViewItem("line4|data4|more4", $idListview)
    GUICtrlCreateListViewItem("line5|data5|more5", $idListview)

    GUISetState(@SW_SHOW)


   $ColumnCount = _GUICtrlListView_GetColumnCount ( $idListview )
   $ItemCount = _GUICtrlListView_GetItemCount ( $idListview )
   Local $aArray[0][$ColumnCount]

   For $i = 0 To $ItemCount - 1
      $aItem_1 = _GUICtrlListView_GetItemTextArray($idListview,$i)
      _ArrayDelete($aItem_1, 0)
      _ArrayTranspose($aItem_1)
      _ArrayAdd($aArray,$aItem_1)
   Next
   _DebugArrayDisplay($aArray)
Return $aArray
EndFunc
Petite explication
   $ColumnCount = _GUICtrlListView_GetColumnCount ( $idListview )
   $ItemCount = _GUICtrlListView_GetItemCount ( $idListview )
   Local $aArray[0][$ColumnCount];array de base

   For $i = 0 To $ItemCount - 1
      $aItem_1 = _GUICtrlListView_GetItemTextArray($idListview,$i);récupère les données par ligne dans un array (ici, un array de 3 lignes)
      _ArrayDelete($aItem_1, 0);supprime la ligne 0 qui contient le nb d'éléments
      _ArrayTranspose($aItem_1); positionne l'array en colonne
      _ArrayAdd($aArray,$aItem_1);ajout dans l'array de base
   Next
Je vous laisse choisir la solution qui vous convient :D
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Imprimer une listview

#3

Message par jpascal »

Bonjour walkson,

Un grand merci pour cette réponse plus que complète.

La solution avec GDIPlus me convient tout à fait et la possibilité de redimensionner l'image, une option intéressante. ;-)
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Répondre