Da hier vorgeschlagen wurde, einen GDI+ Live Editor zu machen, wollte ich versuchen, den Vorschlag zu realisieren.
GDI+ LiveEditor
#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
Updates
v0.11.01 Fadenkreuz und Maussteuerung hinzugefügt, sowie kleinere Fehler beseitigt.
v0.12.01 Neue Formen hinzugefügt
v0.13.01 In alle Richtungen zeichnen hinzugefügt
ToDo
- Farbauswahl
- Alle Standardformen
- Fadenkreuz-Bug beheben
- Löschen
- Verschieben
Verbesserungsvorschläge und konstruktive Kritik sind natürlich gerne gesehen.
MfG,
H2112.