Hallo Leute
mein erster Beitrag
So zum Thema: so weit binn ich gekommen:
ich habe mir eine UDF geschriben die die PixelCheckSum-Koordinaten
Umrechnet um eine eine Art Bilderrahmen zu erzeugen.
eine Gui wird erstellt, in der 2 Rechtecke um diese Stelle
gezeichnet werden.
Dies Gescheit mit "DrawFrame()". Mit "ClearFrame" soll das gantze wieder verschwinden.
Das Funktioniert Auch
zum Problem:
Momentan funktioniert das über Globale Variablen für die Speicherung von Handles (z.B. hGui, hPinsel...).
Diese Handles möchte ich in einem Array Speichen. leider klapt das nicht mit der Funktion "DrawFrame2() " .
Hier habe ich versucht das Array zu erzeugen.
Ich vermute das irgendwie die Deklaratinon des Array falsch ist. bin mir aber nicht sicher.
Ein Fehler wird nicht ausgegeben.
Was ich auch nicht versteheh ist warum @error nicht gesetz wird (müste Durch SetError(20) gesetz worden sein)
Spoiler anzeigen
#include-once
#include <Constants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
ConsoleWrite('#incl.' & @TAB & '01' & ' - <DrawRectFunc.au3>' & @LF)
;DrawRectFunc.au3
Global $hGui, $hGraphic, $Pinsel_HNDL1, $Pinsel_HNDL2, $Pixelchecksum = 0
;Func DrawFrame($left, $top, $right, $bottom, $Rahmen = 20)
Local $test = DrawFrame(200, 300, 350, 450, 20)
Sleep(1000)
ClearFrame()
[/autoit] [autoit][/autoit] [autoit]Local $test = DrawFrame2(200, 300, 350, 450, 20)
[/autoit] [autoit][/autoit] [autoit]If
IsArray($test) = 1 Then ConsoleWrite(IsArray($test) &
'$test["hGui"] = ' & $test['hGui'] & '$test["SLNumber"] = '
& $test['SLNumber'] & @CRLF)
If IsArray($test) = 0 Then ConsoleWrite(IsArray($test) & '$test = ' & $test & @CRLF)
ConsoleWrite('> (' & @ScriptLineNumber & ') ' & @error & @CRLF)
Sleep(1300)
[/autoit] [autoit][/autoit] [autoit]Func DrawFrame($left, $top, $right, $bottom, $Rahmen = 20)
; Definate GUI
Local $iWidth_GUI = $right - $left + 2 * ($Rahmen)
Local $iHeight_GUI = $bottom - $top + 2 * ($Rahmen)
Local $iX_GUI = $left - ($Rahmen)
Local $iY_GUI = $top - ($Rahmen)
;Blue
Local $iWidth_Rect1 = $right - $left + $Rahmen + 1
Local $iHeight_Rect1 = $bottom - $top + $Rahmen + 1
Local $iX_Rect1 = ($Rahmen / 2) ;X coordinate of the upper left corner
Local $iY_Rect1 = ($Rahmen / 2) ;Y coordinate of the upper left corner
;Pinc
Local $iWidth_Rect2 = $right - $left + ($Rahmen) + 1
Local $iHeight_Rect2 = $bottom - $top + ($Rahmen) + 1
Local $iX_Rect2 = ($Rahmen / 2) ;X coordinate of the upper left corner
Local $iY_Rect2 = ($Rahmen / 2) ;Y coordinate of the upper left corner
Local $_GDIPlus_StartupOK = _GDIPlus_Startup()
If $_GDIPlus_StartupOK = False Then
SetError(10)
Return
EndIf
; Breite Höhe, Links/Left, Rechts/Top
Global $hGui = GUICreate("RahmenGui", $iWidth_GUI, $iHeight_GUI, $iX_GUI, $iY_GUI, $WS_POPUP, $WS_EX_LAYERED)
If @error = 1 Then Return
;Erzeugt GUI"RahmenGui" und Zeichnet Box
WinSetOnTop("RahmenGui", "", 1)
GUISetBkColor(0xABCDEF) ;Setzt die Hintergrundfarbe (der wert der Farbe
ist egal da dise in der Nächsten zeile auf Transparent gesetzt wird)
_WinAPI_SetLayeredWindowAttributes($hGui, 0xABCDEF, 255) ;der Layer
(Layer = eine lage eines Mehrschichtigen Fensters) mit der farbe
"0xABCDEF" wird Transparent gestetzt durch den wert 255 = 100%
transparent
GUISetState()
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
Global $Pinsel_HNDL1 = _GDIPlus_PenCreate(0xFF0000FF, $Rahmen, 2) ;Blue Rect
Global $Pinsel_HNDL2 = _GDIPlus_PenCreate(0xFFfa0aa0, ($Rahmen) / 4, 2) ;Pinc Rect
$_GDIPlus_GraphicsDrawRectOK1 = _GDIPlus_GraphicsDrawRect($hGraphic,
$iX_Rect1, $iY_Rect1, $iWidth_Rect1, $iHeight_Rect1, $Pinsel_HNDL1)
;Blue Rect
If $_GDIPlus_GraphicsDrawRectOK1 = False Then
SetError(20)
Return
EndIf
$_GDIPlus_GraphicsDrawRectOK2 = _GDIPlus_GraphicsDrawRect($hGraphic,
$iX_Rect1, $iY_Rect2, $iWidth_Rect2, $iHeight_Rect2, $Pinsel_HNDL2);Pinc
Rect
If $_GDIPlus_GraphicsDrawRectOK2 = False Then
SetError(21)
Return
EndIf
$_WinAPI_SetWindowLongOK = _WinAPI_SetWindowLong($hGui, $GWL_EXSTYLE,
BitOR(_WinAPI_GetWindowLong($hGui, $GWL_EXSTYLE),
$WS_EX_TRANSPARENT));ClickThrough
If $_WinAPI_SetWindowLongOK = 0 Then
SetError(30)
Return
EndIf
EndFunc ;==>DrawFrame
;Erzeugt GUI"RahmenGui" und Zeichnet Box
Func DrawFrame2($left, $top, $right, $bottom, $Rahmen = 20)
; Definate GUI
Local $iWidth_GUI = $right - $left + 2 * ($Rahmen)
Local $iHeight_GUI = $bottom - $top + 2 * ($Rahmen)
Local $iX_GUI = $left - ($Rahmen)
Local $iY_GUI = $top - ($Rahmen)
;
Local $iWidth_Rect1 = $right - $left + $Rahmen + 1
Local $iHeight_Rect1 = $bottom - $top + $Rahmen + 1
Local $iX_Rect1 = ($Rahmen / 2) ;X coordinate of the upper left corner
Local $iY_Rect1 = ($Rahmen / 2) ;Y coordinate of the upper left corner
;~
Local $iWidth_Rect2 = $right - $left + ($Rahmen) + 1
Local $iHeight_Rect2 = $bottom - $top + ($Rahmen) + 1
Local $iX_Rect2 = ($Rahmen / 2) ;X coordinate of the upper left corner
Local $iY_Rect2 = ($Rahmen / 2) ;Y coordinate of the upper left corner
Dim $Array[100] = [100, 'hGui', 'GuiName', 'hPinsel1', 'hPinsel2', 'SLNumber']
;Dim $Array[100] = [100, 'hGui', 'GuiName', 'hGraphic', 'hPinsel2']
$Array['GuiName'] = "RahmenGui"
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :
$Array["GuiName"] = ' & $Array['GuiName'] & @CRLF &
'>Error code: ' & @error & @CRLF) ;### Debug Console
Local $_GDIPlus_StartupOK = _GDIPlus_Startup()
If $_GDIPlus_StartupOK = False Then
SetError(10)
Return @ScriptLineNumber
EndIf
; Breite Höhe, Links/Left, Rechts/Top
$Array['hGui'] = ( GUICreate($Array['GuiName'], $iWidth_GUI, $iHeight_GUI, $iX_GUI, $iY_GUI, $WS_POPUP, $WS_EX_LAYERED) )
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :
$Array["hGui"] = ' & $Array['hGui'] & @CRLF & '>Error
code: ' & @error & @CRLF) ;### Debug Console
If @error = 1 Then Return @ScriptLineNumber
;Erzeugt GUI$array['GuiName'] und Zeichnet Box
WinSetOnTop($Array['GuiName'], "", 1)
GUISetBkColor(0xABCDEF) ;Setzt die Hintergrundfarbe (der wert der Farbe
ist egal da dise in der Nächsten zeile auf Transparent gesetzt wird)
_WinAPI_SetLayeredWindowAttributes($Array['hGui'], 0xABCDEF, 255) ;der
Layer (Layer = eine lage eines Mehrschichtigen Fensters) mit der farbe
"0xABCDEF" wird Transparent gestetzt durch den wert 255 = 100%
transparent
GUISetState()
$Array['hGraphic'] = _GDIPlus_GraphicsCreateFromHWND($Array['hGui'])
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :
$Array["hGraphic"] = ' & $Array['hGraphic'] & @CRLF &
'>Error code: ' & @error & @CRLF) ;### Debug Console
$Array['hPinsel1'] = _GDIPlus_PenCreate(0xFF0000FF, $Rahmen, 2) ;Blue Rect
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :
$Array["hPinsel"] = ' & $Array['hPinsel1'] & @CRLF &
'>Error code: ' & @error & @CRLF) ;### Debug Console
$Array['hPinsel2'] = _GDIPlus_PenCreate(0xFFfa0aa0, ($Rahmen) / 4, 2) ;Pinc Rect
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :
$Array["hPinsel2"] = ' & $Array['hPinsel2'] & @CRLF &
'>Error code: ' & @error & @CRLF) ;### Debug Console
local $_GDIPlus_GraphicsDrawRectOK1 =
_GDIPlus_GraphicsDrawRect($Array['hGraphic'], $iX_Rect1, $iY_Rect1,
$iWidth_Rect1, $iHeight_Rect1, $Array['hPinsel1']) ;Blue Rect
If $_GDIPlus_GraphicsDrawRectOK1 = 0 Then
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :
$_GDIPlus_GraphicsDrawRectOK1 = ' & $_GDIPlus_GraphicsDrawRectOK1
& @crlf & '>Error code: ' & @error & @crlf) ;###
Debug Console
ConsoleWrite('$iX_Rect1 = '& $iX_Rect1 &
'$iY_Rect1 = '& $iY_Rect1 & '$iWidth_Rect1 = '&
$iWidth_Rect1 & '$iHeight_Rect1 = ' & $iHeight_Rect1 &
@CRLF)
SetError(20)
$Array['SLNumber'] = @ScriptLineNumber
Return $Array
EndIf
Local
$_GDIPlus_GraphicsDrawRectOK2 =
_GDIPlus_GraphicsDrawRect($Array['hGraphic'], $iX_Rect1, $iY_Rect2,
$iWidth_Rect2, $iHeight_Rect2, $Array['hPinsel2']);Pinc Rect
If $_GDIPlus_GraphicsDrawRectOK2 = 'False' Then
SetError(21)
$Array['SLNumber'] = @ScriptLineNumber
Return $Array
EndIf
local
$_WinAPI_SetWindowLongOK = _WinAPI_SetWindowLong($Array['hGui'],
$GWL_EXSTYLE, BitOR(_WinAPI_GetWindowLong($Array['hGui'], $GWL_EXSTYLE),
$WS_EX_TRANSPARENT));ClickThrough
If $_WinAPI_SetWindowLongOK = 0 Then
SetError(30)
EndIf
Return $Array
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]EndFunc ;==>DrawFrame2
;Erzeugt GUI$array['GuiName'] und Zeichnet Box
Func ClearFrame()
_GDIPlus_GraphicsClear($hGraphic, 0xFFABCDEF)
;Global $hGui = GUICreate("RahmenGui", @DesktopWidth, @DesktopHeight, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
GUIDelete($hGui)
_GDIPlus_PenDispose($Pinsel_HNDL1)
_GDIPlus_PenDispose($Pinsel_HNDL2)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
WinClose("RahmenGui", "")
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>ClearRect
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
Das gibt der Consolenstream aus:
Spoiler anzeigen
#incl. 01 - <DrawRectFunc.au3>
@@ Debug(107) : $Array["GuiName"] = RahmenGui
>Error code: 0
@@ Debug(117) : $Array["hGui"] = 0x00111462
>Error code: 0
@@ Debug(126) : $Array["hGraphic"] = 0x02982090
>Error code: 0
@@ Debug(128) : $Array["hPinsel"] = 0x02982368
>Error code: 0
@@ Debug(130) : $Array["hPinsel2"] = 0x02982528
>Error code: 0
@@ Debug(134) : $_GDIPlus_GraphicsDrawRectOK1 = False
>Error code: 0
$iX_Rect1 = 10$iY_Rect1 = 10$iWidth_Rect1 = 171$iHeight_Rect1 = 171
1$test["hGui"] = 137$test["SLNumber"] = 137
> (21) 0