Что нового

[Элементы GUI] Печать содержимого окна GUI AutoIt

kasper_sky

Antivirus
Сообщения
116
Репутация
1
Доброго времени суток, скриптеры.
Уж простите меня, ежели не совсем верную ветку выбрал - более подходящей пока не нашел.

Итак, суть обращения к вам, коллективный разум: возможно ли какими-либо средствами распечатать содержимое окна GUI с элементами, созданного в AutoIt?
В принципе, у меня есть идея, например - взять скриншот текущего активного окна и послать его на печать, однако при печати получается "мыло" (текст размывается).
Есть ли еще какие-нибудь идеи?
 

Вложения

  • screenshot_16-11-2014_22-37-50.jpg
    screenshot_16-11-2014_22-37-50.jpg
    74.9 КБ · Просмотры: 28
  • IMG_7546.JPG
    IMG_7546.JPG
    106.6 КБ · Просмотры: 27

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
писал для работы программу учета .
использовал для печати библиотеку http://www.autoitscript.com/forum/topic/51054-printing-using-udf-and-a-dll/#entry386214
пришлось повозиться с алгоритмом построения таблицы ( в моем случае), так как в каждом месяце свое количество рабочих дней
смотри скрин
вот такой лист я получаю на печати из своей программы


Добавлено:
Сообщение автоматически объединено:

вот пример функции для составления рамки и заполнении ее данными.
эту функцию использую в своей рабочей программе.
за основу взял пример на официальном форуме (ссылка выше) и переделал под свои нужды. точнее в моей функции от примера мало что осталось :smile:

Код:
#include <printMGv2.au3>
Func _printdata($datatitle, $printdata, $pageorient);параметры: заголовок, массив с данными(для заполнения строк), ориентация страницы(альбомная или книжная)
	Local $linesum = UBound($printdata) - 1
	Local $hp
	Local $mmssgg, $marginx, $marginy
	$hp = _PrintDllStart($mmssgg)
	If $hp = 0 Then Return
	$printin = _PrintSetPrinter($hp)
	If $printin = 0 Or $printin = -1 Then
		_PrintAbort($hp)
		_PrintDllClose($hp)
		Return
	EndIf
	$print = _PrintGetPrinter($hp)
	If $print = '' Then
		_PrintAbort($hp)
		_PrintDllClose($hp)
		Return
	EndIf
	_PrintPageOrientation($hp, $pageorient)
	_PrintStartPrint($hp)
	Local $pgwd, $pght, $colth, $right
	If $pageorient = 1 Then ;альбомная
		$pgwd = _PrintGetpageheight($hp) - _PrintGetYOffset($hp)
		$pght = _PrintGetpageWidth($hp) - _PrintGetXOffset($hp)
		$basey = 100
		$basex = 100
		$colth = 300
		$right = 300
	ElseIf $pageorient = 0 Then ;книжная
		$pght = _PrintGetpageheight($hp) - _PrintGetYOffset($hp)
		$pgwd = _PrintGetpageWidth($hp) - _PrintGetXOffset($hp)
		$basey = 150
		$basex = 250
		$colth = 350
		$right = 0
	EndIf
	$axisx = Round($pgwd * 0.8)
	$axisy = Round($pght * 0.8)
	_PrintSetFont($hp, 'Arial', 18, 0, 'bold,underline')
	$Title = $datatitle
	$tw = _PrintGetTextWidth($hp, $Title)
	$th = _PrintGetTextHeight($hp, $Title)
	_PrintText($hp, $Title, $basex, _PrintGetYOffset($hp))
	_PrintSetLineWid($hp, 6); толщина линий (рамка формы)
	_PrintSetLineCol($hp, 0); цвет линий
	_printsetfont($hp, 'Times New Roman', 12, 0, '')
	$sum = ($linesum * 50) + (($linesum - 1) * 2)

	;рамка формы
	_PrintLine($hp, $basex, $pght - $basey - $axisy - 100, $axisx + $basex - 175 - $right, $pght - $basey - $axisy - 100);горизонтальная линия - верх
	_PrintLine($hp, $basex, $pght - $basey - $axisy, $axisx + $basex - 175 - $right, $pght - $basey - $axisy);горизонтальная линия - верх
	_PrintLine($hp, $basex, $pght - $basey - $axisy - 100, $basex, $pght - $basey - $axisy + $sum);вертикальная линия - лево
	_PrintLine($hp, $axisx + $basex - 175 - $right, $pght - $basey - $axisy - 100, $axisx + $basex - 175 - $right, $pght - $basey - $axisy + $sum) ;вертикальная линия - право
	_PrintLine($hp, $basex, $pght - $basey - $axisy + $sum, $axisx + $basex - 175 - $right, $pght - $basey - $axisy + $sum);горизонтальная линия - низ

	;заполнение шапки
	$titlecol = StringSplit("Дата|Восст-ние|Заправка|Ремонт|Эксперсс|Фасовка", '|')
	$line = $colth
	$coordx = 70
	$coordy = $pght - $basey - $axisy - 85
	For $i = 1 To 5;вертикальные линии шапки
		_PrintLine($hp, $basex + $line, $pght - $basey - $axisy, $basex + $line, $pght - $basey - $axisy - 100)
		_PrintText($hp, $titlecol[$i], $basex + $coordx, $coordy)
		$coordx += $colth
		$line += $colth
	Next
	_PrintText($hp, $titlecol[6], $basex + $coordx, $coordy)

	; рисуем сетку
	_PrintSetLineWid($hp, 2); толщина линий
	_PrintSetLineCol($hp, 0); цвет линий
	$linedata = $colth
	For $i = 1 To 5;вертикальные линии
		_PrintLine($hp, $basex + $linedata, $pght - $basey - $axisy - 6, $basex + $linedata, $pght - $basey - $axisy + $sum)
		$linedata += $colth
	Next
	$next = $sum / $linesum
	For $i = 2 To UBound($printdata) - 1;горизонтальные линии
		_PrintLine($hp, $basex, $pght - $basey - $axisy + $next, $axisx + $basex - 175 - $right, $pght - $basey - $axisy + $next)
		$next += $sum / $linesum
	Next

	;заполняем таблицу
	$coordyt = $pght - $basey - $axisy
	$coordxt = $colth
	For $i = 1 To UBound($printdata) - 1
		_PrintText($hp, $printdata[$i][0], $basex + 30, $coordyt)
		_PrintText($hp, $printdata[$i][1], $basex + 30 + $colth, $coordyt)
		_PrintText($hp, $printdata[$i][2], $basex + 30 + $colth + $colth, $coordyt)
		_PrintText($hp, $printdata[$i][3], $basex + 30 + $colth + $colth + $colth, $coordyt)
		_PrintText($hp, $printdata[$i][4], $basex + 30 + $colth + $colth + $colth + $colth, $coordyt)
		_PrintText($hp, $printdata[$i][5], $basex + 30 + $colth + $colth + $colth + $colth + $colth, $coordyt)
		$coordyt += $sum / $linesum
	Next

	_PrintEndPrint($hp)
	_PrintNewPage($hp);
	_PrintDllClose($hp)
EndFunc   ;==>_printdata
Конечно, все написано недостаточно аккуратно, можно некоторые моменты упростить.
 

Вложения

  • печать.jpg
    печать.jpg
    101.7 КБ · Просмотры: 40

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
kasper_sky
Что если вызвать программно Alt+Ptr-Scr, конвертировать буфер-обмена в файл и последний выслать на печать? Или в своей программе сделать GUI на основе объекта HTML и вызвать печать объекта?
 
Верх