1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. UEZ

Beiträge von UEZ

  • Assembler: Farben zählen

    • UEZ
    • 27. März 2024 um 11:23
    Zitat von DOheim

    Mit 89 ist man eben etwas langsamer.

    Echt jetzt? 8|

  • Cairo unter Autoit nutzen

    • UEZ
    • 26. März 2024 um 12:55

    Danke Velted fürs Nachforschen und das Erstellen des Beispiels :thumbup:. Die ursprünglichen zwei DLLs funktionieren, und machen keine Probleme. Das Problem war anscheinend mein Code.

    Zitat von Velted

    Nachschlag für UEZ

    Code
            DllCall($g_hCairoDLL, "none:cdecl", "cairo_move_to", "ptr", $pSurface, "double", $x, "double", $y)
            DllCall($g_hCairoDLL, "none:cdecl", "cairo_line_to", "ptr", $pSurface, "double", $iW, "double", $iH)
            DllCall($g_hCairoDLL, "none:cdecl", "cairo_stroke", "ptr", $pContext)

    Das kann nicht funktionieren, weil Du versuchst, auf $pSurface zu zeichnen.

    Ich Idiot und ich suche mir einen Wolf, warum das nicht funzt.

    Hier der Code, welches auch bei mir funzt:

    C
    #AutoIt3Wrapper_UseX64=n
    
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPIGdi.au3>
    #include "Cairo.au3"
    
    AutoItSetOption('MustDeclareVars', 1)
    
    Global Const $fPi = ACos(-1), $fRad = $fPi / 180, $fDeg = 180 / $fPi, $f2PI = $fPi * 2
    Global Const $iW = 600, $iH = 400, $sTitle = "Cairo Test / FPS: "
    Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit
    
    AutoItSetOption("GUIOnEventMode", 1)
    
    Cairo_Test()
    
    AutoItSetOption("GUIOnEventMode", 0)
    
    
    Func Cairo_Test()
    	Cairo_Init()
    	Local $iStride = Cairo_GetStride($iW)
    	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iStride = ' & $iStride & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    	$hGUI = GUICreate($sTitle & "0", $iW, $iH)
    	Local Const $hDC = _WinAPI_GetDC($hGUI)
    	Local Const $hGfxDC = _WinAPI_CreateCompatibleDC($hDC)
    	Local $tBIV5HDR = DllStructCreate($tagBITMAPV5HEADER)
    	DllStructSetData($tBIV5HDR, 'bV5Size', DllStructGetSize($tBIV5HDR))
    	DllStructSetData($tBIV5HDR, 'bV5Width', $iW)
    	DllStructSetData($tBIV5HDR, 'bV5Height', -$iH)
    	DllStructSetData($tBIV5HDR, 'bV5Planes', 1)
    	DllStructSetData($tBIV5HDR, 'bV5BitCount', 32)
    	DllStructSetData($tBIV5HDR, 'biCompression', $BI_RGB)
    	DllStructSetData($tBIV5HDR, 'bV5RedMask', 0x00FF0000)
    	DllStructSetData($tBIV5HDR, 'bV5GreenMask', 0x0000FF00)
    	DllStructSetData($tBIV5HDR, 'bV5BlueMask', 0x000000FF)
    	DllStructSetData($tBIV5HDR, 'bV5AlphaMask', 0xFF000000)
    	Local $pBits
    	Local $hBitmapGDI = _WinAPI_CreateDIBSection($hGfxDC, $tBIV5HDR, $DIB_RGB_COLORS, $pBits)
    	Local Const $hObjOld = _WinAPI_SelectObject($hGfxDC, $hBitmapGDI)
    
    	GUISetState(@SW_SHOW, $hGUI)
    
    	$bExit = False
    	GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    	AdlibRegister("CalcFPS", 1000)
    
    	Local $pSurface
    	$pSurface = DllCall($g_hCairoDLL, "ptr:cdecl", "cairo_image_surface_create_for_data", "ptr", $pBits, "long", $CAIRO_FORMAT_ARGB32, "long", $iW, "long", $iH, "long", $iStride)[0]
    
    	Local $pContext = Cairo_CreateContext($pSurface)
    
    	Local $t, $tt = 1 / 60, $x, $y, $c, $w = $iW / 2, $h = $iH / 2
    	Local $tPAINTSTRUCT
    
    	Do
            _WinAPI_BeginPaint($hGUI, $tPAINTSTRUCT)
    
    		$c = 0.5 + 0.5 * Sin($t)
    		$x = Int($iW / 4 + Sin($t) * 20)
    		$y = Int($iH / 4 + Cos($t) * 20)
    
    		Cairo_ClearContext($pContext, $c, $c, $c)
    
    		Cairo_SetColor($pContext, 1, 1, 0, 1)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_arc", "ptr", $pContext, "double", ($iW / 2), "double", ($iH / 2), "double", 70, "double", 0, "double", 2 * $fPi)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_fill", "ptr", $pContext)
    
    		Cairo_SetColor($pContext, 0, 0, 0.5 + 0.5 * Cos($t))
    		Cairo_SetLineWidth($pContext, 20)
    		Cairo_DrawRectangle($pContext, $x, $y, $w, $h)
    
    		Cairo_SetColor($pContext, 1, 0, 0, 1)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_set_line_width", "ptr", $pContext, "double", 20)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_move_to", "ptr", $pContext, "double", $iw / 2, "double", $iH / 2)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_line_to", "ptr", $pContext, "double", $x, "double", $y)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_stroke", "ptr", $pContext)
    
    		_WinAPI_EndPaint($hGUI, $tPAINTSTRUCT)
    
    		$t += $tt
    
    		_WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hGfxDC, 0, 0, $SRCCOPY)
    		$iFPS += 1
    		If $bExit Then ExitLoop
    	Until Not Sleep(10)
    
    	Cairo_DestroyContext($pContext)
    	Cairo_DestroySurface($pSurface)
    
    	_WinAPI_SelectObject($hGfxDC, $hObjOld)
    	_WinAPI_ReleaseDC($hGUI, $hDC)
    	_WinAPI_DeleteDC($hGfxDC)
    	_WinAPI_DeleteObject($hBitmapGDI)
    	GUIDelete($hGUI)
    	Cairo_Close()
    EndFunc
    
    Func _Exit()
    	$bExit = True
    EndFunc   ;==>_Exit_About
    
    Func CalcFPS() ;display FPS
    	$iShowFPS = $iFPS
    	$iFPS = 0
    	WinSetTitle($hGUI, "", $sTitle & $iShowFPS)
    EndFunc   ;==>CalcFPS
    Alles anzeigen

    Ich werde weitere Möglichkeiten checken, wie man Cairo unter Windows noch initiieren kann.

  • Cairo unter Autoit nutzen

    • UEZ
    • 25. März 2024 um 14:30

    Liegt an den DLLs!

    Mit denen funzt's für x86. Ich habe noch keine DLLs für x64 gefunden...


    Edit: für den Kreis funzt's, aber keine Linien möglich - Absturz.

    Dateien

    Cairo DLLs x86.7z 999,92 kB – 232 Downloads
  • Cairo unter Autoit nutzen

    • UEZ
    • 25. März 2024 um 10:40

    Irgendwie schaffe ich es nicht eine Linie zu ziehen oder einen Kreis zu zeichnen, das angezeigt wird.

    Hat jemand eine Idee, woran das liegen könnte?

    Kreis:

    Code
    DllCall($g_hCairoDLL, "none:cdecl", "cairo_arc", "ptr", $pContext, "double", ($iW / 2), "double", ($iH / 2), "double", 100, "double", 0, "double", 2 * $fPi)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_fill", "ptr", $pContext)

    Linie:

    Code
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_move_to", "ptr", $pSurface, "double", $x, "double", $y)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_line_to", "ptr", $pSurface, "double", $iW, "double", $iH)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_stroke", "ptr", $pContext)


    Danke.

  • Cairo unter Autoit nutzen

    • UEZ
    • 24. März 2024 um 18:32
    Zitat von AspirinJunkie

    Was für ein Unsinn.

    Und DllCall($g_hCairoDLL, "none:cdecl", "cairo_set_line_width", "ptr", $pContext, "double", $iH / 10) scheint nur mit ganzen geraden Zahlen zu funktionieren...:huh:


    Wie auch immer, danke für euer Feedback. Gehe jetzt aber mal in die Mucki Bude mich abreagieren...:)

  • Cairo unter Autoit nutzen

    • UEZ
    • 24. März 2024 um 18:00

    Genau das habe ich auch eben getestet - Integer funktioniert, Gleitkommazahlen nicht! Laut Definition sollte es aber Double sein!?!!??!

    Code
    void
    cairo_rectangle (cairo_t *cr,
                     double x,
                     double y,
                     double width,
                     double height);
  • Cairo unter Autoit nutzen

    • UEZ
    • 24. März 2024 um 17:49

    Velted Moin.

    Genau, das meine ich, aber warum funktioniert nicht das, wenn ich dies im DllCall eintrage.

    Hmmm...

  • Cairo unter Autoit nutzen

    • UEZ
    • 24. März 2024 um 17:46

    Hallo AspirinJunkie,

    danke für dein Feedback.

    Wenn du einfach die Zeile durch diese ersetzt,

    Code
    DllCall($g_hCairoDLL, "none:cdecl", "cairo_rectangle", "ptr",  $pContext, "double", $t + $iW / 4, "double", $iH / 4, "double", $iW / 2, "double", $iH / 2)

    dann sollte die Grafik gelöscht werden und weiter passiert nichts. Eigentlich sollte das Viereck nach rechts wandern.

  • Cairo unter Autoit nutzen

    • UEZ
    • 24. März 2024 um 14:50

    Cairo scheint eine schicke 2D Grafikbibliothek zu sein, die auch auf anderen Plattformen wie Linux läuft. Ich habe einige Beispiele in Freebasic gesehen und dachte mir, warum auch nicht in Autoit.

    Ein Manual gibt es hier: https://www.cairographics.org/manual/

    Die Cairo UDF: Cairo.au3

    AutoIt: Cairo.au3
    ;Ported to Autoit by UEZ build 2024-03-24
    #include-once
    
    #Region enums and constants
    ;cairo_status as long
    Global Enum $CAIRO_STATUS_SUCCESS = 0, $CAIRO_STATUS_NO_MEMORY, $CAIRO_STATUS_INVALID_RESTORE, $CAIRO_STATUS_INVALID_POP_GROUP, $CAIRO_STATUS_NO_CURRENT_POINT, $CAIRO_STATUS_INVALID_MATRIX, _
                $CAIRO_STATUS_INVALID_STATUS, $CAIRO_STATUS_NULL_POINTER, $CAIRO_STATUS_INVALID_STRING, $CAIRO_STATUS_INVALID_PATH_DATA, $CAIRO_STATUS_READ_ERROR, $CAIRO_STATUS_WRITE_ERROR, _
                $CAIRO_STATUS_SURFACE_FINISHED, $CAIRO_STATUS_SURFACE_TYPE_MISMATCH, $CAIRO_STATUS_PATTERN_TYPE_MISMATCH, $CAIRO_STATUS_INVALID_CONTENT, $CAIRO_STATUS_INVALID_FORMAT, $CAIRO_STATUS_INVALID_VISUAL, _
                $CAIRO_STATUS_FILE_NOT_FOUND, $CAIRO_STATUS_INVALID_DASH, $CAIRO_STATUS_INVALID_DSC_COMMENT, $CAIRO_STATUS_INVALID_INDEX, $CAIRO_STATUS_CLIP_NOT_REPRESENTABLE, $CAIRO_STATUS_TEMP_FILE_ERROR, _
                $CAIRO_STATUS_INVALID_STRIDE, $CAIRO_STATUS_FONT_TYPE_MISMATCH, $CAIRO_STATUS_USER_FONT_IMMUTABLE, $CAIRO_STATUS_USER_FONT_ERROR, $CAIRO_STATUS_NEGATIVE_COUNT, $CAIRO_STATUS_INVALID_CLUSTERS, _
                $CAIRO_STATUS_INVALID_SLANT, $CAIRO_STATUS_INVALID_WEIGHT, $CAIRO_STATUS_INVALID_SIZE, $CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED, $CAIRO_STATUS_DEVICE_TYPE_MISMATCH, $CAIRO_STATUS_DEVICE_ERROR, _
                $CAIRO_STATUS_INVALID_MESH_CONSTRUCTION, $CAIRO_STATUS_DEVICE_FINISHED, $CAIRO_STATUS_JBIG2_GLOBAL_MISSING, $CAIRO_STATUS_LAST_STATUS
    
    Global Const $g_aCairoStatus[] = ["CAIRO_STATUS_SUCCESS", "CAIRO_STATUS_NO_MEMORY", "CAIRO_STATUS_INVALID_RESTORE", "CAIRO_STATUS_INVALID_POP_GROUP", "CAIRO_STATUS_NO_CURRENT_POINT", "CAIRO_STATUS_INVALID_MATRIX", _
                "CAIRO_STATUS_INVALID_STATUS", "CAIRO_STATUS_NULL_POINTER", "CAIRO_STATUS_INVALID_STRING", "CAIRO_STATUS_INVALID_PATH_DATA", "CAIRO_STATUS_READ_ERROR", "CAIRO_STATUS_WRITE_ERROR", _
                "CAIRO_STATUS_SURFACE_FINISHED", "CAIRO_STATUS_SURFACE_TYPE_MISMATCH", "CAIRO_STATUS_PATTERN_TYPE_MISMATCH", "CAIRO_STATUS_INVALID_CONTENT", "CAIRO_STATUS_INVALID_FORMAT", "CAIRO_STATUS_INVALID_VISUAL", _
                "CAIRO_STATUS_FILE_NOT_FOUND", "CAIRO_STATUS_INVALID_DASH", "CAIRO_STATUS_INVALID_DSC_COMMENT", "CAIRO_STATUS_INVALID_INDEX", "CAIRO_STATUS_CLIP_NOT_REPRESENTABLE", "CAIRO_STATUS_TEMP_FILE_ERROR", _
                "CAIRO_STATUS_INVALID_STRIDE", "CAIRO_STATUS_FONT_TYPE_MISMATCH", "CAIRO_STATUS_USER_FONT_IMMUTABLE", "CAIRO_STATUS_USER_FONT_ERROR", "CAIRO_STATUS_NEGATIVE_COUNT", "CAIRO_STATUS_INVALID_CLUSTERS", _
                "CAIRO_STATUS_INVALID_SLANT", "CAIRO_STATUS_INVALID_WEIGHT", "CAIRO_STATUS_INVALID_SIZE", "CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED", "CAIRO_STATUS_DEVICE_TYPE_MISMATCH", "CAIRO_STATUS_DEVICE_ERROR", _
                "CAIRO_STATUS_INVALID_MESH_CONSTRUCTION", "CAIRO_STATUS_DEVICE_FINISHED", "CAIRO_STATUS_JBIG2_GLOBAL_MISSING", "CAIRO_STATUS_LAST_STATUS"]
    
    ;cairo_format as long
    Global Enum    $CAIRO_FORMAT_INVALID = -1, $CAIRO_FORMAT_ARGB32, $CAIRO_FORMAT_RGB24, $CAIRO_FORMAT_A8, $CAIRO_FORMAT_A1, $CAIRO_FORMAT_RGB16_565, $CAIRO_FORMAT_RGB30
    
    ;cairo_operator as long
    Global Enum $CAIRO_OPERATOR_CLEAR, $CAIRO_OPERATOR_SOURCE, $CAIRO_OPERATOR_OVER, $CAIRO_OPERATOR_IN, $CAIRO_OPERATOR_OUT, $CAIRO_OPERATOR_ATOP, $CAIRO_OPERATOR_DEST, $CAIRO_OPERATOR_DEST_OVER, $CAIRO_OPERATOR_DEST_IN, _
                $CAIRO_OPERATOR_DEST_OUT, $CAIRO_OPERATOR_DEST_ATOP, $CAIRO_OPERATOR_XOR, $CAIRO_OPERATOR_ADD, $CAIRO_OPERATOR_SATURATE, $CAIRO_OPERATOR_MULTIPLY, $CAIRO_OPERATOR_SCREEN, $CAIRO_OPERATOR_OVERLAY, _
                $CAIRO_OPERATOR_DARKEN, $CAIRO_OPERATOR_LIGHTEN, $CAIRO_OPERATOR_COLOR_DODGE, $CAIRO_OPERATOR_COLOR_BURN, $CAIRO_OPERATOR_HARD_LIGHT, $CAIRO_OPERATOR_SOFT_LIGHT, $CAIRO_OPERATOR_DIFFERENCE, _
                $CAIRO_OPERATOR_EXCLUSION, $CAIRO_OPERATOR_HSL_HUE, $CAIRO_OPERATOR_HSL_SATURATION, $CAIRO_OPERATOR_HSL_COLOR, $CAIRO_OPERATOR_HSL_LUMINOSITY
    
    ;cairo_antialias as long
    Global Enum $CAIRO_ANTIALIAS_DEFAULT, $CAIRO_ANTIALIAS_NONE, $CAIRO_ANTIALIAS_GRAY, $CAIRO_ANTIALIAS_SUBPIXEL, $CAIRO_ANTIALIAS_FAST, $CAIRO_ANTIALIAS_GOOD, $CAIRO_ANTIALIAS_BEST
    
    ;cairo_fill_rule as long
    Global Enum $CAIRO_FILL_RULE_WINDING, $CAIRO_FILL_RULE_EVEN_ODD
    
    ;cairo_line_join as long
    Global Enum $CAIRO_LINE_JOIN_MITER, $CAIRO_LINE_JOIN_ROUND, $CAIRO_LINE_JOIN_BEVEL
    
    ;cairo_line_cap as long
    Global Enum $CAIRO_LINE_CAP_BUTT, $CAIRO_LINE_CAP_ROUND, $CAIRO_LINE_CAP_SQUARE
    
    ;cairo_text_cluster_flags as long
    Global Const $CAIRO_TEXT_CLUSTER_FLAG_BACKWARD = 0x00000001
    
    ;cairo_font_slant as long
    Global Enum    $CAIRO_FONT_SLANT_NORMAL, $CAIRO_FONT_SLANT_ITALIC, $CAIRO_FONT_SLANT_OBLIQUE
    
    ;cairo_font_weight as long
    Global Enum    $CAIRO_FONT_WEIGHT_NORMAL, $CAIRO_FONT_WEIGHT_BOLD
    
    ;cairo_subpixel_order as long
    Global Enum    $CAIRO_SUBPIXEL_ORDER_DEFAULT, $CAIRO_SUBPIXEL_ORDER_RGB, $CAIRO_SUBPIXEL_ORDER_BGR, $CAIRO_SUBPIXEL_ORDER_VRGB, $CAIRO_SUBPIXEL_ORDER_VBGR
    
    ;cairo_hint_style as long
    Global Enum    $CAIRO_HINT_STYLE_DEFAULT, $CAIRO_HINT_STYLE_NONE, $CAIRO_HINT_STYLE_SLIGHT, $CAIRO_HINT_STYLE_MEDIUM, $CAIRO_HINT_STYLE_FULL
    
    ;cairo_hint_metrics as long
    Global Enum    $CAIRO_HINT_METRICS_DEFAULT, $CAIRO_HINT_METRICS_OFF, $CAIRO_HINT_METRICS_ON
    
    ;cairo_font_type as long
    Global Enum    $CAIRO_FONT_TYPE_TOY, $CAIRO_FONT_TYPE_FT, $CAIRO_FONT_TYPE_WIN32, $CAIRO_FONT_TYPE_QUARTZ, $CAIRO_FONT_TYPE_USER
    
    ;cairo_path_data_type as long
    Global Enum    $CAIRO_PATH_MOVE_TO, $CAIRO_PATH_LINE_TO, $CAIRO_PATH_CURVE_TO, $CAIRO_PATH_CLOSE_PATH
    
    ;cairo_device_type as long
    Global Enum    $CAIRO_DEVICE_TYPE_DRM, $CAIRO_DEVICE_TYPE_GL, $CAIRO_DEVICE_TYPE_SCRIPT, $CAIRO_DEVICE_TYPE_XCB, $CAIRO_DEVICE_TYPE_XLIB, $CAIRO_DEVICE_TYPE_XML, $CAIRO_DEVICE_TYPE_COGL, _
                $CAIRO_DEVICE_TYPE_WIN32, $CAIRO_DEVICE_TYPE_INVALID = -1
    
    ;cairo_surface_observer_mode_t as long
    Global Enum $CAIRO_SURFACE_OBSERVER_NORMAL, $CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS
    
    ;cairo_surface_type as long
    Global Enum $CAIRO_SURFACE_TYPE_IMAGE, $CAIRO_SURFACE_TYPE_PDF, $CAIRO_SURFACE_TYPE_PS, $CAIRO_SURFACE_TYPE_XLIB, $CAIRO_SURFACE_TYPE_XCB, $CAIRO_SURFACE_TYPE_GLITZ, $CAIRO_SURFACE_TYPE_QUARTZ,$CAIRO_SURFACE_TYPE_WIN32, _
                $CAIRO_SURFACE_TYPE_BEOS, $CAIRO_SURFACE_TYPE_DIRECTFB, $CAIRO_SURFACE_TYPE_SVG, $CAIRO_SURFACE_TYPE_OS2, $CAIRO_SURFACE_TYPE_WIN32_PRINTING, $CAIRO_SURFACE_TYPE_QUARTZ_IMAGE, $CAIRO_SURFACE_TYPE_SCRIPT, _
                $CAIRO_SURFACE_TYPE_QT, $CAIRO_SURFACE_TYPE_RECORDING, $CAIRO_SURFACE_TYPE_VG, $CAIRO_SURFACE_TYPE_GL, $CAIRO_SURFACE_TYPE_DRM, $CAIRO_SURFACE_TYPE_TEE, $CAIRO_SURFACE_TYPE_XML, $CAIRO_SURFACE_TYPE_SKIA, _
                $CAIRO_SURFACE_TYPE_SUBSURFACE, $CAIRO_SURFACE_TYPE_COGL
    
    ;cairo_pattern_type as long
    Global Enum $CAIRO_PATTERN_TYPE_SOLID, $CAIRO_PATTERN_TYPE_SURFACE, $CAIRO_PATTERN_TYPE_LINEAR, $CAIRO_PATTERN_TYPE_RADIAL, $CAIRO_PATTERN_TYPE_MESH, $CAIRO_PATTERN_TYPE_RASTER_SOURCE
    
    ;cairo_extend as long
    Global Enum $CAIRO_EXTEND_NONE, $CAIRO_EXTEND_REPEAT, $CAIRO_EXTEND_REFLECT, $CAIRO_EXTEND_PAD
    
    ;cairo_filter as long
    Global Enum $CAIRO_FILTER_FAST, $CAIRO_FILTER_GOOD, $CAIRO_FILTER_BEST, $CAIRO_FILTER_NEAREST, $CAIRO_FILTER_BILINEAR, $CAIRO_FILTER_GAUSSIAN
    
    ;cairo_region_overlap as long
    Global Enum $CAIRO_REGION_OVERLAP_IN, $CAIRO_REGION_OVERLAP_OUT, $CAIRO_REGION_OVERLAP_PART
    
    #EndRegion
    
    #Region tag structs
    ;structs
    Global Const $tagCairo_rectangle_int = "long x;long y;long width;long height;"
    Global Const $tagCairo_rectangle_list = "long status;ptr rectangles;long num_rectangles;"
    Global Const $tagCairo_matrix = "double xx;double yx;double xy;double yy;double x0;double y0;"
    Global Const $tagCairo_glyph_t = (@AutoItX64 ? "uinteger" : "ulong") & " index;double x;double y;"
    Global Const $tagCairo_text_cluster_t = "long num_bytes;long num_glyphs;"
    Global Const $tagCairo_text_extents_t = "double x_bearing;double y_bearing;double width;double height;double x_advance;double y_advance;"
    Global Const $tagCairo_font_extents_t = "double ascent;double descent;double height;double max_x_advance;double max_y_advance;"
    Global Const $tagCairo_path_data_t_header = "long type;long length;"
    Global Const $tagCairo_path_data_t_point = "double x;double y;"
    Global Const $tagCairo_path_data_t = "ptr path;"
    Global Const $tagCairo_path = "long status;ptr data;long num_data;"
    #EndRegion
    
    
    Global $g_hCairoDLL = 0
    
    Func Cairo_Init($sPath = Default)
        Local Const $sDLL = ($sPath = Default ? (@AutoItX64 ? (@ScriptDir & "\cairo64.dll") : (@ScriptDir & "\cairo.dll")) : $sPath)
        If Not FileExists($sDLL) Then Return SetError(1, 0, 0)
        $g_hCairoDLL = DllOpen($sDLL)
        If $g_hCairoDLL = -1 Or @error Then Return SetError(2, 0, 0)
        Return 1
    EndFunc
    
    Func Cairo_Close()
        If $g_hCairoDLL Then Return DllClose($g_hCairoDLL)
        Return 0
    EndFunc
    
    Func Cairo_GetStride($iW, $iFormat = $CAIRO_FORMAT_ARGB32)
        Local Const $aStride = DllCall($g_hCairoDLL, "long:cdecl", "cairo_format_stride_for_width", "long", $iFormat, "long", $iW) ;BitShift($iW * 32 + 15, 4) * 2 * $iH
        If @error Or Not IsArray($aStride) Then Return SetError(1, 0, 0)
        If Not $aStride[0] Then Return SetError(2, 0, 0)
        Return $aStride[0]
    EndFunc
    
    Func Cairo_CreateWin32Surface($hDC)
        Local Const $aSurface = DllCall($g_hCairoDLL, "ptr:cdecl", "cairo_win32_surface_create", "ptr", $hDC)
        If @error Or Not IsArray($aSurface) Then Return SetError(1, 0, 0)
        If Not $aSurface[0] Then Return SetError(2, 0, 0)
        Return $aSurface[0]
    EndFunc
    
    Func Cairo_CreateWin32SurfacePrinting($hDC)
        Local Const $aSurface = DllCall($g_hCairoDLL, "ptr:cdecl", "cairo_win32_printing_surface_create", "ptr", $hDC)
        If @error Or Not IsArray($aSurface) Then Return SetError(1, 0, 0)
        If Not $aSurface[0] Then Return SetError(2, 0, 0)
        Return $aSurface[0]
    EndFunc
    
    Func Cairo_CreateWin32SurfaceWithFormat($hDC, $iFormat = $CAIRO_FORMAT_ARGB32)
        Local Const $aSurface = DllCall($g_hCairoDLL, "ptr:cdecl", "cairo_win32_surface_create_with_format", "ptr", $hDC, "long", $iFormat)
        If @error Or Not IsArray($aSurface) Then Return SetError(1, 0, 0)
        If Not $aSurface[0] Then Return SetError(2, 0, 0)
        Return $aSurface[0]
    EndFunc
    
    Func Cairo_CreateWin32SurfaceWithDDB($hDC, $iW, $iH, $iFormat = $CAIRO_FORMAT_ARGB32)
        Local Const $aSurface = DllCall($g_hCairoDLL, "ptr:cdecl", "cairo_win32_surface_create_with_ddb", "ptr", $hDC, "long", $iFormat, "long", $iw, "long", $ih)
        If @error Or Not IsArray($aSurface) Then Return SetError(1, 0, 0)
        If Not $aSurface[0] Then Return SetError(2, 0, 0)
        Return $aSurface[0]
    EndFunc
    
    Func Cairo_CreateSurfaceImageData($pImageData, $iW, $iH, $iStride, $iFormat = $CAIRO_FORMAT_ARGB32)
        Local Const $aSurface = DllCall($g_hCairoDLL, "ptr:cdecl", "cairo_image_surface_create_for_data", "ptr", $pImageData, "long", $iFormat, "long", $iW, "long", $iH, "long", $iStride)
        If @error Or Not IsArray($aSurface) Then Return SetError(1, 0, 0)
        If Not $aSurface[0] Then Return SetError(2, 0, 0)
        Return $aSurface[0]
    EndFunc
    
    Func Cairo_CreateContext($pSurface)
        Local Const $aContext = DllCall($g_hCairoDLL, "ptr:cdecl", "cairo_create", "ptr", $pSurface)
        If @error Or Not IsArray($aContext) Then Return SetError(1, 0, 0)
        If Not $aContext[0] Then Return SetError(2, 0, 0)
        Return $aContext[0]
    EndFunc
    
    Func Cairo_DestroyContext($pContext)
        If Not $pContext Then Return SetError(1, 0, 0)
        DllCall($g_hCairoDLL, "none:cdecl", "cairo_destroy", "ptr", $pContext)
        Return 1
    EndFunc
    
    Func Cairo_DestroySurface($pSurface)
        If Not $pSurface Then Return SetError(1, 0, 0)
        DllCall($g_hCairoDLL, "none:cdecl", "cairo_surface_destroy", "ptr", $pSurface)
        Return 1
    EndFunc
    
    Func Cairo_ClearContext($pContext, $r = 0, $g = 0, $b = 0, $a = 1)
        If Not $pContext Then Return SetError(1, 0, 0)
        DllCall($g_hCairoDLL, "none:cdecl", "cairo_set_source_rgb", "ptr", $pContext, "double", $r, "double", $g, "double", $b, "double", $a)
        DllCall($g_hCairoDLL, "none:cdecl", "cairo_paint", "ptr", $pContext)
    EndFunc
    Alles anzeigen


    Beispiel:

    C
    #AutoIt3Wrapper_UseX64=n
    
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPIGdi.au3>
    #include "Cairo.au3"
    
    AutoItSetOption('MustDeclareVars', 1)
    
    Global Const $fPi = ACos(-1), $fRad = $fPi / 180, $fDeg = 180 / $fPi, $f2PI = $fPi * 2
    Global Const $iW = 600, $iH = 400, $sTitle = "Cairo Test / FPS: "
    Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit
    
    AutoItSetOption("GUIOnEventMode", 1)
    
    Cairo_Test()
    
    AutoItSetOption("GUIOnEventMode", 0)
    
    
    Func Cairo_Test()
    	Cairo_Init()
    	Local $iStride = Cairo_GetStride($iW)
    	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iStride = ' & $iStride & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    	$hGUI = GUICreate($sTitle & "0", $iW, $iH)
    	Local Const $hDC = _WinAPI_GetDC($hGUI)
    ;~ 	Local $tBits = DllStructCreate("long[" & $iStride * $iH & "]")
    ;~ 	Local Const $hBitmapGDI = _WinAPI_CreateBitmap($iW, $iH, 1, 32, $tBits)
    	Local Const $hBitmapGDI = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
    	Local Const $hGfxDC = _WinAPI_CreateCompatibleDC($hDC)
    	Local Const $hObjOld = _WinAPI_SelectObject($hGfxDC, $hBitmapGDI)
    	GUISetState(@SW_SHOW, $hGUI)
    
    
    	$bExit = False
    	GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    	AdlibRegister("CalcFPS", 1000)
    
    	Local $pSurface = Cairo_CreateWin32Surface($hGfxDC)
    
    	ConsoleWrite("Surface status: " & DllCall($g_hCairoDLL, "long:cdecl", "cairo_surface_status", "ptr", $pSurface)[0] & @CRLF)
    	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $pSurface = ' & $pSurface & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    	Local $pContext = Cairo_CreateContext($pSurface)
    	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $pContext = ' & $pContext & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    
    	ConsoleWrite(DllCall($g_hCairoDLL, "str:cdecl", "cairo_status_to_string")[0] & @CRLF)
    
    	Local $t, $tt = 1 / 60, $x, $y, $c
    	Local $tPAINTSTRUCT
    
    	Do
            _WinAPI_BeginPaint($hGUI, $tPAINTSTRUCT)
    
    		$c = 0.5 + 0.5 * Sin($t)
    		Cairo_ClearContext($pContext, $c, $c, $c)
    
    
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_set_source_rgba", "ptr", $pContext, "double", 0, "double", 0, "double", 0.5 + 0.5 * Cos($t), "double", 1.0)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_set_line_width", "ptr", $pContext, "double", $iH / 10)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_rectangle", "ptr",  $pContext, "double", $iW / 4, "double", $iH / 4, "double", $iW / 2, "double", $iH / 2)
    		DllCall($g_hCairoDLL, "none:cdecl", "cairo_stroke", "ptr", $pContext)
    
    
    
    		_WinAPI_EndPaint($hGUI, $tPAINTSTRUCT)
    
    		$t += $tt
    
    		_WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hGfxDC, 0, 0, $SRCCOPY)
    
    		$iFPS += 1
    		If $bExit Then ExitLoop
    	Until Not Sleep(10)
    
    	Cairo_DestroyContext($pContext)
    	Cairo_DestroySurface($pSurface)
    
    	_WinAPI_SelectObject($hGfxDC, $hObjOld)
    	_WinAPI_ReleaseDC($hGUI, $hDC)
    	_WinAPI_DeleteDC($hGfxDC)
    	_WinAPI_DeleteObject($hBitmapGDI)
    	GUIDelete($hGUI)
    	Cairo_Close()
    
    EndFunc
    
    Func _Exit()
    	$bExit = True
    EndFunc   ;==>_Exit_About
    
    Func CalcFPS() ;display FPS
    	$iShowFPS = $iFPS
    	$iFPS = 0
    	WinSetTitle($hGUI, "", $sTitle & $iShowFPS)
    EndFunc   ;==>CalcFPS
    Alles anzeigen


    Soweit funktioniert das Beispiel, nur wenn ich die Position über eine Variable in der cairo_rectangle Funktion hinzufüge, dann passiert nichts mehr.

    Ich habe nicht herausgefunden, was man tun muss, damit auch Animationen möglich sind. Somit könnte man Cairo mit GDI / GDI+ vergleichen.

    Die benötigten DLLs sind im Anhang zu finden.


    Hat jemand eine Idee?

    Dateien

    CairoDLLs.7z 1,62 MB – 209 Downloads
  • Hook auf die MsgBox

    • UEZ
    • 8. März 2024 um 21:57

    Vielleicht hilft dir das hier ein wenig weiter:

    AutoIt: MsgBox Hook with counter v2.au3
    ;Coded by UEZ build 2023-04-29 beta
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #Au3Stripper_Parameters=/so
    #Au3Stripper_Ignore_Funcs=_TimerProc
    
    #include <Timers.au3>
    #include <WinAPIConstants.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPIProc.au3>
    #include <WinAPISys.au3>
    #include <WindowsConstants.au3>
    
    Const $HCBT_CREATEWND = 3, $HCBT_DESTROYWND = 4, $HCBT_ACTIVATE = 5, $g_iFlagDefault = BitOR($MB_TOPMOST, $MB_ICONINFORMATION)
    Global $g_hMsgBoxHook, $g_hSubMsgBox, $g_idTImer, $g_sBtn1_Txt = "Close", $g_sBtn2_Txt, $g_sBtn3_Txt
    Global $g_Timeout = 0
    
    Func _WinAPI_SetDlgItemText($hDlg, $nIDDlgItem, $lpString) ;https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setdlgitemtextw
    	Local $aRet = DllCall("user32.dll", "int", "SetDlgItemText", "hwnd", $hDlg, "int", $nIDDlgItem, "str", $lpString)
    	If @error Then Return SetError(@error, @extended, 0)
    	Return $aRet[0]
    EndFunc   ;==>_WinAPI_SetDlgItemText
    
    Func _TimerProc($hwnd, $iMsg, $wParam, $lParam)
    	If $g_Timeout <= 1 Then
    		WinClose($hwnd)
    	Else
    		$g_Timeout -= 1
    		_WinAPI_SetDlgItemText($hWnd, $IDOK + 1, $g_sBtn1_Txt & " [" & $g_Timeout & "]")
    	EndIf
    EndFunc   ;==>_TimerProc
    
    Func _CBTHookProc($nCode, $wParam, $lParam)
    	If $nCode < 0 Then Return _WinAPI_CallNextHookEx($g_hMsgBoxHook, $nCode, $wParam, $lParam)
    	Local Const $hHWND = HWnd($wParam)
    	Switch $nCode
    		Case $HCBT_ACTIVATE
    			If _WinAPI_GetClassName($hHWND) = "#32770" Then
    				If $g_Timeout Then $g_idTImer = _Timer_SetTimer($hHWND, 1000, "_TimerProc")
    				_WinAPI_SetDlgItemText($wParam, $IDOK, $g_Timeout ? $g_sBtn1_Txt & " [" & $g_Timeout & "]" : $g_sBtn1_Txt)
    			EndIf
    		Case $HCBT_DESTROYWND
    			If _WinAPI_GetClassName($hHWND) = "#32770" Then _Timer_KillTimer($hHWND, $g_idTImer)
    	EndSwitch
    	Return _WinAPI_CallNextHookEx($g_hMsgBoxHook, $nCode, $wParam, $lParam)
    EndFunc   ;==>_CBTHookProc
    
    Func MsgBoxEx($sText, $sTitle = Default, $iTimeout = 0, $iFlag = Default, $sBtn_Txt = Default, $hParentHWND = "")
    	If $sBtn_Txt <> Default Then $g_sBtn1_Txt = $sBtn_Txt
    	If $iFlag = Default Then $iFlag = $g_iFlagDefault
    	$g_Timeout = $iTimeout
    	$g_MsgProc = DllCallbackRegister("_CBTHookProc", "int", "uint;wparam;lparam")
    	Local Const $hThreadID = _WinAPI_GetCurrentThreadId()
    	$g_hMsgBoxHook = _WinAPI_SetWindowsHookEx($WH_CBT, DllCallbackGetPtr($g_MsgProc), Null, $hThreadID)
    	If $sTitle = Default Then $sTitle = "Information"
    	Local Const $iReturn = MsgBox($iFlag, $sTitle, $sText, $iTimeout, $hParentHWND)
    	_WinAPI_UnhookWindowsHookEx($g_hMsgBoxHook)
    	DllCallbackFree($g_MsgProc)
    	Return $iReturn
    EndFunc   ;==>MsgBoxEx
    
    ConsoleWrite(MsgBoxEx("This is a test", "Information", 5) & @CRLF)
    Alles anzeigen
  • DllStruct to Array - DllStructs übersichtlich anzeigen lassen

    • UEZ
    • 29. Januar 2024 um 21:42

    Ach, iwo, ich finde Alternativen immer sehr gut, das macht die Sache abwechslungsreicher, zumal du immer sehr guten und intelligenten Code postest. :) Also nichts peinliches, wenn man eine Alternative postest:!:

    Mag sein, dass mein Post oben "zu trocken" war, wollte mich einfach bedanken und zugleich sagen, dass es eine ähnliche Funktion bereits gibt. Bin eher der Purist, wenn's um Feedback geht (das Gegenteil von Andy ;))

    Vergleichen mit der Built-in Funktion sind die Ergebnisse aber unterschiedlich in der Darstellung...

  • DllStruct to Array - DllStructs übersichtlich anzeigen lassen

    • UEZ
    • 29. Januar 2024 um 20:07

    AspirinJunkie Danke für die Alternative zu der Built-in Funktion _WinAPI_DisplayStruct().

  • Balkengrafik

    • UEZ
    • 20. November 2023 um 10:01

    Als Start kannst du dies hier verwenden, um iCurrent darzustellen.

    AutoIt
    ;coded by UEZ build 2023-20-11
    
    #include <GDIPlus.au3>
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    _GDIPlus_Startup()
    Global $hGUI, $iFPS = 0, $iShowFPS = 0, $bExit
    Global Const $iW = 600, $iH = 600, $iWh = $iW / 2, $iHh = $iH / 2, $sTitle = "GDI+ Test"
    Global Const $fPi = ACos(-1), $fRad = $fPi / 180, $fDeg = 180 / $fPi
    AutoItSetOption("GUIOnEventMode", 1)
    
    GDIPlus_Test()
    
    AutoItSetOption("GUIOnEventMode", 0)
    _GDIPlus_Shutdown()
    
    
    Func GDIPlus_Test()
        $bExit = False
        $hGUI = GUICreate($sTitle, $iW, $iH) ;, 0, 0, $WS_POPUP)
        GUISetState(@SW_SHOW, $hGUI)
    ;~     GUISetCursor(16, 1)
    
        ;create canvas elements
        Local Const $hDC = _WinAPI_GetDC($hGUI)
        Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
        Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC)
        Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap)
        Local Const $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer)
        _GDIPlus_GraphicsSetSmoothingMode($hCanvas, $GDIP_SMOOTHINGMODE_HIGHQUALITY)
        _GDIPlus_GraphicsSetPixelOffsetMode($hCanvas, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
    
        Local Const $hBrush_Clr = _GDIPlus_BrushCreateSolid(0xFF000000), _
                    $hBrush_FPS = _GDIPlus_BrushCreateSolid(0xF0808080), _
                    $hFormat_FPS = _GDIPlus_StringFormatCreate(), _
                    $hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial"), _
                    $hFont_FPS = _GDIPlus_FontCreate($hFamily_FPS, 8), _
                    $tLayout_FPS = _GDIPlus_RectFCreate(0, 0, 60, 16)
        Local $fDiameter = 600
        Local Const $hBitmap_Clock = GenerateGauge($fDiameter)
        $iFPS = 0
        GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit_About")
        AdlibRegister("CalcFPS", 1000)
    
        Do
            _GDIPlus_GraphicsDrawImageRect($hCanvas, $hBitmap_Clock, 0, 0, $fDiameter, $fDiameter)
    
            _GDIPlus_GraphicsDrawStringEx($hCanvas, "FPS: " & $iShowFPS, $hFont_FPS, $tLayout_FPS, $hFormat_FPS, $hBrush_FPS) ;draw background message text
            _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $SRCCOPY) ;blit drawn bitmap to GUI
    
            $iFPS += 1
            If $bExit Then ExitLoop
        Until Not Sleep(30)
    
        AdlibUnRegister("CalcFPS")
        ;release resources
        _GDIPlus_FontDispose($hFont_FPS)
        _GDIPlus_FontFamilyDispose($hFamily_FPS)
        _GDIPlus_StringFormatDispose($hFormat_FPS)
        _GDIPlus_BrushDispose($hBrush_Clr)
        _GDIPlus_BrushDispose($hBrush_FPS)
        _GDIPlus_GraphicsDispose($hCanvas)
        _WinAPI_SelectObject($hDC_backbuffer, $DC_obj)
        _WinAPI_DeleteDC($hDC_backbuffer)
        _WinAPI_DeleteObject($hHBitmap)
        _WinAPI_ReleaseDC($hGUI, $hDC)
        GUIDelete($hGUI)
    EndFunc   ;==>GDIPlus_Test
    
    
    Func _Exit_About()
        $bExit = True
    EndFunc   ;==>_Exit_About
    
    Func CalcFPS() ;display FPS
        $iShowFPS = $iFPS
        $iFPS = 0
    EndFunc   ;==>CalcFPS
    
    Func GenerateGauge($fDiameter)
        Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($fDiameter, $fDiameter), $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap), _
                    $hEffect = _GDIPlus_EffectCreateBlur(10.5, 0), $fBorderSize = $fDiameter * 0.03333
        Local $hPen = _GDIPlus_PenCreate(0), $hMatrix, $hBrush = _GDIPlus_LineBrushCreate($fDiameter / 2, 0, $fDiameter / 2, $fDiameter, 0xF0F0F0F0, 0xF0303030, 3)
        _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4)
        _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 4)
        _GDIPlus_GraphicsClear($hGfx, 0xFFFFFFFF)
        _GDIPlus_PenSetColor($hPen, 0xA0000000)
        _GDIPlus_PenSetWidth($hPen, $fBorderSize)
        Local Const $fSize = $fDiameter * 0.95 - $fBorderSize / 2, $fRadius = $fDiameter / 2
    
        _GDIPlus_LineBrushSetGammaCorrection($hBrush)
        _GDIPlus_GraphicsFillEllipse($hGfx, $fDiameter - $fDiameter * 0.94, $fDiameter - $fDiameter * 0.94, $fDiameter * 0.92, $fDiameter * 0.92, $hBrush)
    
        _GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize + $fDiameter * 0.005, $fBorderSize + $fDiameter * 0.01, $fSize, $fSize, $hPen)
        _GDIPlus_BitmapApplyEffect($hBitmap, $hEffect)
        _GDIPlus_PenSetColor($hPen, 0xF0000000)
        _GDIPlus_GraphicsDrawEllipse($hGfx, $fBorderSize, $fBorderSize, $fSize, $fSize, $hPen)
    
        _GDIPlus_GraphicsTranslateTransform($hGfx, $fDiameter / 2, $fDiameter / 2)
        _GDIPlus_GraphicsRotateTransform($hGfx, -126)
        _GDIPlus_GraphicsTranslateTransform($hGfx, -$fDiameter / 2, -$fDiameter / 2)
    
        Local $iWidth1 = $fDiameter * 0.0125, $iHeight1 = $fDiameter / 15, $iWidth12 = $iWidth1 / 2, $fPosY = $fDiameter * 0.083333, _
              $iWidth2 = $fDiameter * 0.013333, $iHeight2 = $fDiameter * 0.0416667, $iWidth22 = $iWidth2 / 2
    
        _GDIPlus_BrushDispose($hBrush)
        $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)
        For $i = 0 to 40
            _GDIPlus_GraphicsTranslateTransform($hGfx, $fRadius, $fRadius)
            _GDIPlus_GraphicsRotateTransform($hGfx, 6)
            _GDIPlus_GraphicsTranslateTransform($hGfx, -$fRadius, -$fRadius)
            Switch Mod($i, 4)
                Case 0
                    _GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth12, $fPosY, $iWidth1, $iHeight1, $hBrush)
                Case Else
    ;~                 _GDIPlus_GraphicsFillRect($hGfx, $fRadius - $iWidth22, $fPosY, $iWidth2, $iHeight2, $hBrush)
            EndSwitch
        Next
    
        _GDIPlus_GraphicsResetTransform($hGfx)
        _GDIPlus_PenDispose($hPen)
        _GDIPlus_BrushDispose($hBrush)
        $hBrush = _GDIPlus_LineBrushCreate(0, 0, $fSize, $fSize, 0x8000FF00, 0xC8FF0000, 3)
        $hMatrix = _GDIPlus_MatrixCreate()
        _GDIPlus_MatrixRotate($hMatrix, -5)
        _GDIPlus_LineBrushSetTransform($hBrush, $hMatrix)
        $hPen = _GDIPlus_PenCreate2($hBrush, $fDiameter * 0.03)
        _GDIPlus_GraphicsDrawArc($hGfx, $fBorderSize + $fDiameter * 0.03333, $fBorderSize + $fDiameter * 0.03333, $fSize * 0.93, $fSize * 0.93, -211.5, 243.5, $hPen)
        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_PenDispose($hPen)
    
        $hBrush = _GDIPlus_BrushCreateSolid(0x80000000)
        $hPen = _GDIPlus_PenCreate(0x40000000, 2)
        _GDIPlus_GraphicsFillEllipse($hGfx, $fDiameter / 2 - $iWidth2, $fDiameter / 2 - $iWidth2, $iWidth2 * 2, $iWidth2 * 2, $hBrush)
        _GDIPlus_GraphicsDrawEllipse($hGfx, $fDiameter / 2 - $iWidth2, $fDiameter / 2 - $iWidth2, $iWidth2 * 2, $iWidth2 * 2, $hPen)
    
        _GDIPlus_MatrixDispose($hMatrix)
        _GDIPlus_EffectDispose($hEffect)
        _GDIPlus_PenDispose($hPen)
        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_GraphicsDispose($hGfx)
        Return $hBitmap
    EndFunc
    Alles anzeigen

    Dies ist nur das Hintergrundbild, d.h. du müsstest noch einen drehenden Zeiger entsprechend dem $iCurrent Wert implementieren.

  • ListView Markierung mit den Pfeiltasten bewegen

    • UEZ
    • 9. November 2023 um 14:24

    Natürlich ist das mit Autoit möglich, sogar viel einfacher, aber man will ja sein Horizont erweitern...

    Danke

  • ListView Markierung mit den Pfeiltasten bewegen

    • UEZ
    • 9. November 2023 um 12:53

    Velted eigentlich geht es nicht um Autoit, sondern um ein Freebasic Tool, woran ich wieder mal arbeite. Es ist sehr interessant, wie man die WinAPI Funktionen ohne UDFs nutzt.

    Dadurch kann / muss man mehr in die Details gehen und lernt dabei mehr, als nur die UDFs zu nutzen.

    Falls interesse besteht: Color Constants v0.80 build 2023-11-08.zip

    Manchmal suche ich nach bestimmten Farben und durch das Tool ist es einfacher, die Farbe zu suchen.

  • ListView Markierung mit den Pfeiltasten bewegen

    • UEZ
    • 8. November 2023 um 21:55

    Velted genau so habe ich mir das vorgestellt.

    MERCI.

  • ListView Markierung mit den Pfeiltasten bewegen

    • UEZ
    • 8. November 2023 um 16:10

    Gibt es eine Möglichkeit, dass die Farben in der 3 Spalte immer angezeigt werden, nicht nur bei der Selektion?

    AutoIt
    ;coded by LarsJ / Velted
    #include <Array.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    
    Opt("MustDeclareVars", 1)
    
    Global $hGui, $hLV, $iLVx, $iLVy
    
    Example()
    
    
    Func Example()
    
        $hGui = GUICreate("Mark Cell in Listview", 500, 540)
    
        Local $idLV0 = GUICtrlCreateListView("Column 0|Column 1|Column 2", 25, 10, 250, 500)
        For $i = 0 To 99
            GUICtrlCreateListViewItem("Cell " & $i & ".0" & "|" & Hex(Int(Random() * 0xFFFFFF), 6) & "|", $idLV0)
        Next
        $hLV = GUICtrlGetHandle($idLV0)
        $iLVx = 25
        $iLVy = 10
    
        GUISetState()
    
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
    
    EndFunc   ;==>Example
    
    Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        Local $tNMHDR, $hWndFrom, $iCode
        $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
    
        Switch $hWndFrom
            Case $hLV
                Switch $iCode
                    ; Handle arrow key presses for selection movement
                    Case $NM_CUSTOMDRAW
                        Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                        Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")
                        Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Item index
                        Local $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index
                        Local $uItemState = DllStructGetData($tNMLVCUSTOMDRAW, "uItemState") ; Item state
    
                        Switch $dwDrawStage                     ; Holds a value that specifies the drawing stage
                            Case $CDDS_PREPAINT                 ; Before the paint cycle begins
                                Return $CDRF_NOTIFYITEMDRAW     ; Notify the parent window of any ITEM-related drawing operations
                            Case $CDDS_ITEMPREPAINT             ; Before painting an item
                                If _GUICtrlListView_GetItemSelected($hLV, $dwItemSpec) Then Return $CDRF_NOTIFYSUBITEMDRAW  ; Notify the parent window of any SUBITEM-related drawing operations
                                Return $CDRF_DODEFAULT
                            Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) ; Before painting a subitem
                                DllStructSetData($tNMLVCUSTOMDRAW, "uItemState", BitAND($uItemState, BitNOT($CDIS_SELECTED)))
                                Switch $iSubItem
                                    Case 0 To 1 ; Marked column
                                        DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0xFFFFFF) ; Forecolor white
                                        DllStructSetData($tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600) ; Backcolor dark blue, BGR
                                    Case Else ; Other columns
                                        DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0x000000) ; Forecolor black
                                        DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", "0x" & _GUICtrlListView_GetItemText($hLV, $dwItemSpec, 1)) ; Backcolor white
                                EndSwitch
                                Return $CDRF_NEWFONT            ; $CDRF_NEWFONT must be returned after changing font or colors
                        EndSwitch
                EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_NOTIFY
    Alles anzeigen
  • ListView Markierung mit den Pfeiltasten bewegen

    • UEZ
    • 8. November 2023 um 14:54

    Moombas kein Problem.

    Was macht eigentlich die Zeile?

    Code
    DllStructSetData($tNMLVCUSTOMDRAW, "uItemState", BitAND($uItemState, BitNOT(0x11)))

    Die 3. Spalte beinhaltet die Farbe, die in der Spalte 2 steht. Mit der Lösung oben wird sie überschrieben (gut, hatte ich nicht erwähnt).

  • ListView Markierung mit den Pfeiltasten bewegen

    • UEZ
    • 8. November 2023 um 14:08

    Velted wow, genau so sollte es sein. Danke!

    Moombas  Peter S. Taler Eine Multiauswahl will ich nicht - nur ein simples hoch und runter zusätzlich mit den Pfeiltasten.

    Danke euch allen!

  • ListView Markierung mit den Pfeiltasten bewegen

    • UEZ
    • 7. November 2023 um 22:35

    Hat jemand ein Idee, wie ich den Code erweitern kann, sodass die Selektion mit den Pfeiltasten nach oben / unten verschoben werden kann?

    AutoIt
    ;coded by LarsJ
    #include <Array.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    
    Opt("MustDeclareVars", 1)
    
    Global $hGui, $hLV, $iLVx, $iLVy, $aHit[2] = [-1, -1]    ; $aHit contains row & col of marked cell
    
    Example()
    
    
    Func Example()
    
        $hGui = GUICreate("Mark Cell in Listview", 500, 540)
    
        Local $idLV0 = GUICtrlCreateListView("Column 0|Column 1|Column 2", 25, 10, 250, 500)
        For $i = 0 To 99
            GUICtrlCreateListViewItem("Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV0)
        Next
        $hLV = GUICtrlGetHandle($idLV0)
        $iLVx = 25
        $iLVy = 10
    
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    
        GUISetState()
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
    
    EndFunc   ;==>Example
    
    Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        Local $tNMHDR, $hWndFrom, $iCode
        $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
    
        Switch $hWndFrom
    
            Case $hLV
                Local $iSelectedItem = _GUICtrlListView_GetSelectionMark($hLV)
                ConsoleWrite(_GUICtrlListView_GetSelectedIndices($hLV) & @CRLF)
                Switch $iCode
                    ; Handle arrow key presses for selection movement
    
                    Case $LVN_KEYDOWN
                        Local $tNMLVKEYDOWN = DllStructCreate($tagNMLVKEYDOWN, $lParam)
                        Local $iVKey = DllStructGetData($tNMLVKEYDOWN, "VKey")
    ;~                     If $iSelectedItem > -1 Then
    ;~                         Local $iNewIndex = -1
    ;~                         If $iVKey = 38 Then ; Up arrow key
    ;~                             $iNewIndex = $iSelectedItem - 1
    ;~                         ElseIf $iVKey = 40 Then ; Down arrow key
    ;~                             $iNewIndex = $iSelectedItem + 1
    ;~                         EndIf
    ;~                         ConsoleWrite($iNewIndex & @CRLF)
    ;~                         If $iNewIndex > -1 And $iNewIndex < _GUICtrlListView_GetItemCount($hLV) Then
    ;~                             _GUICtrlListView_SetItemSelected($hLV, $iNewIndex, True, False)
    ;~                             _GUICtrlListView_RedrawItems($hLV, $iNewIndex, $iNewIndex)
    ;~                         EndIf
    ;~                     EndIf
    
                    Case $LVN_ITEMCHANGED
                        Local $tNMLISTVIEW, $iItem, $aInfo
                        $tNMLISTVIEW = DllStructCreate($tagNMLISTVIEW, $lParam)
                        $iItem = DllStructGetData($tNMLISTVIEW, "Item")
                        _GUICtrlListView_SetItemSelected($hLV, $iItem, False)
                        _GUICtrlListView_SetItemState($hLV, $iItem, 0, $LVIS_FOCUSED)
    
                        Local $aInfo = GUIGetCursorInfo($hGui)
                        If $aInfo[2] Then
                            $aInfo = _GUICtrlListView_SubItemHitTest($hLV, $aInfo[0] - $iLVx, $aInfo[1] - $iLVy)
                            If $aInfo[0] > -1 And $aInfo[1] > -1 And $aInfo[0] = $iItem Then
                                If $aHit[0] > -1 Then _GUICtrlListView_RedrawItems($hLV, $aHit[0], $aHit[0])
                                If $aHit[0] <> $aInfo[0] Or $aHit[1] <> $aInfo[1] Then
                                    $aHit[0] = $aInfo[0] ; Row
                                    $aHit[1] = $aInfo[1] ; Col
                                Else
                                    $aHit[0] = -1 ; Row
                                    $aHit[1] = -1 ; Col
                                EndIf
                                _GUICtrlListView_RedrawItems($hLV, $iItem, $iItem)
                            EndIf
                        EndIf
                    Case $NM_CUSTOMDRAW
                        Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                        Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")
    
                        Switch $dwDrawStage                     ; Holds a value that specifies the drawing stage
    
                            Case $CDDS_PREPAINT                 ; Before the paint cycle begins
                                Return $CDRF_NOTIFYITEMDRAW     ; Notify the parent window of any ITEM-related drawing operations
    
                            Case $CDDS_ITEMPREPAINT             ; Before painting an item
                                Return $CDRF_NOTIFYSUBITEMDRAW  ; Notify the parent window of any SUBITEM-related drawing operations
    
                            Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) ; Before painting a subitem
                                Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Item index
                                Local $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index
                                Local $uItemState = DllStructGetData($tNMLVCUSTOMDRAW, "uItemState") ; Item state
                                If $dwItemSpec = $aHit[0] Then ; Marked row
                                    Switch $iSubItem
                                        Case 0 To 1 ; Marked column
                                            DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0xFFFFFF) ; Forecolor white
                                            DllStructSetData($tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600) ; Backcolor dark blue, BGR
                                        Case Else ; Other columns
                                            DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0x000000) ; Forecolor black
                                            DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF) ; Backcolor white
                                    EndSwitch
                                Else ; Other rows
                                    DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0x000000)
                                    DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF)
                                EndIf
                                Return $CDRF_NEWFONT            ; $CDRF_NEWFONT must be returned after changing font or colors
    
                        EndSwitch
    
                EndSwitch
    
        EndSwitch
    
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_NOTIFY
    Alles anzeigen

    Wichtig ist, dass nur die ersten zwei Zellen markiert bleiben.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™