#include <GDIP.au3>
#include <GUIConstantsEx.au3>

Global $sText

_Example()

Func _Example()
	Local $hGUI, $hGraphics, $hDC, $hBrush, $hImageGraphics, $hMetafile, $pData, $tData, $iData, $sFileName, $hCallback, $pCallback

	; Инициализирует библиотеку GDI+
	_GDIPlus_Startup()

	$sFileName = @MyDocumentsDir & "\SampleMeta.emf"

	$hGUI = GUICreate("Создаёт комментарий", 400, 350)
	GUISetState()

	; Создаёт графический объект из дескриптора окна
	$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)

	; Получает контекст устройства графического объекта, который будет связан с метафайлом
	$hDC = _GDIPlus_GraphicsGetDC($hGraphics)

	; Создаёт объект Metafile для записи
	$hMetafile = _GDIPlus_MetafileRecordFileName($sFileName, $hDC)

	; Получает графический контекст изображения, любой рисунок сохраняется в метафайл
	$hImageGraphics = _GDIPlus_ImageGetGraphicsContext($hMetafile)

	; Записывает полупрозрачный зеленый заполненный прямоугольник
	$hBrush = _GDIPlus_BrushCreateSolid(0x8000FF00) ; Полупрозрачный зеленый
	_GDIPlus_GraphicsFillRect($hImageGraphics, 0, 0, 200, 200, $hBrush)

	; Создаёт комментарий
	$tData = DllStructCreate("char[9]")
	$pData = DllStructGetPtr($tData)
	$iData = 9
	DllStructSetData($tData, 1, "AutoIt v3")

	; Добавляет комментарий в метафайл
	_GDIPlus_GraphicsComment($hImageGraphics, $pData, $iData)

	; Записывает другое действие, заполнение эллипса и добавление дополнительных комментариев
	_GDIPlus_BrushSetFillColor($hBrush, 0x80FF00FF)
	_GDIPlus_GraphicsFillEllipse($hImageGraphics, 200, 0, 150, 200, $hBrush)
	; Изменяет комментарий в структуре
	DllStructSetData($tData, 1, "Commented")
	_GDIPlus_GraphicsComment($hImageGraphics, $pData, $iData)

	; Освобождает контекст устройства
	_GDIPlus_GraphicsReleaseDC($hGraphics, $hDC)

	; Теперь сохраняет метафайл
	_GDIPlus_GraphicsDispose($hImageGraphics) ; Изображение сохраняется и особая блокировка разблокирована
	_GDIPlus_ImageDispose($hMetafile)

	; Регистрирует функцию обратного вызова - перечисление, вызываемую для каждой записи в метафайл
	$hCallback = DllCallbackRegister("_MetafileEnum", "int", "int;uint;uint;ptr;ptr")
	$pCallback = DllCallbackGetPtr($hCallback)

	; Создаёт объект Metafile из образца файла метафайла и начинает воспроизведение записей
	$hMetafile = _GDIPlus_MetafileCreateFromFile($sFileName)

	; Начинает перечисление записей метафайла
	_GDIPlus_MetafileEnumerateDestPoint($hGraphics, $hMetafile, 0, 0, $pCallback, $hMetafile)

	; Рисует комментарии
	_GDIPlus_GraphicsDrawString($hGraphics, $sText, 20, 20)

	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE

	; Освобождает ресурсы
	DllCallbackFree($pCallback)
	_GDIPlus_ImageDispose($hMetafile)
	_GDIPlus_BrushDispose($hBrush)
	_GDIPlus_GraphicsDispose($hGraphics)

	; Закрывает библиотеку GDI+
	_GDIPlus_Shutdown()
EndFunc

; $iRecordType - One of the predefined record type (ellipse, rectangle, comment, etc..)
; $iFlags	   - Set of flags that specify attributes of the record
; $iDataSize   - Number of bytes in the record data
; $pRecordData - Pointer to a buffer that contains the record data
; $pUserData   - The user defined data previously passed to the one of the Metafile enumeration functions

; Return False to abort the enumeration, True to proceed.
Func _MetafileEnum($iRecordType, $iFlags, $iDataSize, $pRecordData, $pUserData)
	Local $tText

	; Play only the ellipse and the comments
	Switch $iRecordType
		; Filled ellipse
		Case $GDIP_EMFPLUSRECORDTYPEFILLELLIPSE
			_GDIPlus_MetafilePlayRecord($pUserData, $iRecordType, $iFlags, $iDataSize, $pRecordData)
			
		Case $GDIP_EMFPLUSRECORDTYPECOMMENT
			$tText = DllStructCreate("char[" & $iDataSize & "]", $pRecordData)
			$sText &= DllStructGetData($tText, 1) & @CRLF
	EndSwitch
		
	; Continue to enumerate
	Return True
EndFunc