Что нового

Печать отредактированого изображения с предпросмотром.

Godygadu

Новичок
Сообщения
47
Репутация
0
Доброго времени суток вам любители AUTOIT. При помощи этого я зыка яя уже смог реализовать несколько полезностей для работы. Я новичок. Но хочу спросить вас возможно ли реализовать одну задумку на этом языке?
Вобщем идея такая. По долгу службы мне часто (каждый день) необходимо распечатывать изображения с определенным форматированием. Объясню. Берем 4 картинки с разрешением 1024 копируем их в LIBREOffice и форматируем так, что бы все 4 картинки разместились на листе а4 в горизонтальном режиме.
Как я себе это представляю. Создать форму в которой будет 4 окна в которые путем перетаскивания помещаются картинки, есть кнопка "печать", "сохранить как" и поле ввода для комментария.После перетаскивании картинок, формируется предпросмотр готового листа, если надо добавляем комментарий, нажимаем на "печать" или "сохранить как" (сохранять желательно в универсальном формате) после чего окна очищаюстя и готовы для вставки новых картинок. Обязательно нужна проверка сохранения перед печатью. Вставляем новые. Спасибо за любые подсказки.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Возможно ли реализовать задумку?

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Возможно ли реализовать задумку?" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Глобальный модератор.
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Re: Возможно ли реализовать задумку?

предупреждение принял. а по поводу вопроса есть идеи?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Re: Возможно ли реализовать задумку?

Godygadu

Думаю, если тему переименовать во что-то вроде "Печать изображений с предпросмотром", идеи появятся.
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Вот болванка, как я вижу программу
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=C:\Program Files\koda_1.7.3.0\Forms\Form1.kxf
$Form1 = GUICreate("Form1", 405, 441, 654, 116)
GUISetBkColor(0x808080)
$Edit1 = GUICtrlCreateEdit("", 8, 8, 185, 153)
GUICtrlSetData(-1, "Edit1")
GUICtrlSetBkColor(-1, 0xD4D0C8)
$Edit2 = GUICtrlCreateEdit("", 208, 8, 185, 153)
GUICtrlSetData(-1, "Edit2")
GUICtrlSetBkColor(-1, 0xD4D0C8)
$Edit3 = GUICtrlCreateEdit("", 8, 168, 185, 137)
GUICtrlSetData(-1, "Edit3")
GUICtrlSetBkColor(-1, 0xD4D0C8)
$Edit4 = GUICtrlCreateEdit("", 208, 168, 185, 137)
GUICtrlSetData(-1, "Edit4")
GUICtrlSetBkColor(-1, 0xD4D0C8)
$Comment = GUICtrlCreateInput("Comment", 8, 320, 185, 21)
GUICtrlSetBkColor(-1, 0xC0C0C0)
$Button1 = GUICtrlCreateButton("Сохранить как", 8, 376, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button2 = GUICtrlCreateButton("Печать", 232, 376, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button3 = GUICtrlCreateButton("Вставить", 232, 320, 163, 25)
GUICtrlSetBkColor(-1, 0xC0C0C0)
$Progress1 = GUICtrlCreateProgress(8, 416, 390, 16)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Godygadu

На основе примеров с оф форума:
Код:
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <FontConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


Const $HORZRES = 8
Const $VERTRES = 10
;Const $PS_SOLID = 0
;Const $PS_DASH = 1
;Const $PS_DOT = 2
;Const $PS_DASHDOT = 3
;Const $PS_DASHDOTDOT = 4
;Const $PS_NULL = 5
;Const $PS_INSIDEFRAME = 6
Const $AD_COUNTERCLOCKWISE = 1
Const $AD_CLOCKWISE = 2
Global Const $tagDOCINFO = "int Size;" & _ ; int cbSize;
		"ptr DocName;" & _ ; LPCTSTR lpszDocName;
		"ptr Output;" & _ ; LPCTSTR lpszOutput;
		"ptr Datatype;" & _ ; LPCTSTR lpszDatatype;
		"dword Type" ; DWORD fwType;

Global Const $__WINAPCONSTANT_LOGPIXELSX = 88
Global Const $__WINAPCONSTANT_LOGPIXELSY = 90

Dim $aPic[4]

; Настройки печати
Global $s_DocName = 'AutoIt' ; имя документа при печати
Global $iX = 0 ; X - координата левого верхнего угла изображения на листе при печати
Global $iY = 0 ; Y - координата левого верхнего угла изображения на листе при печати
Global $iW = 700 ; ширина изображения на листе при печати
Global $iH = 800 ; высота изображения на листе при печати
Global $iPrinter = 0 ; 0 - принтер по умолчанию, 1 - отображать окно ввода имени принтера



#region ### START Koda GUI section ### Form=C:\Program Files\koda_1.7.3.0\Forms\Form1.kxf

$Form1 = GUICreate('Form1', 405, 700, 654, 116, -1, 0x00000010, $WS_EX_ACCEPTFILES)
GUISetBkColor(0x808080)
$Pic1 = GUICtrlCreatePic('', 28, 18, 165, 135)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$Group1 = GUICtrlCreateGroup('Картинка 1', 20, 5, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')


$Pic2 = GUICtrlCreatePic('', 211, 18, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 2', 203, 5, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')


$Pic3 = GUICtrlCreatePic('', 28, 178, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 3', 20, 165, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic4 = GUICtrlCreatePic('', 211, 178, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 4', 203, 165, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Comment = GUICtrlCreateInput('Comment', 8, 330, 185, 21)
GUICtrlSetBkColor(-1, 0xC0C0C0)
$Button1 = GUICtrlCreateButton('Сохранить как', 8, 356, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button2 = GUICtrlCreateButton('Печать', 232, 356, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button3 = GUICtrlCreateButton('Предпросмотр', 232, 330, 163, 25)
GUICtrlSetBkColor(-1, 0xC0C0C0)

$PicPreview = GUICtrlCreatePic('', 5, 410, 395, 250)
GUICtrlSetBkColor(-1, 0x008080)
GUICtrlCreateGroup('Предпросмотр', 2, 395, 400, 265)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

GUISetState(@SW_SHOW)

;~ WinSetOnTop($Form1, '', 1)

#endregion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case -13
			If StringRegExp(@GUI_DragFile, '(?i)(.png)|(.bmp)|(.jpg)|(.jpeg)', 0) Then
				GUICtrlSetImage(@GUI_DropId, @GUI_DragFile)
				Switch @GUI_DropId
					Case $Pic1
						$aPic[0] = @GUI_DragFile
					Case $Pic2
						$aPic[1] = @GUI_DragFile
					Case $Pic3
						$aPic[2] = @GUI_DragFile
					Case $Pic4
						$aPic[3] = @GUI_DragFile
				EndSwitch
			EndIf
		Case $Button1
			_PicPreviewPrintSave(1) ; сохранение
		Case $Button3
			_PicPreviewPrintSave(0) ; предпросмотр
		Case $Button2
			_PicPreviewPrintSave(2) ; печать
	EndSwitch
WEnd


Func _PicPreviewPrintSave($iK)

	If $aPic[0] = '' Or $aPic[1] = '' Or $aPic[2] = '' Or $aPic[3] = '' Then Return MsgBox(262144 + 48, 'Ошибка', 'Загружены не все картинки!')

	_GDIPlus_Startup()
	$hSource1 = _GDIPlus_ImageLoadFromFile($aPic[0]); 1 картинка
	$Size1 = _GDIPlus_GetImageDimension($hSource1)
	$hSource2 = _GDIPlus_ImageLoadFromFile($aPic[1]); 2 картинка
	$Size2 = _GDIPlus_GetImageDimension($hSource2)
	$hSource3 = _GDIPlus_ImageLoadFromFile($aPic[2]); 3 картинка
	$Size3 = _GDIPlus_GetImageDimension($hSource3)
	$hSource4 = _GDIPlus_ImageLoadFromFile($aPic[3]); 4 картинка
	$Size4 = _GDIPlus_GetImageDimension($hSource4)

	If $Size1[0] + $Size2[0] > $Size3[0] + $Size4[0] Then
		$iWidth = $Size1[0] + $Size2[0]
	Else
		Local $iWidth = $Size3[0] + $Size4[0]
	EndIf
	If $Size1[1] + $Size3[1] > $Size2[1] + $Size4[1] Then
		Local $iHeight = $Size1[1] + $Size3[1]
	Else
		$iHeight = $Size2[1] + $Size4[1]
	EndIf

	$hDestination = _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight, 0, _GDIPlus_GetImagePixelFormat($hSource1))
	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hDestination)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource1, 0, 0, $Size1[0], $Size1[1])
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource2, $Size1[0], 0, $Size2[0], $Size2[1])
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource3, 0, $Size1[1], $Size3[0], $Size3[1])
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource4, $Size1[0], $Size3[1], $Size4[0], $Size4[1])

	Switch $iK
		Case 0
			$hBMP = _GetImage($hDestination, 395, 250)
			_hBmpToPicControl($PicPreview, $hBMP, 1)
		Case 1
			$var = FileSaveDialog('Выберите имя.', @ScriptDir, 'Рисунки (*.jpg)')
			
			If Not @error Then _GDIPlus_ImageSaveToFile($hDestination, $var & '.jpg')
		Case 2
			_Print($hDestination)
	EndSwitch

	_GDIPlus_GraphicsDispose($hGraphics)
	_GDIPlus_ImageDispose($hDestination)
	_GDIPlus_ImageDispose($hSource1)
	_GDIPlus_ImageDispose($hSource2)
	_GDIPlus_ImageDispose($hSource3)
	_GDIPlus_ImageDispose($hSource4)
	_GDIPlus_Shutdown()
