#include <GDIPlus.au3>
#include <GDIPlusConstants.au3>
#include <Misc.au3>

Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 2)

Global $MainGUI[10], $CodeGUI[10], $CtrlGUI[10], $Code[10]
Global $GDIPForm = "", $Direction[2]
Global $Line[100][4], $Elli[100][4], $Rect[100][4]

$MainGUI[0] = GUICreate("GDI+ LiveEditor", 300, 300, -1, -1)
GUISetOnEvent(-3, "_Exit")
GUISetCursor(16)
GUISetState()

_GDIPlus_Startup()
$MainGUI[1] = _GDIPlus_GraphicsCreateFromHWND($MainGUI[0])
$MainGUI[2] = _GDIPlus_BitmapCreateFromGraphics(300, 300, $MainGUI[1])
$MainGUI[3] = _GDIPlus_ImageGetGraphicsContext($MainGUI[2])

$CtrlGUI[0] = GUICreate("Controls", 290, 120, -1, -1, 0, 0x00000080, $MainGUI[0])
$CtrlGUI[1] = GUICtrlCreateButton("None", 10, 10, 50, 50)
GUICtrlSetOnEvent(-1, "_ChangeForm")
$CtrlGUI[2] = GUICtrlCreateButton("Line", 70, 10, 50, 50)
GUICtrlSetOnEvent(-1, "_ChangeForm")
$CtrlGUI[3] = GUICtrlCreateButton("Ellipse", 130, 10, 50, 50)
GUICtrlSetOnEvent(-1, "_ChangeForm")
$CtrlGUI[4] = GUICtrlCreateButton("Rect", 190, 10, 50, 50)
GUICtrlSetOnEvent(-1, "_ChangeForm")
GUISetState()

$CodeGUI[0] = GUICreate("Code Box", 400, 500, -1, -1, 0x00040000, 0x00000080, $MainGUI[0])
$CodeGUI[1] = GUICtrlCreateEdit($Code[0], 0, 0, 398, 480)
GUICtrlSetFont(-1, 9.5, 400, 0, "Courier New")
GUICtrlSetResizing(-1, 102)
GUISetState()

While 1
	Sleep(10)
	_Update()
	If WinActive($MainGUI[0]) And $GDIPForm And _IsPressed(01) Then _NewForm()
WEnd

Func _Update()
	Local $MousePos = MouseGetPos()
	_GDIPlus_GraphicsClear($MainGUI[3], 0xFFFFFFFF)
	If WinActive($MainGUI[0]) Then
		_GDIPlus_GraphicsDrawLine($MainGUI[3], $MousePos[0] - 3, $MousePos[1], $MousePos[0] + 3, $MousePos[1])
		_GDIPlus_GraphicsDrawLine($MainGUI[3], $MousePos[0], $MousePos[1] - 3, $MousePos[0], $MousePos[1] + 3)
	EndIf

	If Not $Line[0][0] = 0 Then
		For $i = 1 To $Line[0][0]
			_GDIPlus_GraphicsDrawLine($MainGUI[3], $Line[$i][0], $Line[$i][1], $Line[$i][2], $Line[$i][3])
		Next
	EndIf

	If Not $Elli[0][0] = 0 Then
		For $i = 1 To $Elli[0][0]
			_GDIPlus_GraphicsDrawEllipse($MainGUI[3], $Elli[$i][0], $Elli[$i][1], $Elli[$i][2] - $Elli[$i][0], $Elli[$i][3] - $Elli[$i][1])
		Next
	EndIf

	If Not $Rect[0][0] = 0 Then
		For $i = 1 To $Rect[0][0]
			_GDIPlus_GraphicsDrawRect($MainGUI[3], $Rect[$i][0], $Rect[$i][1], $Rect[$i][2] - $Rect[$i][0], $Rect[$i][3] - $Rect[$i][1])
		Next
	EndIf
	_GDIPlus_GraphicsDrawImageRect($MainGUI[1], $MainGUI[2], 0, 0, 300, 300)
EndFunc   ;==>_Update

