Cursor bei Lupe mit gdi32.dll

  • Hallo zusammen,

    ist es möglich bei der Lupenfunktion mittels gdi32.dll

    [autoit]


    Func MAG()
    $DeskHDC = DllCall("user32.dll", "int", "GetDC", "hwnd", $Auswertungsprogramm);0
    $GUIHDC = DllCall("user32.dll", "int", "GetDC", "hwnd", $GUI)
    DllCall("gdi32.dll", "int", "StretchBlt", "int", $GUIHDC[0], "int", _
    0, "int", 0, "int", $MagWidth, "int", $MagHeight, "int", $DeskHDC[0], "int", _
    MouseGetPos(0) - $x_diff, "int", MouseGetPos(1) - $y_diff, "int", $magZoomedWidth, "int", $magZoomedHeight, _
    "long", $scoop);
    EndFunc ;==>MAG

    [/autoit]

    das der Cursor dort auch angezeigt wird? Danke für eure Hilfe.

    Gruß pastl

  • [autoit]

    ; ScreenCapture.au3
    Local $aCursor = _WinAPI_GetCursorInfo()
    If $aCursor[1] Then
    Local $hIcon = _WinAPI_CopyIcon($aCursor[2])
    Local $aIcon = _WinAPI_GetIconInfo($hIcon)
    _WinAPI_DeleteObject($aIcon[4]) ; delete bitmap mask return by _WinAPI_GetIconInfo()
    _WinAPI_DrawIcon($hCDC, $aCursor[3] - $aIcon[2] - $iLeft, $aCursor[4] - $aIcon[3] - $iTop, $hIcon)
    _WinAPI_DestroyIcon($hIcon)
    EndIf

    [/autoit]
  • Um das mal auszuführen^^
    die Angabe von CAPTUREBLT (zusammen mit SRCCOPY) ist beim blitten zuständig für "gelayerte" Fenster(inhalte).
    Der Mauscursor ist auch so ein "gelayertes" Fenster, allerdings wird er beim blitten vom System "ausgeschaltet" und ist daher nicht sichtbar.

    Man muss nun "zu Fuß" den Mousecursor in ein Icon verwandeln (s. SeuBo´s Post)
    Mit den Daten (Position, Höhe, Breite) des Mousecursors muss man nun einen weiteren HDC_MAUSHINTERGRUND erstellen, in den man den aktuellen "Hintergrund" (also vom HDC) des Mousecursors blittet.
    Dann DrawIcon() des Mouscursors in HDC.
    HDC Blitten (zusammen mit dem nun im HDC befindlichen Mousecursor)
    HDC_MAUSHINTERGRUND in HDC blitten ("löscht" den Mousecursor wieder vom HDC)

  • Hallo Andi und SeuBo,


    ersteinmal danke für eure Antworten, leider stehe ich aber dennoch auf dem Schlauch. Hoffe ihr könntmir das noch etwas leihenhafter erklären.

    Ich werde jetzt nicht das ganze Script posten, da es momentan kanpp 2000 Zeilen hat und teils sehr unübersichtlich ist. Nur schnell so viel erklärt. Es gibt ein GUI(siehe Bild) mit der Grafik und ein Child-GUI(grün) mit der Lupe.

    Child GUI:

    [autoit]

    Global $GUI = GUICreate("", 80, 80, 346, 378, $WS_POPUP, $WS_EX_MDICHILD, $Auswertungsprogramm)

    [/autoit]

    Wäre aber auch schon zufrieden, wenn ich z. B. ein transparentes GIF oder PNG drüber legen kann(siehe kleines Bild).

  • Hi,
    hehe, klassischer Fall von Mißverständnis. SeuBo und ich meinten den Mauscursor...

    Soll dein "Fadenkreuz" mit in die Childgui? Oder als "Cursor" (Mausersatz) in das Auswahlfenster?
    In beiden Fällen kannst du entweder das Fadenkreuz "neu" in den DC (Backbuffer) zeichnen (siehe PushTheButton), oder per _winapi_transparentblt() eine Bitmap mit dem Fadenkreuz (Hintergrundfarbe=transparent) in den DC blitten.
    Alternativ kannst du auch den Mauscursor mit deinem Fadenkreuz ersetzen

  • Hallo Andi,

    das Fadenkreuz habe ich als Cursor als auch als GIF/PNG. Mir ist jetzt egal, ob ich das GIF/PNG über das Child-GUI(wo die Vergrößerung angezeigt wird) lege oder ob mir der Cursor in der Vergrößerung des Child-GUI angezeigt wird. Ich muss mich mal mit der WinAPI und dem blitten mehr beschäftigen, da ich jetzt schon lange nichts mehr programmiert habe(besonders in AutoIt).

    Danke nochmal.

    Gruß Alex

  • Hi,
    dann folgendermassen:
    Erstelle einen Backbuffer, in diesen überträgst du deinen Hintergrund (also das vergrößerte Lupenbild) und anschliessend das Fadenkreuz als Bitmap. Den Backbuffer deshalb, damit das Fadenkreuz nicht flackert, sobald der Hintergrund verändert wird.
    Ob du jetzt per WinApi "blittest" (das oben in deinem Scriptschnipsel Stretchblt ist nur ein aufgebohrtes Bitblt) oder per GDI-Befehlen arbeitest, bleibt sich gleich.
    Den Backbuffer kannst du dir im Lupenbild sparen, wenn du die 3 Kreise und 2 Linien (also das Fadenkreuz) per GDI-Befehl direkt ins Fenster zeichnest, dann flackert auch nix.