EndFunc   ;==>_PicPreviewPrintSave


Func _Print($hBitmap)
	; Create a printer device context
	$s_PrinterName = _GetDefaultPrinter()

	If $iPrinter = 1 Then $s_PrinterName = InputBox('Печать', 'Введите название принтера', $s_PrinterName)
	If $s_PrinterName = '' Then Return SetError(0, 0, 0)

	$hPrintDc = _WinAPI_CreateDC('winspool', $s_PrinterName)

	; get pixel and twips info
	$PixelsPerInchY = _WinAPI_GetDeviceCaps($hPrintDc, $__WINAPCONSTANT_LOGPIXELSY); Get Pixels Per Inch Y
	$TwipsPerPixelY = 1440 / $PixelsPerInchY
	$PixelsPerInchX = _WinAPI_GetDeviceCaps($hPrintDc, $__WINAPCONSTANT_LOGPIXELSX); Get Pixels Per Inch X
	$TwipsPerPixelX = 1440 / $PixelsPerInchX

	; get page width and height
	$PageWidth = _WinAPI_GetDeviceCaps($hPrintDc, $HORZRES); Get width, in millimeters, of the physical screen
	$PageHeight = _WinAPI_GetDeviceCaps($hPrintDc, $VERTRES); Get height, in millimeters, of the physical screen.

	; set docinfo

	$DocName = DllStructCreate('char DocName[' & StringLen($s_DocName & Chr(0)) & ']')
	DllStructSetData($DocName, 'DocName', $s_DocName & Chr(0)); Size of DOCINFO structure
	$DOCINFO = DllStructCreate($tagDOCINFO); Structure for Print Document info
	DllStructSetData($DOCINFO, 'Size', 20); Size of DOCINFO structure
	DllStructSetData($DOCINFO, 'DocName', DllStructGetPtr($DocName)); Set name of print job (Optional)
	; start new print doc
	$result = _WinAPI_StartDoc($hPrintDc, $DOCINFO)
	; start new page
	$result = _WinAPI_StartPage($hPrintDc)
	$hGraphic = _GDIPlus_GraphicsCreateFromHDC($hPrintDc)

	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iW, $iH)

	_GDIPlus_GraphicsDispose($hGraphic)
	; End the page
	$result = _WinAPI_EndPage($hPrintDc)
	; End the print job
	$result = _WinAPI_EndDoc($hPrintDc)
	; Delete the printer device context
	_WinAPI_DeleteDC($hPrintDc)
EndFunc   ;==>_Print

Func _GetDefaultPrinter()
	Local $szDefPrinterName
	Local $Size
	$namesize = DllStructCreate('dword')
	DllCall('winspool.drv', 'int', 'GetDefaultPrinter', 'str', '', 'ptr', DllStructGetPtr($namesize))
	$pname = DllStructCreate('char[' & DllStructGetData($namesize, 1) & ']')
	DllCall('winspool.drv', 'int', 'GetDefaultPrinter', 'ptr', DllStructGetPtr($pname), 'ptr', DllStructGetPtr($namesize))
	Return DllStructGetData($pname, 1);msgbox(0,dllstructgetdata($namesize,1),DllStructGetData($pname,1))
EndFunc   ;==>_GetDefaultPrinter

Func _GetImage($hImage, $iWH, $iHH, $iBkClr = 0xFFFFFF)
	Local $hBmp1, $hBitmap, $hGraphic, $iW, $iH, $aGS, $hBmp2
	$hBmp1 = _WinAPI_CreateBitmap($iWH, $iHH, 1, 32)
	$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp1)
	$hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)
	_WinAPI_DeleteObject($hBmp1)
	_GDIPlus_GraphicsClear($hGraphic, BitOR(0xFF000000, $iBkClr))
	$iW = _GDIPlus_ImageGetWidth($hImage)
	$iH = _GDIPlus_ImageGetHeight($hImage)
	$aGS = _GetScaleNew($iW, $iH, $iWH, $iHH)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, $aGS[0], $aGS[1], $aGS[2], $aGS[3])
	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_GraphicsDispose($hGraphic)
	$hBmp2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
	_GDIPlus_BitmapDispose($hBitmap)
	Return $hBmp2
EndFunc   ;==>_GetImage

Func _GetScaleNew($iW, $iH, $iWH, $iHH)
	Local $aRet[4]
	If $iW = $iWH And $iH = $iHH Then
		$aRet[2] = $iWH
		$aRet[3] = $iHH
		$aRet[0] = 0
		$aRet[1] = 0
	ElseIf $iW < $iWH And $iH < $iHH Then
		$aRet[2] = $iW
		$aRet[3] = $iH
		$aRet[0] = ($iWH - $iW) / 2
		$aRet[1] = 0
	ElseIf $iW > $iWH Then
		$aRet[2] = $iWH
		$aRet[3] = ($iH / $iW) * $iWH
		$aRet[0] = 0
		$aRet[1] = 0
		If $aRet[3] > $iHH Then
			$aRet[2] = ($iW / $iH) * $iHH
			$aRet[3] = $iHH
			$aRet[0] = 0
			$aRet[1] = 0
		EndIf
	ElseIf $iH > $iHH Then
		$aRet[2] = ($iW / $iH) * $iHH
		$aRet[3] = $iHH
		$aRet[0] = 0
		$aRet[1] = 0
	EndIf
	Return $aRet
EndFunc   ;==>_GetScaleNew

Func _hBmpToPicControl($iCID, ByRef $hBMP, $iFlag = 0)
	Local Const $STM_SETIMAGE = 0x0172
	Local Const $IMAGE_BITMAP = 0
	Local $hOldBmp
	$hOldBmp = GUICtrlSendMsg($iCID, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
	If $hOldBmp Then _WinAPI_DeleteObject($hOldBmp)
	If $iFlag Then _WinAPI_DeleteObject($hBMP)
EndFunc   ;==>_hBmpToPicControl

Func _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromScan0', 'int', $iWidth, 'int', $iHeight, 'int', $iStride, 'int', $iPixelFormat, 'ptr', $pScan0, 'ptr*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[6]
EndFunc   ;==>_GDIPlus_CreateBitmapFromScan0

Func _GDIPlus_GetImageDimension($hImage)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hImage, 'float*', 0, 'float*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Local $result[2]
	$result[0] = $Ret[2]
	$result[1] = $Ret[3]
	Return $result
EndFunc   ;==>_GDIPlus_GetImageDimension

Func _GDIPlus_GetImagePixelFormat($hImage)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImagePixelFormat', 'ptr', $hImage, 'uint*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[2]
EndFunc   ;==>_GDIPlus_GetImagePixelFormat







; <PrintWinAPI.au3>


; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_CreateDC
; Description ...: Creates a device context (DC) for a device using the specified name.
; Syntax.........: _WinAPI_CreateDC($sDriver, $sDevice)
; Parameters ....: $sDriver - Specifies driver name, "winspool" for printing, "display" for screen
; $sDevice - Specifies device name
; Return values .: Success - handle to a DC for the specified device
; ====================================================================================================


Func _WinAPI_CreateDC($sDriver, $sDevice)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "hwnd", "CreateDC", "str", $sDriver, "str", $sDevice, "long", 0, "long", 0)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_CreateDC

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_StartDoc
; Description ...: Starts a print job
; Syntax.........: _WinAPI_StartDoc($hDC, $tDocInfo)
; Parameters ....: $hDC - Identifies the device contex
; $tDocInfo - $tagDOCINFO structure that specifies document info
; Return values .: Success - print job identifier for the document
; ====================================================================================================

Func _WinAPI_StartDoc($hDC, $tDocInfo)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "StartDoc", "hwnd", $hDC, "ptr", DllStructGetPtr($tDocInfo))
	Return $aResult[0]
EndFunc   ;==>_WinAPI_StartDoc

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_EndDoc
; Description ...: Ends a print job
; Syntax.........: _WinAPI_EndDoc($hDC)
; Parameters ....: $hDC - Identifies the device contex
; Return values .: Success - return value greater than zero
; ====================================================================================================


Func _WinAPI_EndDoc($hDC)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "EndDoc", "hwnd", $hDC)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_EndDoc

; #FUNCTION# ====================================================================================================