Func _Exit()
	_GDIPlus_GraphicsDispose($MainGUI[3])
	_GDIPlus_BitmapDispose($MainGUI[2])
	_GDIPlus_GraphicsDispose($MainGUI[1])
	_GDIPlus_Shutdown()
	GUIDelete($MainGUI[0])
	Exit
EndFunc   ;==>_Exit

Func _NewForm()
	Local $MousePos = MouseGetPos()
	If $GDIPForm = 1 Then
		$Line[0][0] += 1
		$Line[$Line[0][0]][0] = $MousePos[0]
		$Line[$Line[0][0]][1] = $MousePos[1]
		While _IsPressed(01)
			$MousePos = MouseGetPos()
			$Line[$Line[0][0]][2] = $MousePos[0]
			$Line[$Line[0][0]][3] = $MousePos[1]
			_Update()
			Sleep(10)
		WEnd
		If $Line[$Line[0][0]][0] = $Line[$Line[0][0]][2] And $Line[$Line[0][0]][1] = $Line[$Line[0][0]][3] Then $Line[0][0] -= 1
	ElseIf $GDIPForm = 2 Then
		$Elli[0][0] += 1
		$Elli[$Elli[0][0]][0] = $MousePos[0]
		$Elli[$Elli[0][0]][1] = $MousePos[1]
		While _IsPressed(01)
			$MousePos = MouseGetPos()
			$Elli[$Elli[0][0]][2] = $MousePos[0]
			$Elli[$Elli[0][0]][3] = $MousePos[1]
			_Update()
			Sleep(10)
		WEnd
		If $Elli[$Elli[0][0]][0] = $Elli[$Elli[0][0]][2] And $Elli[$Elli[0][0]][1] = $Elli[$Elli[0][0]][3] Then $Elli[0][0] -= 1
		$Direction[0] = 0
		$Direction[1] = 0
	ElseIf $GDIPForm = 3 Then
		$Rect[0][0] += 1
		$Rect[$Rect[0][0]][0] = $MousePos[0]
		$Rect[$Rect[0][0]][1] = $MousePos[1]
		While _IsPressed(01)
			$MousePos = MouseGetPos()
			If $Rect[$Rect[0][0]][0] > $MousePos[0] Or $Direction[0] = 1 Then
				If Not $Direction[0] Then
					$Rect[$Rect[0][0]][2] = $Rect[$Rect[0][0]][0]
					$Rect[$Rect[0][0]][0] = $MousePos[0]
					$Direction[0] = 1
				ElseIf $Rect[$Rect[0][0]][0] < $MousePos[0] Then
					$Rect[$Rect[0][0]][0] = $Rect[$Rect[0][0]][2]
					$Rect[$Rect[0][0]][2] = $MousePos[0]
					$Direction[0] = 0
				Else
					$Rect[$Rect[0][0]][0] = $MousePos[0]
				EndIf
			Else
				$Rect[$Rect[0][0]][2] = $MousePos[0]
			EndIf
			If $Rect[$Rect[0][0]][1] > $MousePos[1] Or $Direction[1] = 1 Then
				If Not $Direction[1] Then
					$Rect[$Rect[0][0]][3] = $Rect[$Rect[0][0]][1]
					$Rect[$Rect[0][0]][1] = $MousePos[1]
					$Direction[1] = 1
				ElseIf $Rect[$Rect[0][0]][1] < $MousePos[1] Then
					$Rect[$Rect[0][0]][1] = $Rect[$Rect[0][0]][3]
					$Rect[$Rect[0][0]][3] = $MousePos[1]
					$Direction[1] = 0
				Else
					$Rect[$Rect[0][0]][1] = $MousePos[1]
				EndIf
			Else
				$Rect[$Rect[0][0]][3] = $MousePos[1]
			EndIf
			_Update()
			Sleep(10)
		WEnd
		If $Rect[$Rect[0][0]][0] = $Rect[$Rect[0][0]][2] And $Rect[$Rect[0][0]][1] = $Rect[$Rect[0][0]][3] Then $Rect[0][0] -= 1
		$Direction[0] = 0
		$Direction[1] = 0
	EndIf

	_UpdateCode()
EndFunc   ;==>_NewForm

