[R] Imprimer une listview

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

[R] Imprimer une listview

#1

Message par jpascal » jeu. 06 juin 2019 11:22

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 07:53, modifié 1 fois.
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 694
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: [..] Imprimer une listview

#2

Message par walkson » ven. 07 juin 2019 20:57

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

jpascal
Niveau 5
Niveau 5
Messages : 105
Enregistré le : jeu. 16 oct. 2008 15:21
Status : Hors ligne

Re: [..] Imprimer une listview

#3

Message par jpascal » mer. 12 juin 2019 07:53

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.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Répondre