; Name...........: _WinAPI_StartPage
; Description ...: Prepares the printer driver to accept data
; Syntax.........: _WinAPI_StartPage($hDC)
; Parameters ....: $hDC - Identifies the device contex
; Return values .: Success - return value greater than zero
; ====================================================================================================


Func _WinAPI_StartPage($hDC)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "StartPage", "hwnd", $hDC)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_StartPage

; #FUNCTION# ====================================================================================================

; Name...........: _WinAPI_EndPage
; Description ...: Notifies the device that the application has finished writing to a page
; Syntax.........: _WinAPI_EndPage($hDC)
; Parameters ....: $hDC - Identifies the device contex
; Return values .: Success - return value greater than zero
; ====================================================================================================


Func _WinAPI_EndPage($hDC)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "EndPage", "hwnd", $hDC)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_EndPage

; #FUNCTION# ====================================================================================================

; Name...........: _WinAPI_TextOut
; Description ...: Writes a character string at the specified location, using the currently selected font, background color, and text color
; Syntax.........: _WinAPI_TextOut($hDC, $iXStart, $iYStart, $sString)
; Parameters ....: $hDC - Identifies the device contex
; $iXStart - x-coordinate of starting position
; $iYStart - y-coordinate of starting position
; $sString - character string
; Return values .: Success - return value is nonzero
; ====================================================================================================


Func _WinAPI_TextOut($hDC, $iXStart, $iYStart, $sString = "")
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "TextOut", "hwnd", $hDC, "long", $iXStart, "long", $iYStart, "str", $sString, "long", StringLen($sString))
	Return $aResult[0]
EndFunc   ;==>_WinAPI_TextOut

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_CreatePen
; Description ...: Creates a logical pen that has the specified style, width, and color
; Syntax.........: _WinAPI_CreatePen($iPenStyle, $iWidth, $iColor)
; Parameters ....: $iPenStyle - specifies pen style
; $PS_SOLID = 0
; $PS_DASH = 1
; $PS_DOT = 2
; $PS_DASHDOT = 3
; $PS_DASHDOTDOT = 4
; $PS_NULL = 5
; $PS_INSIDEFRAME = 6
; $iWidth - width of the pen
; $iColor - pen color stated in RGB
; Return values .: Success - Handle to logical pen
; ====================================================================================================


;~ Func _WinAPI_CreatePen($iPenStyle = $PS_SOLID, $iWidth = 0, $iColor = 0x000000)
;~ Local $aResult
;~ $aResult = DllCall("GDI32.dll", "hwnd", "CreatePen", "int", $iPenStyle, "int", $iWidth, "dword", $iColor)
;~ Return $aResult[0]
;~ EndFunc ;==>_WinAPI_CreatePen

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_MoveToEx
; Description ...: Updates the current position to the specified point and optionally retrieves the previous position
; Syntax.........: _WinAPI_MoveToEx($hDC, $iX, $iY, $tPoint)
; Parameters ....: $hDC - Identifies the device contex
; $iX - x-coordinate of the new position, in logical units
; $iY - y-coordinate of the new position, in logical units
; $tPoint - $tagPOINT structure that receives the previous position
; Return values .: Success - non-zero value
; ====================================================================================================


Func _WinAPI_MoveToEx($hDC, $iX, $iY, ByRef $tPoint)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "MoveToEx", "long", $hDC, "int", $iX, "int", $iY, "ptr", DllStructGetPtr($tPoint))
	Return $aResult[0]
EndFunc   ;==>_WinAPI_MoveToEx

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_LineTo
; Description ...: Draws a line from the current position up to, but not including, the specified point
; Syntax.........: _WinAPI_LineTo($hDC, $iXEnd, $iYEnd)
; Parameters ....: $hDC - Identifies the device contex
; $iXEnd - x-coordinate, in logical units, of the endpoint of the line
; $iYEnd - y-coordinate, in logical units, of the endpoint of the line
; Return values .: Success - non-zero value
; ====================================================================================================


;~ Func _WinAPI_LineTo($hDC, $iXEnd, $iYEnd)
;~ Local $aResult
;~ $aResult = DllCall("GDI32.dll", "long", "LineTo", "long", $hDC, "int", $iXEnd, "int", $iYEnd)
;~ Return $aResult[0]
;~ EndFunc ;==>_WinAPI_LineTo

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_SetArcDirection
; Description ...: Sets the drawing direction to be used for arc and rectangle functions
; Syntax.........: _WinAPI_SetArcDirection($hDC, $Direction)
; Parameters ....: $hDC - Identifies the device contex
; $Direction - Specifies the new arc direction
; $AD_COUNTERCLOCKWISE = 1
; $AD_CLOCKWISE = 2
; Return values .: Success - old arc direction
; ====================================================================================================


Func _WinAPI_SetArcDirection($hDC, $Direction)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "SetArcDirection", "long", $hDC, "int", $Direction)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_SetArcDirection

; #FUNCTION# ====================================================================================================

; Name...........: _WinAPI_ArcTo
; Description ...: Draws an elliptical arc
; Syntax.........: _WinAPI_ArcTo($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect, $iXRadial1, $iYRadial1, $iXRadial2, $iYRadial2)
; Parameters ....: $hDC - Identifies the device contex
; $iLeftRect - x-coord of rectangle's upper-left corner
; $iTopRect - y-coord of rectangle's upper-left corner
; $iRightRect - x-coord of rectangle's lower-right corner
; $iBottomRect - y-coord of rectangle's lower-right corner
; $iXRadial1 - x-coord of first radial ending point
; $iYRadial1 - y-coord of first radial ending point
; $iXRadial2 - x-coord of second radial ending point
; $iYRadial2 - y-coord of second radial ending point
; Return values .: Success - return value is nonzero
; ====================================================================================================

Func _WinAPI_ArcTo($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect, $iXRadial1, $iYRadial1, $iXRadial2, $iYRadial2)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "ArcTo", "long", $hDC, "int", $iLeftRect, "int", $iTopRect, "int", $iRightRect, "int", $iBottomRect, "int", $iXRadial1, "int", $iYRadial1, "int", $iXRadial2, "int", $iYRadial2)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_ArcTo

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_Arc
; Description ...: Draws an elliptical arc
; Syntax.........: _WinAPI_Arc($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect, $iXStartArc, $iYStartArc, $iXEndArc, $iYEndArc)
; Parameters ....: $hDC - Identifies the device contex
; $iLeftRect - x-coord of rectangle's upper-left corner
; $iTopRect - y-coord of rectangle's upper-left corner
; $iRightRect - x-coord of rectangle's lower-right corner
; $iBottomRect - y-coord of rectangle's lower-right corner
; $iXStartArc - x-coord of first radial ending point
; $iYStartArc - y-coord of first radial ending point
; $iXEndArc - x-coord of second radial ending point
; $iYEndArc - y-coord of second radial ending point
; Return values .: Success - return value is nonzero
; ====================================================================================================


Func _WinAPI_Arc($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect, $iXStartArc, $iYStartArc, $iXEndArc, $iYEndArc)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "Arc", "long", $hDC, "int", $iLeftRect, "int", $iTopRect, "int", $iRightRect, "int", $iBottomRect, "int", $iXStartArc, "int", $iYStartArc, "int", $iXEndArc, "int", $iYEndArc)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_Arc

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_Rectangle
; Description ...: Draws a rectangle
; Syntax.........: _WinAPI_Rectangle($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect)
; Parameters ....: $hDC - Identifies the device contex
; $iLeftRect - x-coord of rectangle's upper-left corner
; $iTopRect - y-coord of rectangle's upper-left corner
; $iRightRect - x-coord of rectangle's lower-right corner
; $iBottomRect - y-coord of rectangle's lower-right corner
; Return values .: Success - return value is nonzero
; ====================================================================================================

Func _WinAPI_Rectangle($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "Rectangle", "long", $hDC, "int", $iLeftRect, "int", $iTopRect, "int", $iRightRect, "int", $iBottomRect)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_Rectangle

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_RoundRect
; Description ...: Draws a rectangle
; Syntax.........: _WinAPI_RoundRect($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect, $iWidth, $iHeight)
; Parameters ....: $hDC - Identifies the device contex
; $iLeftRect - x-coord of rectangle's upper-left corner
; $iTopRect - y-coord of rectangle's upper-left corner
; $iRightRect - x-coord of rectangle's lower-right corner
; $iBottomRect - y-coord of rectangle's lower-right corner
; $iWidth - width of ellipse
; $iHeight - height of ellipse
; Return values .: Success - return value is nonzero
; ====================================================================================================


Func _WinAPI_RoundRect($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect, $iWidth, $iHeight)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "RoundRect", "long", $hDC, "int", $iLeftRect, "int", $iTopRect, "int", $iRightRect, "int", $iBottomRect, "int", $iWidth, "int", $iHeight)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_RoundRect

; #FUNCTION# ====================================================================================================