Func _ChangeForm()
	If @GUI_CtrlId = $CtrlGUI[1] Then $GDIPForm = 0
	If @GUI_CtrlId = $CtrlGUI[2] Then $GDIPForm = 1
	If @GUI_CtrlId = $CtrlGUI[3] Then $GDIPForm = 2
	If @GUI_CtrlId = $CtrlGUI[4] Then $GDIPForm = 3
EndFunc   ;==>_ChangeForm

Func _UpdateCode()
	$Code[0] = "#include <GDIPlus.au3>" & @CRLF & _
			"#include <GDIPlusConstants.au3>" & @CRLF & _
			@CRLF & _
			'Opt("GUIOnEventMode", 1)' & @CRLF & _
			@CRLF & _
			"Global $hWnd, $hGraphic, $hBitmap, $backbuffer" & @CRLF & _
			'Global $title = "GDI+ LiveEditor", _' & @CRLF & _
			"	   $width = 300, _ " & @CRLF & _
			"	   $height = 300" & @CRLF & _
			@CRLF & _
			"_Startup()" & @CRLF & _
			@CRLF

	$Code[1] = "While 1" & @CRLF & _
			"	Sleep(100)" & @CRLF & _
			"	_Update()" & @CRLF & _
			"WEnd" & @CRLF & _
			@CRLF

	$Code[2] = "Func _Startup()" & @CRLF & _
			"	$hWnd = GUICreate($title, $width, $height, -1, -1)" & @CRLF & _
			'	GUISetOnEvent(-3, "_Shutdown")' & @CRLF & _
			"	GUISetState()" & @CRLF & _
			@CRLF & _
			"	_GDIPlus_Startup()" & @CRLF & _
			"	$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)" & @CRLF & _
			"	$hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphic)" & @CRLF & _
			"	$backbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)" & @CRLF & _
			"EndFunc" & @CRLF & _
			@CRLF

	$Code[3] = "Func _Shutdown()" & @CRLF & _
			"	_GDIPlus_GraphicsDispose($backbuffer)" & @CRLF & _
			"	_GDIPlus_BitmapDispose($hBitmap)" & @CRLF & _
			"	_GDIPlus_GraphicsDispose($hGraphic)" & @CRLF & _
			"	_GDIPlus_Shutdown()" & @CRLF & _
			"	GUIDelete($hWnd)" & @CRLF & _
			"	Exit" & @CRLF & _
			"EndFunc" & @CRLF & _
			@CRLF

	$Code[4] = "Func _Update()" & @CRLF & _
			"	_GDIPlus_GraphicsClear($backbuffer, 0xFFFFFFFF)" & @CRLF
	For $i = 1 To $Line[0][0]
		$Code[4] &= @TAB & "_GDIPlus_GraphicsDrawLine($backbuffer, " & $Line[$i][0] & ", " & $Line[$i][1] & ", " & $Line[$i][2] & ", " & $Line[$i][3] & ")" & @CRLF
	Next
	For $i = 1 To $Elli[0][0]
		$Code[4] &= @TAB & "_GDIPlus_GraphicsDrawEllipse($backbuffer, " & $Elli[$i][0] & ", " & $Elli[$i][1] & ", " & $Elli[$i][2] - $Elli[$i][0] & ", " & $Elli[$i][3] - $Elli[$i][1] & ")" & @CRLF
	Next
	For $i = 1 To $Rect[0][0]
		$Code[4] &= @TAB & "_GDIPlus_GraphicsDrawRect($backbuffer, " & $Rect[$i][0] & ", " & $Rect[$i][1] & ", " & $Rect[$i][2] - $Rect[$i][0] & ", " & $Rect[$i][3] - $Rect[$i][1] & ")" & @CRLF
	Next
	$Code[4] &= "	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $width, $height)" & @CRLF & _
			"EndFunc" & @CRLF

	GUICtrlSetData($CodeGUI[1], $Code[0] & $Code[1] & $Code[2] & $Code[3] & $Code[4] & $Code[5] & $Code[6] & $Code[7] & $Code[8] & $Code[9])
EndFunc   ;==>_UpdateCode