; Name...........: _WinAPI_Ellipse
; Description ...: Draws a ellipse
; Syntax.........: _WinAPI_Ellipse($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect)
; Parameters ....: $hDC - Identifies the device contex
; $iLeftRect - x-coord of rectangle's upper-left corner of rectangle
; $iTopRect - y-coord of rectangle's upper-left corner of rectangle
; $iRightRect - x-coord of rectangle's lower-right corner of rectangle
; $iBottomRect - y-coord of rectangle's lower-right corner of rectangle
; Return values .: Success - return value is nonzero
; ====================================================================================================


Func _WinAPI_Ellipse($hDC, $iLeftRect, $iTopRect, $iRightRect, $iBottomRect)
	Local $aResult
	$aResult = DllCall("GDI32.dll", "long", "Ellipse", "long", $hDC, "int", $iLeftRect, "int", $iTopRect, "int", $iRightRect, "int", $iBottomRect)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_Ellipse

Предполагается, что картинки одинаковые
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Godygadu

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Редактирование изображения(вертикально, горизонтально, заполнение листа) должно осуществляться возможностями принтера. Я так понимаю?
И как быть, если изображения разного размера? :IL_AutoIt_1:


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

Я думаю, что надо сделать так, что бы печать осуществлялась в альбомном режиме с заполнением готовой картинкой. Сейчас лист в портретном режиме. Я пытаюсь найти строку, которая регулирует ориентацию страницы, но моих знаний не хватает. :(
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Godygadu
Настроек ориентации страницы в этом примере нет, надо настраивать в принтере, но в принципе, можно добавить.

Нужно более подробное описание того, что требуется - с примером изначальных картинок(хотя бы просто цветные прямоугольники, тем более если они могут быть разными по размеру) и картинки-результата, которая идет на печать, а также, как конкретно эта картинка должна выглядеть на листе при печати.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Godygadu,
Тему закрыть?
WSWR,
Не надо отвечать пока нет реакции на предупреждение.
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Пожалуйста не закрывайте тему.
WSWR
Я подготовлю все, что необходимо и предоставлю вам. Спасибо за помощь.


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

Уважаемый WSWR я подготовил материал, а так же опробовал программу в полевых условиях. Хочу сказать, что программа ведет себя хорошо за исключением некоторых моментов.
1. Программа абсолютно не воспринимает другие расширения картинок кроме jpg. Я пробовал bmp, png она просто не принимает их, хотя в коде указанно, что они поддерживаются. Я даже переименовывал png в jpg не помогает. А у меня формат картинок png. Это важно.
2. При нажатие на кнопку печать происходит просто печать без выбора параметров оной. Это важно.
3. При печати лист находится в портретном положении и картинки занимают только часть листа в вложении я показал, как должна отображаться страница. Хотя я думаю, что это может решится, если будут настройки печати при выборе печати.
4. Не могли бы вы убрать сообщение об ошибке, если установлено менее 4 картинок( иногда так надо), если можно.
5. Во вложении есть образцы картинок. Всего 4 вида разрешений.
6. Я немного изменил внешний вид. Во вложении.
Спасибо за то, что помогаете мне.


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

Программа


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

Так как файл примеров больше 200 кб разместил его здесь http://zalil.ru/34669769
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Godygadu

В этом примере работают настройки печати (см. начало скрипта) и сохранения в jpg и pdf. При печати картинка предварительно сохраняется на диск, потом удаляется. Может отображаться диалог сохранения, может сохранять без вопросов. При создании pdf почему-то игнорирует установку положения листа.
Кое-какие настройки можно бы вынести на окно в виде чекбоксов, или в ini-файл.


Для работы скрипта нужны следующие файлы:

Библиотека функций работы с принтером printMGv2.au3
http://www.autoitscript.com/forum/topic/51054-printing-using-udf-and-a-dll/#entry386214
dll нужно положить рядом со скриптом, а printMGv2.au3 или также рядом со скриптом, или в папку Include в папке Autoit.

MPDF_UDF.au3
http://www.autoitscript.com/forum/topic/118827-create-pdf-from-your-application/
также рядом со скриптом, или в папку Include в папке Autoit.

FileOperations.au3
http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
рядом со скриптом, или в папку Include в папке Autoit.


Возможно, где-то есть ошибки, сделано-то на скорую руку

Код:
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

#include <MPDF_UDF.au3> ; http://www.autoitscript.com/forum/topic/118827-create-pdf-from-your-application/
#include <printMGv2.au3> ; http://www.autoitscript.com/forum/topic/51054-printing-using-udf-and-a-dll/#entry386214
#include <FileOperations.au3> ; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/

Dim $aPic[4]

; Настройки печати
Global $s_DocName = 'AutoIt' ; имя документа при печати \ PDF
Global $iX = 0 ; X - координата левого верхнего угла изображения на листе при печати
Global $iY = 0 ; Y - координата левого верхнего угла изображения на листе при печати
; Лист А4 в координатах:
Global $iWidth = 2970 ; ширина изображения на листе при печати
Global $iHeight = 2100 ; высота изображения на листе при печати
Global $iPrinter = 0 ; 0 - принтер по умолчанию, 1 - отображать окно выбора принтера,  2 - указать конкретное имя принтера
Global $iPageOrientation = 0 ; ориентация страницы, 1 - обычная, 0 - альбомная

Global $Format = 0 ; формат сохранения, 1 - jpg, 0 - PDF
Global $Save = 0 ; отображать диалог сохранения файлов, 0 - нет, 1 - да

; для PDF
Global $PaperSize = 'a4' ; формат листа для PDF
Global $OpenAfter = 1 ; открыть PDF после генерации, 1 - да, 0 - нет


#region ### START Koda GUI section ### Form=C:\Program Files\koda_1.7.3.0\Forms\Form1.kxf

$Form1 = GUICreate('Нарушение ПДД - 4', 405, 680, 654, 116, -1, 0x00000010, $WS_EX_ACCEPTFILES)
GUISetBkColor(0xDCDCDC)
$Pic1 = GUICtrlCreatePic('', 28, 18, 165, 135, $BS_BITMAP)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$Group1 = GUICtrlCreateGroup('Картинка 1', 20, 5, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic2 = GUICtrlCreatePic('', 211, 18, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 2', 203, 5, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic3 = GUICtrlCreatePic('', 28, 178, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 3', 20, 165, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic4 = GUICtrlCreatePic('', 211, 178, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 4', 203, 165, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Button1 = GUICtrlCreateButton('Сохранить как', 8, 356, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button2 = GUICtrlCreateButton('Печать', 232, 356, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button3 = GUICtrlCreateButton('Предпросмотр', 115, 325, 163, 25)
GUICtrlSetBkColor(-1, 0xC0C0C0)

$PicPreview = GUICtrlCreatePic('', 5, 410, 395, 250)
GUICtrlSetBkColor(-1, 0x008080)
GUICtrlCreateGroup('Предпросмотр', 2, 395, 400, 265)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

GUISetState(@SW_SHOW)

WinSetOnTop($Form1, '', 1)

#endregion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case -13
			If StringRegExp(@GUI_DragFile, '(?i)(.png)|(.bmp)|(.jpg)|(.jpeg)', 0) Then
				$hbmp1 = _GetImage(@GUI_DragFile, 165, 135)
				GUICtrlSendMsg(@GUI_DropId, 0x0172, 0, $hbmp1)
				;GUICtrlSetImage(@GUI_DropId, @GUI_DragFile)

				Switch @GUI_DropId
					Case $Pic1
						$aPic[0] = @GUI_DragFile
					Case $Pic2
						$aPic[1] = @GUI_DragFile
					Case $Pic3
						$aPic[2] = @GUI_DragFile
					Case $Pic4
						$aPic[3] = @GUI_DragFile
				EndSwitch
			EndIf
		Case $Button1
			_PicPreviewPrintSave(1) ; сохранение
		Case $Button3
			_PicPreviewPrintSave(0) ; предпросмотр
		Case $Button2
			_PicPreviewPrintSave(2) ; печать
	EndSwitch
WEnd

Func _GetImage($sFile, $iWH, $iHH)
	_GDIPlus_Startup()
	$hPng = _GDIPlus_ImageLoadFromFile($sFile)
	$Size = _GDIPlus_GetImageDimension($hPng)
	$hDestination = _GDIPlus_CreateBitmapFromScan0($iWH, $iHH, 0, _GDIPlus_GetImagePixelFormat($hPng))
	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hDestination)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hPng, 0, 0, 165, 135)
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hDestination)
	_GDIPlus_ImageDispose($hPng)
	Return $hBitmap
	_GDIPlus_Shutdown()
EndFunc   ;==>_GetImage

Func _PicPreviewPrintSave($iK)
	Local $W = 395, $H = 250, $hB
	_GDIPlus_Startup()
	$hSource1 = _GDIPlus_ImageLoadFromFile($aPic[0]); 1 картинка
	$hSource2 = _GDIPlus_ImageLoadFromFile($aPic[1]); 2 картинка
	$hSource3 = _GDIPlus_ImageLoadFromFile($aPic[2]); 3 картинка
	$hSource4 = _GDIPlus_ImageLoadFromFile($aPic[3]); 4 картинка

	If $iK <> 0 Then
		$W = $iWidth
		$H = $iHeight
	EndIf

	$hDestination = _GDIPlus_CreateBitmapFromScan0($W, $H, 0, _GDIPlus_GetImagePixelFormat($hSource1))
	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hDestination)
	_GDIPlus_GraphicsClear($hGraphics, BitOR(0xFF000000, 0xFFFFFF))
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource1, 0, 0, $W / 2, $H / 2)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource2, $W / 2, 0, $W / 2, $H / 2)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource3, 0, $H / 2, $W / 2, $H / 2)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource4, $W / 2, $H / 2, $W / 2, $H / 2)

	Switch $iK
		Case 0
			$hB = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hDestination)
			GUICtrlSendMsg($PicPreview, 0x0172, 0, $hB)
		Case 1
			If $Format = 1 Then
				$var = $s_DocName
				If $Save = 1 Then
					WinSetOnTop($Form1, '', 0)
					$var = FileSaveDialog('Выберите имя.', @ScriptDir, 'Рисунки (*.jpg)')
					If Not @error Then _GDIPlus_ImageSaveToFile($hDestination, $var & '.jpg')
					WinSetOnTop($Form1, '', 1)
				Else
					_GDIPlus_ImageSaveToFile($hDestination, _FO_GetCopyName(@ScriptDir & '\' & $s_DocName & '.jpg', 1))
				EndIf
			Else
				_PDF($hDestination)
			EndIf
		Case 2
			_Print($hDestination)
	EndSwitch

	_GDIPlus_GraphicsDispose($hGraphics)
	_GDIPlus_ImageDispose($hDestination)
	_GDIPlus_ImageDispose($hSource1)
	_GDIPlus_ImageDispose($hSource2)
	_GDIPlus_ImageDispose($hSource3)
	_GDIPlus_ImageDispose($hSource4)
	_GDIPlus_Shutdown()
EndFunc   ;==>_PicPreviewPrintSave

Func _PDF($hBitmap)
	Local $image = @ScriptDir & '\Test000.jpg' ; временная картинка на диск

	_GDIPlus_ImageSaveToFile($hBitmap, $image)
	_SetTitle($s_DocName)
	_SetSubject('Convert image(s) to pdf')

	If $OpenAfter = 1 Then
		_OpenAfter(True) ; open after generation
	Else
		_OpenAfter(False)
	EndIf

	_SetUnit($PDF_UNIT_CM)
	_SetPaperSize($iPageOrientation)
	_SetZoomMode($PDF_ZOOM_CUSTOM, 90)

	If $iPageOrientation = 0 Then
		_SetOrientation($PDF_ORIENTATION_LANDSCAPE)
	Else
		_SetOrientation($PDF_ORIENTATION_PORTRAIT)
	EndIf

	_SetLayoutMode($PDF_LAYOUT_CONTINOUS)
	$var = _FO_GetCopyName(@ScriptDir & '\' & $s_DocName & '.pdf', 1)

	If $Save = 1 Then
		WinSetOnTop($Form1, '', 0)
		$var = FileSaveDialog('Выберите имя.', @ScriptDir, 'Файлы (*.pdf)', 16)
		WinSetOnTop($Form1, '', 1)
	EndIf
	
	_InitPDF($var) ; initialize the pdf
	_LoadResImage('taietel', $image)
	_BeginPage()

	;scale image to paper size!
	_InsertImage('taietel', 0, 0, _GetPageWidth() / _GetUnit(), _GetPageHeight() / _GetUnit())
	_EndPage()

	;then, finally, write the buffer to disk
	_ClosePDFFile()
	FileDelete($image) ; удаление картинки

EndFunc   ;==>_PDF

Func _Print($hBitmap)
	Local $hp, $mmssgg, $s_PrinterName
	Local $image = @ScriptDir & '\Test000.jpg' ; временная картинка на диск

	_GDIPlus_ImageSaveToFile($hBitmap, $image)

	$hp = _PrintDllStart($mmssgg) ; запуск процесса печати

	Switch $iPrinter
		Case 0
			_PrintSelectPrinter($hp, Default) ; использовать принтер по умолчанию
		Case 1
			_PrintSetPrinter($hp) ; показать диалог выбора принтера
		Case 2
			$s_PrinterName = InputBox('Печать', 'Введите название принтера', $s_PrinterName)
			If $s_PrinterName <> '' Then
				_PrintSelectPrinter($hp, $s_PrinterName)
			Else
				_PrintSelectPrinter($hp, Default)
			EndIf
	EndSwitch

	_PrintPageOrientation($hp, $iPageOrientation); ориентация страницы, 1 - обычная, 0 - альбомная
	_PrintSetDocTitle($hp, $s_DocName) ; имя документа при печати

	_PrintStartPrint($hp) ; запуск печати
	_PrintImage($hp, $image, $iX, $iY, $iWidth, $iHeight) ; печать картинки
	FileDelete($image) ; удаление картинки
	_PrintEndPrint($hp) ; окончание печати
	_PrintNewPage($hp)
	_printDllClose($hp)
EndFunc   ;==>_Print

Func _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromScan0', 'int', $iWidth, 'int', $iHeight, 'int', $iStride, 'int', $iPixelFormat, 'ptr', $pScan0, 'ptr*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[6]
EndFunc   ;==>_GDIPlus_CreateBitmapFromScan0

Func _GDIPlus_GetImageDimension($hImage)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hImage, 'float*', 0, 'float*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Local $result[2]
	$result[0] = $Ret[2]
	$result[1] = $Ret[3]
	Return $result
EndFunc   ;==>_GDIPlus_GetImageDimension

Func _GDIPlus_GetImagePixelFormat($hImage)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImagePixelFormat', 'ptr', $hImage, 'uint*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[2]
EndFunc   ;==>_GDIPlus_GetImagePixelFormat
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Спасибо. Я попробую и отпишусь Вам. :beer:


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

Уважаемый WSWR спасибо Вам за помощь в решение моего вопроса. Ваша программа работает! Правда я подкоректировал некоторые значения, т.е уменьшил размеры листа и изменил число координаты с 0 до 5. Без этого при печати картинка на листе, как бы клювала левым углом. Сейчас все отлично! Повторюсь, что эта программа мне очень поможет в моей работе. Спасибо Вам. :beer: :IL_AutoIt_1:
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Извините, но что эта перемена должна изменить?


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

Хочу еще раз попросить о помощи. Необходимо, что бы в программе можно было очищать формы. То есть удалить картинки и предпросмотр по нажатию кнопки. Ищу, но не могу найти, как. В коде мало комментариев и мне как новичку сложно определить какая переменная за, что отвечает.
Здесь пример кода с кнопкой


Код:
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

#include <MPDF_UDF.au3> ; http://www.autoitscript.com/forum/topic/118827-create-pdf-from-your-application/
#include <printMGv2.au3> ; http://www.autoitscript.com/forum/topic/51054-printing-using-udf-and-a-dll/#entry386214
#include <FileOperations.au3> ; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/

Dim $aPic[4]

; Настройки печати
Global $s_DocName = 'AutoIt' ; имя документа при печати \ PDF
Global $iX = 0 ; X - координата левого верхнего угла изображения на листе при печати
Global $iY = 5; Y - координата левого верхнего угла изображения на листе при печати
; Лист А4 в координатах:
Global $iWidth = 2905 ; ширина изображения на листе при печати
Global $iHeight = 2010 ; высота изображения на листе при печати
Global $iPrinter = 1 ; 0 - принтер по умолчанию, 1 - отображать окно выбора принтера,  2 - указать конкретное имя принтера
Global $iPageOrientation = 0 ; ориентация страницы, 1 - обычная, 0 - альбомная

Global $Format = 1 ; формат сохранения, 1 - jpg, 0 - PDF
Global $Save = 1 ; отображать диалог сохранения файлов, 0 - нет, 1 - да

; для PDF
Global $PaperSize = 'a4' ; формат листа для PDF
Global $OpenAfter = 0 ; открыть PDF после генерации, 1 - да, 0 - нет


#region ### START Koda GUI section ### Form=C:\Program Files\koda_1.7.3.0\Forms\Form1.kxf

$Form1 = GUICreate('Нарушение ПДД - 4', 405, 680, 654, 116, -1, 0x00000010, $WS_EX_ACCEPTFILES)
GUISetBkColor(0xDCDCDC)
$Pic1 = GUICtrlCreatePic('', 28, 18, 165, 135, $BS_BITMAP)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$Group1 = GUICtrlCreateGroup('Картинка 1', 20, 5, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic2 = GUICtrlCreatePic('', 211, 18, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 2', 203, 5, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic3 = GUICtrlCreatePic('', 28, 178, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 3', 20, 165, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic4 = GUICtrlCreatePic('', 211, 178, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 4', 203, 165, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Button1 = GUICtrlCreateButton('(2)Сохранить как', 8, 356, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button2 = GUICtrlCreateButton('(1) Печать', 232, 356, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button3 = GUICtrlCreateButton('Предпросмотр', 232, 325, 163, 25)
GUICtrlSetBkColor(-1, 0xC0C0C0)
$Button4 = GUICtrlCreateButton('Очистить', 8, 325, 163, 25)
GUICtrlSetBkColor(-1, 0xFF0000)

$PicPreview = GUICtrlCreatePic('', 5, 410, 395, 250)
GUICtrlSetBkColor(-1, 0x008080)
GUICtrlCreateGroup('Предпросмотр', 2, 395, 400, 265)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

GUISetState(@SW_SHOW)

WinSetOnTop($Form1, '', 1)

#endregion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case -13
            If StringRegExp(@GUI_DragFile, '(?i)(.png)|(.bmp)|(.jpg)|(.jpeg)', 0) Then
                $hbmp1 = _GetImage(@GUI_DragFile, 165, 135)
                GUICtrlSendMsg(@GUI_DropId, 0x0172, 0, $hbmp1)
                ;GUICtrlSetImage(@GUI_DropId, @GUI_DragFile)

                Switch @GUI_DropId
                    Case $Pic1
                        $aPic[0] = @GUI_DragFile
                    Case $Pic2
                        $aPic[1] = @GUI_DragFile
                    Case $Pic3
                        $aPic[2] = @GUI_DragFile
                    Case $Pic4
                        $aPic[3] = @GUI_DragFile
                EndSwitch
            EndIf
        Case $Button1
            _PicPreviewPrintSave(1) ; сохранение
        Case $Button3
            _PicPreviewPrintSave(0) ; предпросмотр
        Case $Button2
            _PicPreviewPrintSave(2) ; печать


    EndSwitch
WEnd

Func _GetImage($sFile, $iWH, $iHH)
    _GDIPlus_Startup()
    $hPng = _GDIPlus_ImageLoadFromFile($sFile)
    $Size = _GDIPlus_GetImageDimension($hPng)
    $hDestination = _GDIPlus_CreateBitmapFromScan0($iWH, $iHH, 0, _GDIPlus_GetImagePixelFormat($hPng))
    $hGraphics = _GDIPlus_ImageGetGraphicsContext($hDestination)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hPng, 0, 0, 165, 135)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hDestination)
    _GDIPlus_ImageDispose($hPng)
    _GDIPlus_Shutdown()
	Return $hBitmap
EndFunc   ;==>_GetImage

Func _PicPreviewPrintSave($iK)
    Local $W = 395, $H = 250, $hB
    _GDIPlus_Startup()
    $hSource1 = _GDIPlus_ImageLoadFromFile($aPic[0]); 1 картинка
    $hSource2 = _GDIPlus_ImageLoadFromFile($aPic[1]); 2 картинка
    $hSource3 = _GDIPlus_ImageLoadFromFile($aPic[2]); 3 картинка
    $hSource4 = _GDIPlus_ImageLoadFromFile($aPic[3]); 4 картинка

    If $iK <> 0 Then
        $W = $iWidth
        $H = $iHeight
    EndIf

    $hDestination = _GDIPlus_CreateBitmapFromScan0($W, $H, 0, _GDIPlus_GetImagePixelFormat($hSource1))
    $hGraphics = _GDIPlus_ImageGetGraphicsContext($hDestination)
    _GDIPlus_GraphicsClear($hGraphics, BitOR(0xFF000000, 0xFFFFFF))
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource1, 0, 0, $W / 2, $H / 2)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource2, $W / 2, 0, $W / 2, $H / 2)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource3, 0, $H / 2, $W / 2, $H / 2)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource4, $W / 2, $H / 2, $W / 2, $H / 2)

    Switch $iK
        Case 0
            $hB = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hDestination)
            GUICtrlSendMsg($PicPreview, 0x0172, 0, $hB)
        Case 1
            If $Format = 1 Then
                $var = $s_DocName
                If $Save = 1 Then
                    WinSetOnTop($Form1, '', 0)
                    $var = FileSaveDialog('Выберите имя.', @ScriptDir, 'Рисунки (*.jpg)')
                    If Not @error Then _GDIPlus_ImageSaveToFile($hDestination, $var & '.jpg')
                    WinSetOnTop($Form1, '', 1)
                Else
                    _GDIPlus_ImageSaveToFile($hDestination, _FO_GetCopyName(@ScriptDir & '\' & $s_DocName & '.jpg', 1))
                EndIf
            Else
                _PDF($hDestination)
            EndIf
        Case 2
            _Print($hDestination)
    EndSwitch

    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_ImageDispose($hDestination)
    _GDIPlus_ImageDispose($hSource1)
    _GDIPlus_ImageDispose($hSource2)
    _GDIPlus_ImageDispose($hSource3)
    _GDIPlus_ImageDispose($hSource4)
    _GDIPlus_Shutdown()
EndFunc   ;==>_PicPreviewPrintSave

Func _PDF($hBitmap)
    Local $image = @ScriptDir & '\Test000.jpg' ; временная картинка на диск

    _GDIPlus_ImageSaveToFile($hBitmap, $image)
    _SetTitle($s_DocName)
    _SetSubject('Convert image(s) to pdf')

    If $OpenAfter = 1 Then
        _OpenAfter(True) ; open after generation
    Else
        _OpenAfter(False)
    EndIf

    _SetUnit($PDF_UNIT_CM)
    _SetPaperSize($iPageOrientation)
    _SetZoomMode($PDF_ZOOM_CUSTOM, 90)

    If $iPageOrientation = 0 Then
        _SetOrientation($PDF_ORIENTATION_LANDSCAPE)
    Else
        _SetOrientation($PDF_ORIENTATION_PORTRAIT)
    EndIf

    _SetLayoutMode($PDF_LAYOUT_CONTINOUS)
    $var = _FO_GetCopyName(@ScriptDir & '\' & $s_DocName & '.pdf', 1)

    If $Save = 1 Then
        WinSetOnTop($Form1, '', 0)
        $var = FileSaveDialog('Выберите имя.', @ScriptDir, 'Файлы (*.pdf)', 16)
        WinSetOnTop($Form1, '', 1)
    EndIf

    _InitPDF($var) ; initialize the pdf
    _LoadResImage('taietel', $image)
    _BeginPage()

    ;scale image to paper size!
    _InsertImage('taietel', 0, 0, _GetPageWidth() / _GetUnit(), _GetPageHeight() / _GetUnit())
    _EndPage()

    ;then, finally, write the buffer to disk
    _ClosePDFFile()
    FileDelete($image) ; удаление картинки

EndFunc   ;==>_PDF

Func _Print($hBitmap)
    Local $hp, $mmssgg, $s_PrinterName
    Local $image = @ScriptDir & '\Test000.jpg' ; временная картинка на диск

    _GDIPlus_ImageSaveToFile($hBitmap, $image)

    $hp = _PrintDllStart($mmssgg) ; запуск процесса печати

    Switch $iPrinter
        Case 0
            _PrintSelectPrinter($hp, Default) ; использовать принтер по умолчанию
        Case 1
            _PrintSetPrinter($hp) ; показать диалог выбора принтера
        Case 2
            $s_PrinterName = InputBox('Печать', 'Введите название принтера', $s_PrinterName)
            If $s_PrinterName <> '' Then
                _PrintSelectPrinter($hp, $s_PrinterName)
            Else
                _PrintSelectPrinter($hp, Default)
            EndIf
    EndSwitch

    _PrintPageOrientation($hp, $iPageOrientation); ориентация страницы, 1 - обычная, 0 - альбомная
    _PrintSetDocTitle($hp, $s_DocName) ; имя документа при печати

    _PrintStartPrint($hp) ; запуск печати
    _PrintImage($hp, $image, $iX, $iY, $iWidth, $iHeight) ; печать картинки
    FileDelete($image) ; удаление картинки
    _PrintEndPrint($hp) ; окончание печати
    _PrintNewPage($hp)
    _printDllClose($hp)
EndFunc   ;==>_Print

Func _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
    Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromScan0', 'int', $iWidth, 'int', $iHeight, 'int', $iStride, 'int', $iPixelFormat, 'ptr', $pScan0, 'ptr*', 0)
    If (@error) Or ($Ret[0]) Then
        Return SetError(1, 0, 0)
    EndIf
    Return $Ret[6]
EndFunc   ;==>_GDIPlus_CreateBitmapFromScan0

Func _GDIPlus_GetImageDimension($hImage)
    Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hImage, 'float*', 0, 'float*', 0)
    If (@error) Or ($Ret[0]) Then
        Return SetError(1, 0, 0)
    EndIf
    Local $result[2]
    $result[0] = $Ret[2]
    $result[1] = $Ret[3]
    Return $result
EndFunc   ;==>_GDIPlus_GetImageDimension

Func _GDIPlus_GetImagePixelFormat($hImage)
    Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImagePixelFormat', 'ptr', $hImage, 'uint*', 0)
    If (@error) Or ($Ret[0]) Then
        Return SetError(1, 0, 0)
    EndIf
    Return $Ret[2]
EndFunc   ;==>_GDIPlus_GetImagePixelFormat
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
madmasles
Поменял, спасибо

Godygadu

Сделал через удаление и последующее создание Pic-ов(почему-то простое очищение элементов отключает drag-drop):

Код:
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

#include <MPDF_UDF.au3> ; http://www.autoitscript.com/forum/topic/118827-create-pdf-from-your-application/
#include <printMGv2.au3> ; http://www.autoitscript.com/forum/topic/51054-printing-using-udf-and-a-dll/#entry386214
#include <FileOperations.au3> ; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/

Dim $aPic[4] ; создаем массив из 4 элементов для путей до 4 картинок
Global $Pic1, $Pic2, $Pic3, $Pic4 ; объявляем переменные для 4 картинок

; Настройки печати
Global $s_DocName = 'AutoIt' ; имя документа при печати \ PDF
Global $iX = 0 ; X - координата левого верхнего угла изображения на листе при печати
Global $iY = 5; Y - координата левого верхнего угла изображения на листе при печати
; Лист А4 в координатах:
Global $iWidth = 2905 ; ширина изображения на листе при печати
Global $iHeight = 2010 ; высота изображения на листе при печати
Global $iPrinter = 1 ; 0 - принтер по умолчанию, 1 - отображать окно выбора принтера,  2 - указать конкретное имя принтера
Global $iPageOrientation = 0 ; ориентация страницы, 1 - обычная, 0 - альбомная

Global $Format = 1 ; формат сохранения, 1 - jpg, 0 - PDF
Global $Save = 1 ; отображать диалог сохранения файлов, 0 - нет, 1 - да

; для PDF
Global $PaperSize = 'a4' ; формат листа для PDF
Global $OpenAfter = 0 ; открыть PDF после генерации, 1 - да, 0 - нет


#region ### START Koda GUI section ### Form=C:\Program Files\koda_1.7.3.0\Forms\Form1.kxf

$Form1 = GUICreate('Нарушение ПДД - 4', 405, 680, 654, 116, -1, 0x00000010, $WS_EX_ACCEPTFILES) ; GUI со стилем $WS_EX_ACCEPTFILES - получать путь / имя файла методом перетаскивания в окно
GUISetBkColor(0xDCDCDC)
$Pic1 = GUICtrlCreatePic('', 28, 18, 165, 135, $BS_BITMAP) ; создаем элемент рисунок
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; устанавливаем элементу рисунок свойство принимать брошенный на него объект (файл и т.д.)
$Group1 = GUICtrlCreateGroup('Картинка 1', 20, 5, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic2 = GUICtrlCreatePic('', 211, 18, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 2', 203, 5, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic3 = GUICtrlCreatePic('', 28, 178, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 3', 20, 165, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Pic4 = GUICtrlCreatePic('', 211, 178, 165, 135)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetBkColor(-1, 0xD4D0C8)
GUICtrlCreateGroup('Картинка 4', 203, 165, 180, 155)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

$Button1 = GUICtrlCreateButton('(2)Сохранить как', 8, 356, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button2 = GUICtrlCreateButton('(1) Печать', 232, 356, 163, 25)
GUICtrlSetBkColor(-1, 0x008080)
$Button3 = GUICtrlCreateButton('Предпросмотр', 232, 325, 163, 25)
GUICtrlSetBkColor(-1, 0xC0C0C0)
$Button4 = GUICtrlCreateButton('Очистить', 8, 325, 163, 25)
GUICtrlSetBkColor(-1, 0xFF0000)

$PicPreview = GUICtrlCreatePic('', 5, 410, 395, 250)
GUICtrlSetBkColor(-1, 0x008080)
GUICtrlCreateGroup('Предпросмотр', 2, 395, 400, 265)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')

GUISetState(@SW_SHOW)

WinSetOnTop($Form1, '', 1) ; устанавливаем свойство окна "поверх всех"

#endregion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case -13 ; если событие перетаскиваня фалов на элемент
			If StringRegExp(@GUI_DragFile, '(?i)(.png)|(.bmp)|(.jpg)|(.jpeg)', 0) Then ; сравниваем с помощью регулярного выражения соответствие расширения получаемых файлов (@GUI_DragFile) со списком разрешенных расширений
				$hbmp1 = _GetImage(@GUI_DragFile, 165, 135) ; если файл соответствует, получаем с помощью функции _GetImage() изображение указанной картинки нужного размера (165, 135)
				GUICtrlSendMsg(@GUI_DropId, 0x0172, 0, $hbmp1) ; устанавливаем(посылаем) это изображение в рисунок, на который была перетащена картинка (замена GUICtrlSetImage)

				Switch @GUI_DropId ; сравниваем ID элемента, на который был перетащен файл, и вносим путь до картинки в соответствующий элемент массива $aPic для дальнейшего использования
					Case $Pic1
						$aPic[0] = @GUI_DragFile
					Case $Pic2
						$aPic[1] = @GUI_DragFile
					Case $Pic3
						$aPic[2] = @GUI_DragFile
					Case $Pic4
						$aPic[3] = @GUI_DragFile
				EndSwitch
			EndIf
		Case $Button1
			_PicPreviewPrintSave(1) ; вызываем функцию _PicPreviewPrintSave с параметром "1" - сохранение картинки на диск
		Case $Button3
			_PicPreviewPrintSave(0) ; вызываем функцию _PicPreviewPrintSave с параметром "0" - предпросмотр
		Case $Button2
			_PicPreviewPrintSave(2) ; вызываем функцию _PicPreviewPrintSave с параметром "2" - печать
		Case $Button4 ; очистка
			GUICtrlSetImage($PicPreview, '') ; очищаем элемент предпросмотра $PicPreview

			GUICtrlDelete($Pic1) ; удаляем элемент 1 рисунка
			$Pic1 = GUICtrlCreatePic('', 28, 18, 165, 135, $BS_BITMAP) ; создаем заново элемент рисунка и т.д.
			GUICtrlSetBkColor(-1, 0xD4D0C8)
			GUICtrlSetState(-1, $GUI_DROPACCEPTED)
			GUICtrlDelete($Pic2)

			$Pic2 = GUICtrlCreatePic('', 211, 18, 165, 135)
			GUICtrlSetState(-1, $GUI_DROPACCEPTED)
			GUICtrlSetBkColor(-1, 0xD4D0C8)
			GUICtrlDelete($Pic3)
			$Pic3 = GUICtrlCreatePic('', 28, 178, 165, 135)
			GUICtrlSetState(-1, $GUI_DROPACCEPTED)
			GUICtrlSetBkColor(-1, 0xD4D0C8)

			GUICtrlDelete($Pic4)
			$Pic4 = GUICtrlCreatePic('', 211, 178, 165, 135)
			GUICtrlSetState(-1, $GUI_DROPACCEPTED)
			GUICtrlSetBkColor(-1, 0xD4D0C8)
			Dim $aPic[4]
	EndSwitch
WEnd

Func _GetImage($sFile, $iWH, $iHH) ; функция получения изображения нужного размера (смаштабированного, сжатого или растянутого) из графического файла
	_GDIPlus_Startup() ; запуск работы библиотеки графических функций (GDIPlus.au3)
	$hPng = _GDIPlus_ImageLoadFromFile($sFile) ; загрузка файла по указанному пути
	$Size = _GDIPlus_GetImageDimension($hPng) ; получение ширины и высоты картинки с помощью вспомогательной функции _GDIPlus_GetImageDimension()
	$hDestination = _GDIPlus_CreateBitmapFromScan0($iWH, $iHH, 0, _GDIPlus_GetImagePixelFormat($hPng)) ; создание пустого изображения нужного размера и формата с помощью вспомогательной функций _GDIPlus_CreateBitmapFromScan0() и _GDIPlus_GetImagePixelFormat()
	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hDestination)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hPng, 0, 0, 165, 135) ; "врисовывем" в пустое изображение нужного размера изображение, полученное из файла
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hDestination)
	_GDIPlus_ImageDispose($hPng) ; удаляем загруженное из файла изображение
	Return $hBitmap ; возвращаем из функции полученное изображение нужного размера
	_GDIPlus_Shutdown(); выгружаем библиотеку графических функций
EndFunc   ;==>_GetImage

Func _PicPreviewPrintSave($iK) ; функция с параметром

	If $aPic[0] = '' And $aPic[1] = '' And $aPic[2] = '' And $aPic[3] = '' Then Return SetError(0, 0, 0) ; проверка, чтобы имелся хотя бы один путь до картинки в массиве $aPic
	Local $W = 395, $H = 250, $hB ; локальные переменные
	_GDIPlus_Startup(); запуск работы библиотеки графических функций (GDIPlus.au3)
	$hSource1 = _GDIPlus_ImageLoadFromFile($aPic[0]); загрузка 1 картинки по указанному пути в массиве $aPic пути
	$hSource2 = _GDIPlus_ImageLoadFromFile($aPic[1]); 2 картинка
	$hSource3 = _GDIPlus_ImageLoadFromFile($aPic[2]); 3 картинка
	$hSource4 = _GDIPlus_ImageLoadFromFile($aPic[3]); 4 картинка

	If $iK <> 0 Then ; если переданный в функцию параметр не равен 0, устанавливаем ширину и высоту получаемого в дальнейшем изображения, соответственно, $iWidth и $iHeight
		$W = $iWidth
		$H = $iHeight
	EndIf

	$hDestination = _GDIPlus_CreateBitmapFromScan0($W, $H, 0, _GDIPlus_GetImagePixelFormat($hSource1)); создание пустого изображения нужного размера и формата с помощью вспомогательной функций _GDIPlus_CreateBitmapFromScan0() и _GDIPlus_GetImagePixelFormat()

	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hDestination)
	_GDIPlus_GraphicsClear($hGraphics, BitOR(0xFF000000, 0xFFFFFF)) ; заливаем изображение белым
	; "врисовывем" в каждую четверть пустого изображения нужного размера изображения каждой из картинок, полученных из файлов
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource1, 0, 0, $W / 2, $H / 2)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource2, $W / 2, 0, $W / 2, $H / 2)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource3, 0, $H / 2, $W / 2, $H / 2)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hSource4, $W / 2, $H / 2, $W / 2, $H / 2)

	Switch $iK ; определяем работу фнкции в зависимости от переданного параметра
		Case 0 ; предпросмотр
			$hB = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hDestination)
			GUICtrlSendMsg($PicPreview, 0x0172, 0, $hB); посылаем изображение в элемент рисунок для предпросмотра
		Case 1 ; сохранение на диск
			If $Format = 1 Then ; определяем, как сохранять, JPG или PDF
				$var = $s_DocName ; JPG
				If $Save = 1 Then ; с открытием окна сохранения и выбора имени файла
					WinSetOnTop($Form1, '', 0) ; снимаем "поверх всех окон" для окна GUI
					$var = FileSaveDialog('Выберите имя.', @ScriptDir, 'Рисунки (*.jpg)') ; открываем диалог сохранения файла, где должно быть указано имя файла
					If Not @error Then _GDIPlus_ImageSaveToFile($hDestination, $var & '.jpg') ; если нет ошибок в предыдущем действии, сохраняем картинку с указанным именем
					WinSetOnTop($Form1, '', 1)  ; возвращаем "поверх всех окон"
				Else
					_GDIPlus_ImageSaveToFile($hDestination, _FO_GetCopyName(@ScriptDir & '\' & $s_DocName & '.jpg', 1)) ; просто сохраняем картинку на диск в папку, из которой запущен скрипт, с новым именем и без вопросов, используя функцию _FO_GetCopyName() из FileOperations.au3
				EndIf
			Else
				_PDF($hDestination) ; вызываем функцию сохранения в PDF, в параметрах - созданное ранее изображение из 4 частей
			EndIf
		Case 2 ; печать
			_Print($hDestination); вызываем функцию печати, в параметрах - созданное ранее изображение из 4 частей
	EndSwitch
; удаление графических элементов и изображений, выгрузка библиотеки графических функций
	_GDIPlus_GraphicsDispose($hGraphics)
	_GDIPlus_ImageDispose($hDestination)
	_GDIPlus_ImageDispose($hSource1)
	_GDIPlus_ImageDispose($hSource2)
	_GDIPlus_ImageDispose($hSource3)
	_GDIPlus_ImageDispose($hSource4)
	_GDIPlus_Shutdown()
EndFunc   ;==>_PicPreviewPrintSave

Func _PDF($hBitmap); функция сохранения в PDF
	Local $image = @ScriptDir & '\Test000.jpg' ; имя временной картинку на диске

	_GDIPlus_ImageSaveToFile($hBitmap, $image) ; сохраняем временную картинку на диск

	; Далее использованы функции библиотеки создания PDF - MPDF_UDF.au3, смотреть ее и примеры

	_SetTitle($s_DocName) ; устанавливаем имя документа
	_SetSubject('Convert image(s) to pdf')

	If $OpenAfter = 1 Then ; открывать или нет после генерации PDF
		_OpenAfter(True)
	Else
		_OpenAfter(False)
	EndIf
; настройки генерации PDF - размер листа, ориентация и т.д.
	_SetUnit($PDF_UNIT_CM)
	_SetPaperSize($iPageOrientation)
	_SetZoomMode($PDF_ZOOM_CUSTOM, 90)

	If $iPageOrientation = 0 Then
		_SetOrientation($PDF_ORIENTATION_LANDSCAPE)
	Else
		_SetOrientation($PDF_ORIENTATION_PORTRAIT)
	EndIf

	_SetLayoutMode($PDF_LAYOUT_CONTINOUS)

	$var = _FO_GetCopyName(@ScriptDir & '\' & $s_DocName & '.pdf', 1) ; создаем PDF с новым именем, используя функцию _FO_GetCopyName() из FileOperations.au3

	If $Save = 1 Then
		WinSetOnTop($Form1, '', 0)
		$var = FileSaveDialog('Выберите имя.', @ScriptDir, 'Файлы (*.pdf)', 16) ; диалог сохранения файла и выбора имени
		WinSetOnTop($Form1, '', 1)
	EndIf

	_InitPDF($var) ; initialize the pdf
	_LoadResImage('taietel', $image) ; загружаем временную картинку с диска
	_BeginPage()

	;scale image to paper size!
	_InsertImage('taietel', 0, 0, _GetPageWidth() / _GetUnit(), _GetPageHeight() / _GetUnit()); вставляем картинку в PDF
	_EndPage()

	_ClosePDFFile() ; финализируем создание PDF
	FileDelete($image) ; удаление временной картинки

EndFunc   ;==>_PDF

Func _Print($hBitmap) ; функция печати, в параметрах - созданное ранее изображение из 4 частей
	Local $hp, $mmssgg, $s_PrinterName ; локальные переменные
	Local $image = @ScriptDir & '\Test000.jpg' ; имя временной картинку на диске

	_GDIPlus_ImageSaveToFile($hBitmap, $image); сохраняем временную картинку на диск

; Далее использованы функции библиотеки printMGv2.au3 и dll, смотреть примеры оттуда

	$hp = _PrintDllStart($mmssgg) ; запуск процесса печати

	Switch $iPrinter
		Case 0
			_PrintSelectPrinter($hp, Default) ; использовать принтер по умолчанию
		Case 1
			_PrintSetPrinter($hp) ; показать диалог выбора принтера
		Case 2
			$s_PrinterName = InputBox('Печать', 'Введите название принтера', $s_PrinterName) ; вписать имя принтера
			If $s_PrinterName <> '' Then
				_PrintSelectPrinter($hp, $s_PrinterName)
			Else
				_PrintSelectPrinter($hp, Default)
			EndIf
	EndSwitch

	_PrintPageOrientation($hp, $iPageOrientation); ориентация страницы, 1 - обычная, 0 - альбомная
	_PrintSetDocTitle($hp, $s_DocName) ; имя документа при печати

	_PrintStartPrint($hp) ; запуск печати
	_PrintImage($hp, $image, $iX, $iY, $iWidth, $iHeight) ; печать временной картинки с диска
	_PrintEndPrint($hp) ; окончание печати
	_PrintNewPage($hp)
	_printDllClose($hp)
EndFunc   ;==>_Print

; вспомогательные функции:
Func _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromScan0', 'int', $iWidth, 'int', $iHeight, 'int', $iStride, 'int', $iPixelFormat, 'ptr', $pScan0, 'ptr*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[6]
EndFunc   ;==>_GDIPlus_CreateBitmapFromScan0

Func _GDIPlus_GetImageDimension($hImage)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hImage, 'float*', 0, 'float*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Local $result[2]
	$result[0] = $Ret[2]
	$result[1] = $Ret[3]
	Return $result
EndFunc   ;==>_GDIPlus_GetImageDimension

Func _GDIPlus_GetImagePixelFormat($hImage)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImagePixelFormat', 'ptr', $hImage, 'uint*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[2]
EndFunc   ;==>_GDIPlus_GetImagePixelFormat
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
WSWR Вот за это спасибо. Все работает.


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

А не могли бы вы, если можно, написать комментарии в коде. Я новичок. Мне понравился Autoit и хочется изучать. Глядя в код я кое что понимаю, а кое что ускользает и не понятно. Ну например "эта функция для того чтобы....." и в дальнейшем я сам смогу дорабатывать эту программу и писать свои (например). Спасибо.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Godygadu
Отредактировал предыдущий код
 
Автор
G

Godygadu

Новичок
Сообщения
47
Репутация
0
Буду изучать. Спасибо. :IL_AutoIt_1: :beer:


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

Спасибо за помощь. Закрываю тему.
 
Верх