GDI+ Zeichen + Scrollen

  • Moin
    Also ich wolle, das was ich mit GDI+ auf ne Gui gezeichnet hab gerne Scrollen nur leider denke ich wird es für mich unmöglich sein, da ich die kentnisse dazu noch nicht hab. Deshalb hab ich Probiert mit GUIcrtlcreateGraphic() ein ctrl zu erstellen, auf welches ich dan zeichne, da dieses ja automatisch mitgescrollt wird. Nur, wenn ich einen Buffer auf dieses Handle erstelle und dann zeichne dieht alles etwas komisch aus und Funtioniert wohl auch nciht so richtig aber seht selbst hier mal mein bsp.

    Spoiler anzeigen
    [autoit]

    #Include <GDIPlus.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Haupt_GUI_Width = 200
    $Haupt_GUI_Height = 200
    Opt("GUIOnEventMode",1)
    $Win = GUICreate("GDI* Test",$Haupt_GUI_Width,$Haupt_GUI_Height)
    $hWin = WinGetHandle($Win)
    $Graphic = GUICtrlCreateGraphic(0,0,$Haupt_GUI_Width,$Haupt_GUI_Height)
    $hGraphic = GUICtrlGetHandle($Graphic)
    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL") ; Vertikales Scrollen
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL") ; Horizontales Scrollen

    [/autoit] [autoit][/autoit] [autoit]

    _GUIScrollBars_Init($Win)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent(-3,"_exit")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    #Region Create Graphic Obj
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGraphic)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region Buffer
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Haupt_GUI_Width, $Haupt_GUI_Height, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawString($hBuffer, "Ich bin ein String", 50, 50)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height)
    Sleep(2000)
    _GDIPlus_GraphicsDrawString($hGraphics, "Ich bin ein String", 80, 80)
    Sleep(2000)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height) ;;=> Buffer Funktioniert dann ledier auch nicht mehr

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg(0x000F, "MY_PAINT");=>Redraw

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func MY_PAINT($hWnd, $msg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height)
    ;_WinAPI_RedrawWindow($hWin, "", "", BitOR($RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_FRAME))
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>MY_PAINT

    [/autoit] [autoit][/autoit] [autoit]

    ; Horizontales Scrollen
    Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $index = -1, $xChar, $xPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $xChar = $aSB_WindowInfo[$index][2]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der horizontalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $xPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die x-Position für einen späteren Vergleich
    $Pos = $xPos
    #forceref $Min, $Max
    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_LINELEFT ; Der Anwender klickte auf den linken Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINERIGHT ; Der Anwender klickte auf den rechten Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGELEFT ; Der Anwender klickte links neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGERIGHT ; Der Anwender klickte rechts neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    ; // Falls sich die x-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")
    If ($Pos <> $xPos) Then _GUIScrollBars_ScrollWindow($hWnd, $xChar * ($xPos - $Pos), 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_HSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    ; Vertikales Scrollen
    Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $yChar = $aSB_WindowInfo[$index][3]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der vertikalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die y-Position für einen späteren Vergleich
    $Pos = $yPos

    [/autoit] [autoit][/autoit] [autoit]

    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_TOP ; Der Anwender klickte auf die "Pos1"-Taste
    DllStructSetData($tSCROLLINFO, "nPos", $Min)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_BOTTOM ; Der Anwender klickte auf die "Ende"-Taste
    DllStructSetData($tSCROLLINFO, "nPos", $Max)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEUP ; Der Anwender klickte auf den oberen Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEDOWN ; Der Anwender klickte auf den unteren Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEUP ; Der Anwender klickte oberhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEDOWN ; Der Anwender klickte unterhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    ; // Falls sich die y-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")
    If ($Pos <> $yPos) Then
    _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
    $yPos = $Pos
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $GUI_RUNDEFMSG

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>WM_VSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (8. Juni 2010 um 23:45)

  • Das ist eher Jobbörse und pushen ist denke ich noch nicht nötig.
    Die wenigsten schreiben das mal eben schnell.

    mfg Ubuntu

  • Versteh ich nicht ganz?? Wiso soll das hier was für die Jobbörse sein? Ich sagte doch nicht, dass mir das einer machen soll sondern ich habs Probiert und bin auch hindernisse gestoßen und frage jetzt nach hilfe.
    Deinen Letzten Satzt versteh ich nicht. Wer schreibt was mal eben schnell? und wenn es so leicht wäre, was du denke ich mal mit dem Satzt ausdrücken willst, dann hätte hier schon jemand ne Sachliche Antwort geben können. Und das *PUSH* war nur, damit der thread nicht der Neuesten Beuträgeliste runterhupft, denn sost würde warscheinlich nie jemand Antworten.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Für mich hast du nur in deinem Code keine Frage gestellt sondern nur gesagt das dus auf grund mangelnder Kentnisse nicht kannst.
    Das legt nahe das du willst das es jemand macht ihne das du dafür Kentnisse haben musst.
    entschuldige wenn ich dich falsch verstanden habe aber ich verstehe nicht was du willst wenn du nicht willst das jemand den Script für dich schreibt.

    mfg Ubuntu

  • naja war vllt falsch ausgedrückt. Anhnung hab ich ja schon etwas nur ich frag ich ersten warum mein Script oben nicht so funz wie es soll und ob jemand nen Anstubser hat wie ich das am besten zum Scrollen bring

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • So hab was hinbekommen mit 2 Buffern einer Für den BG und einer für den Rest. hab das wichtigste kommentiert nur leider klar flacker es, da immer der bg buffer zuerst gezicnet wird und dann der rest. Einer ne IDee wich ich das umgehen könnte.

    Spoiler anzeigen
    [autoit]

    #Include <GDIPlus.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Haupt_GUI_Width = 300
    $Haupt_GUI_Height = 300
    Opt("GUIOnEventMode",1)
    $Win = GUICreate("GDI* Test",$Haupt_GUI_Width,$Haupt_GUI_Height)
    $GUI_handle = WinGetHandle($Win)
    ;$Graphic = GUICtrlCreateGraphic(0,0,$Haupt_GUI_Width,$Haupt_GUI_Height)
    ;$hGraphic = GUICtrlGetHandle($Graphic)
    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL") ; Vertikales Scrollen
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL") ; Horizontales Scrollen

    [/autoit] [autoit][/autoit] [autoit]

    _GUIScrollBars_Init($Win)
    GUISetOnEvent(-3,"_exit")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Global $yyPos = 0
    Global $xxPos = 0
    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    #Region Create Graphic Obj
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($GUI_handle)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region Buffer
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Haupt_GUI_Width, $Haupt_GUI_Height, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap);;=>Buffer für den rest

    [/autoit] [autoit][/autoit] [autoit]

    $hBitmap_BG_Buffer = _GDIPlus_BitmapCreateFromGraphics($Haupt_GUI_Width, $Haupt_GUI_Height, $hGraphics)
    $hBuffer_BG = _GDIPlus_ImageGetGraphicsContext($hBitmap_BG_Buffer);;=> Hintergrund Buffer
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    $hBack_Pic = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "/Bilder/hintergrund.bmp")

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImageRect($hBuffer_BG,$hBack_Pic, 0, 0, $Haupt_GUI_Width,$Haupt_GUI_Height);;=>In den Buffer Zeichen
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;=> BG Buffer selber auf Graphicobj Zeichnen

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsFillRect($hBuffer, 50, 50, 100, 100) ;=>In den Buffer Zeichen
    Sleep(200)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;=> Buffer selber über BG Buffer zeichnen
    Sleep(2000)
    _GDIPlus_GraphicsDrawRect($hGraphics, 140, 140, 100, 100);=>Direkt auf Graphicobj Zeichnen
    Sleep(2000)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height) ;;=> BG Buffer Refresh
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;=> Buffer Refresh

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg(0x000F, "MY_PAINT");=>Redraw

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func MY_PAINT($hWnd, $msg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $yyPos, $xxPos, $Haupt_GUI_Width, $Haupt_GUI_Height, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height)
    _WinAPI_RedrawWindow($GUI_handle, "", "", BitOR($RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_FRAME))
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>MY_PAINT

    [/autoit] [autoit][/autoit] [autoit]

    ; Horizontales Scrollen
    Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $index = -1, $xChar, $xPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $xChar = $aSB_WindowInfo[$index][2]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der horizontalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $xPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die x-Position für einen späteren Vergleich
    $Pos = $xPos
    #forceref $Min, $Max
    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_LINELEFT ; Der Anwender klickte auf den linken Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINERIGHT ; Der Anwender klickte auf den rechten Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGELEFT ; Der Anwender klickte links neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGERIGHT ; Der Anwender klickte rechts neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    ; // Falls sich die x-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    $xxPos = DllStructGetData($tSCROLLINFO, "nPos")
    If ($xxPos <> $xPos) Then
    ;_GUIScrollBars_ScrollWindow($hWnd, $xChar * ($xPos - $Pos), 0)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;= BG Buffer soll an der setelle bleiben
    _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $xxPos, $yyPos, $Haupt_GUI_Width, $Haupt_GUI_Height, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;=>Draw Buffer new pos
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_HSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    ; Vertikales Scrollen
    Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $yChar = $aSB_WindowInfo[$index][3]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der vertikalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die y-Position für einen späteren Vergleich
    $Pos = $yPos

    [/autoit] [autoit][/autoit] [autoit]

    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_TOP ; Der Anwender klickte auf die "Pos1"-Taste
    DllStructSetData($tSCROLLINFO, "nPos", $Min)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_BOTTOM ; Der Anwender klickte auf die "Ende"-Taste
    DllStructSetData($tSCROLLINFO, "nPos", $Max)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEUP ; Der Anwender klickte auf den oberen Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEDOWN ; Der Anwender klickte auf den unteren Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEUP ; Der Anwender klickte oberhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEDOWN ; Der Anwender klickte unterhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    ; // Falls sich die y-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    $yyPos = DllStructGetData($tSCROLLINFO, "nPos")
    If ($yyPos <> $yPos) Then
    ;_GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;= BG Buffer soll an der setelle bleiben
    _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $xxPos,$yyPos, $Haupt_GUI_Width, $Haupt_GUI_Height, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height) ;;=>Draw Buffer new pos
    $yPos = $Pos
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $GUI_RUNDEFMSG

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>WM_VSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit]

    EDIT hier noch das bild. Musste es leder extern hochladen war zu groß und deshalb ist es auch ein JPG und kein BMP

    EDIT EDIT: Ich könnte natürlich das ganze mit einem Buffer machen und den hintergrund so groß erstellen, wie die gui nacher scrollbar sein soll und dieser dann mitscrollt aber, wie mach ich es, wenn dieser bleiben soll wie er ist?
    Ich vermerke ein reges Desinteresse an diesem Thread :D

    http://www.directupload.net

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    2 Mal editiert, zuletzt von Darter (7. Juni 2010 um 19:15)

  • Hier meine Version!

    Spoiler anzeigen
    [autoit]


    #Include <GDIPlus.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $xPos = 0, $yPos = 0
    $Haupt_GUI_Width = 200
    $Haupt_GUI_Height = 200
    Opt("GUIOnEventMode",1)
    $Win = GUICreate("GDI* Test",$Haupt_GUI_Width,$Haupt_GUI_Height)
    $hWin = WinGetHandle($Win)
    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL") ; Vertikales Scrollen
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL") ; Horizontales Scrollen

    [/autoit] [autoit][/autoit] [autoit]

    _GUIScrollBars_Init($Win)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent(-3,"_exit")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    #Region Create Graphic Obj
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($Win)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    $back = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Back.jpg")
    $iX = _GDIPlus_ImageGetWidth($back)
    $iY = _GDIPlus_ImageGetHeight($back)

    [/autoit] [autoit][/autoit] [autoit]

    #Region Buffer
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iX, $iY, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImage($hGraphics, $back, 0, 0)
    _GDIPlus_GraphicsDrawString($hGraphics, "Ich bin ein String", 50, 80)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func MY_PAINT($x, $y)
    _GDIPlus_GraphicsDrawImage($hBuffer, $back, $x, $y) ;-> nur der Font scrollt
    ;~ _GDIPlus_GraphicsDrawImage($hBuffer, $back, -$x, -$y) ;-> Bild und Font scrollt, wobei Bild schneller scrollt
    ;~ _GDIPlus_GraphicsDrawImage($hBuffer, $back, 0, 0) ;-> Bild und Font scrollt
    _GDIPlus_GraphicsDrawString($hBuffer, "Ich bin ein String", 50, 80)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, -$x, -$y, $iX, $iY)
    EndFunc ;==>MY_PAINT

    [/autoit] [autoit][/autoit] [autoit]

    ; Horizontales Scrollen
    Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $index = -1, $xChar
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $xChar = $aSB_WindowInfo[$index][2]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der horizontalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $xPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die x-Position für einen späteren Vergleich
    $Pos = $xPos
    #forceref $Min, $Max
    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_LINELEFT ; Der Anwender klickte auf den linken Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
    MY_PAINT($Pos - 1, $yPos)
    Case $SB_LINERIGHT ; Der Anwender klickte auf den rechten Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
    MY_PAINT($Pos + 1, $yPos)
    Case $SB_PAGELEFT ; Der Anwender klickte links neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
    MY_PAINT($Pos - $Page, $yPos)
    Case $SB_PAGERIGHT ; Der Anwender klickte rechts neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
    MY_PAINT($Pos + $Page, $yPos)
    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    MY_PAINT($TrackPos, $yPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    ; // Falls sich die x-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    ;~ $Pos = DllStructGetData($tSCROLLINFO, "nPos")
    ;~ If ($Pos <> $xPos) Then _GUIScrollBars_ScrollWindow($hWnd, $xChar * ($xPos - $Pos), 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_HSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    ; Vertikales Scrollen
    Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $yChar = $aSB_WindowInfo[$index][3]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der vertikalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die y-Position für einen späteren Vergleich
    $Pos = $yPos

    [/autoit] [autoit][/autoit] [autoit]

    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_LINEUP ; Der Anwender klickte auf den oberen Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
    MY_PAINT($xPos, $Pos - 1)
    Case $SB_LINEDOWN ; Der Anwender klickte auf den unteren Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
    MY_PAINT($xPos, $Pos + 1)
    Case $SB_PAGEUP ; Der Anwender klickte oberhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
    MY_PAINT($xPos, $Pos - $Page)
    Case $SB_PAGEDOWN ; Der Anwender klickte unterhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
    MY_PAINT($xPos, $Pos + $Page)
    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    MY_PAINT($xPos, $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    ; // Falls sich die y-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    ;~ $Pos = DllStructGetData($tSCROLLINFO, "nPos")
    ;~ If ($Pos <> $yPos) Then
    ;~ _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
    ;~ $yPos = $Pos
    ;~ EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_VSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _GDIPlus_BitmapDispose($back)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (7. Juni 2010 um 22:00)

  • Das ist schon mal seht geil danke. Nur ich verwende Labels mit denen ich überprüfen kann ob die maus drüber ist. Dieses sollte ja dann auch mitscrollen und auch jedes mal alles Strings usw.(bei mir jede menge) wider in den Buffer ziechenen? geht das nicht einfacher? Deshalb hatte ich mir ja den 2 buffer gemacht

    EDIT: name22 finde ich nicht schlecht hab ich mir eben erst angekuckt ich werds auf jeden fall auch noch auf dem weg Probieren.

    Spoiler anzeigen
    [autoit]

    #Include <GDIPlus.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $xPos = 0, $yPos = 0
    Global $Haupt_GUI_Width = 630
    Global $Haupt_GUI_Height = 510

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode",1)
    $Win = GUICreate("GDI* Test",$Haupt_GUI_Width,$Haupt_GUI_Height)
    $GUI_handle = WinGetHandle($Win)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL") ; Vertikales Scrollen
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL") ; Horizontales Scrollen

    [/autoit] [autoit][/autoit] [autoit]

    _GUIScrollBars_Init($Win)
    _GUIScrollBars_SetScrollInfoMax($GUI_handle, $SB_HORZ, 80)
    _GUIScrollBars_SetScrollInfoMax($GUI_handle, $SB_VERT, 200)
    $label = GUICtrlCreateLabel("",200,200,50,50)
    GUICtrlSetState(-1,$GUI_DISABLE)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent(-3,"_exit")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    #Region Create Graphic Obj
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($GUI_handle)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region load bg picture
    Global $hBack_Pic = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "/Bilder/hintergrund2.bmp")
    $iX = _GDIPlus_ImageGetWidth($hBack_Pic)
    $iY = _GDIPlus_ImageGetHeight($hBack_Pic)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region Buffer
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iX, $iY, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    ;$hBitmap_BG_Buffer = _GDIPlus_BitmapCreateFromGraphics($Haupt_GUI_Width, $Haupt_GUI_Height, $hGraphics)
    ;$hBuffer_BG = _GDIPlus_ImageGetGraphicsContext($hBitmap_BG_Buffer);;=> Hintergrund Buffer
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImage($hBuffer, $hBack_Pic, 0, 0)
    _GDIPlus_GraphicsDrawString($hBuffer, "Ich bin ein String", 50, 80)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    Sleep(2000)
    _GDIPlus_GraphicsDrawString($hGraphics, "Ich bin ein String", 50, 180)
    Sleep(2000)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #cs
    _GDIPlus_GraphicsDrawImageRect($hBuffer_BG,$hBack_Pic, 0, 0, $Haupt_GUI_Width,$Haupt_GUI_Height);;=>In den Buffer Zeichen
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;=> BG Buffer selber auf Graphicobj Zeichnen

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsFillRect($hBuffer, 50, 50, 100, 100) ;=>In den Buffer Zeichen
    Sleep(200)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;=> Buffer selber über BG Buffer zeichnen
    Sleep(2000)
    _GDIPlus_GraphicsDrawRect($hGraphics, 140, 140, 100, 100);=>Direkt auf Graphicobj Zeichnen
    Sleep(2000)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height) ;;=> BG Buffer Refresh
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;=> Buffer Refresh
    #ce
    ;GUIRegisterMsg(0x000F, "MY_PAINT");=>Redraw
    $onetimehover = 0
    While 1
    $mouse = GUIGetCursorInfo ($GUI_handle)
    If $Label <> $mouse[4] And $onetimehover = 1 Then
    ;MsgBox(0,"","")
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height)
    ;_WinAPI_RedrawWindow($hHaupt_GUI_Handle, "", "", BitOR($RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_FRAME))
    $onetimehover = 0
    EndIf
    ;ToolTip($mouse[4] & " " & $hoverctrlid )
    If $mouse[4] = $Label Then
    $hBrush_hover = _GDIPlus_BrushCreateSolid("0x" & Hex(10170230230))
    _GDIPlus_GraphicsFillRect($hGraphics, 200, 200, 50, 50,$hBrush_hover)
    $onetimehover = 1
    EndIf

    Sleep(10)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    Func MY_PAINT2($hWnd, $msg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $yyPos, $xxPos, $Haupt_GUI_Width, $Haupt_GUI_Height, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height)
    _WinAPI_RedrawWindow($GUI_handle, "", "", BitOR($RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_FRAME))

    Return "GUI_RUNDEFMSG"
    EndFunc ;==>MY_PAINT
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    Func MY_PAINT($x, $y)
    _GDIPlus_GraphicsDrawImage($hBuffer, $hBack_Pic, $x, $y) ;-> nur der Font scrollt
    ;_GDIPlus_GraphicsDrawImage($hBuffer, $back, -$x, -$y) ;-> Bild und Font scrollt, wobei Bild schneller scrollt
    ;_GDIPlus_GraphicsDrawImage($hBuffer, $back, 0, 0) ;-> Bild und Font scrollt
    _GDIPlus_GraphicsDrawString($hBuffer, "Ich bin ein String", 50, 80)
    ;_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, -$x, -$y, $iX, $iY)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, -$x, -$y, $Haupt_GUI_Width, $Haupt_GUI_Height)
    GUICtrlSetPos($Label,200,200)
    EndFunc ;==>MY_PAINT

    [/autoit] [autoit][/autoit] [autoit]

    ; Horizontales Scrollen
    Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $index = -1, $xChar, $xPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $xChar = $aSB_WindowInfo[$index][2]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der horizontalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $xPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die x-Position für einen späteren Vergleich
    $Pos = $xPos
    DllStructsetData($tSCROLLINFO, "nMax",100000)
    #forceref $Min, $Max
    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_LINELEFT ; Der Anwender klickte auf den linken Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
    MY_PAINT($Pos - 1, $yPos)
    Case $SB_LINERIGHT ; Der Anwender klickte auf den rechten Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
    MY_PAINT($Pos + 1, $yPos)
    Case $SB_PAGELEFT ; Der Anwender klickte links neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
    MY_PAINT($Pos - $Page, $yPos)
    Case $SB_PAGERIGHT ; Der Anwender klickte rechts neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
    MY_PAINT($Pos + $Page, $yPos)
    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    MY_PAINT($TrackPos, $yPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)

    _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)

    ; // Falls sich die x-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    ;$xxPos = DllStructGetData($tSCROLLINFO, "nPos")
    ;If ($xxPos <> $xPos) Then
    ;_GUIScrollBars_ScrollWindow($hWnd, $xChar * ($xPos - $Pos), 0)
    ;_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;= BG Buffer soll an der setelle bleiben
    ;_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $xxPos, $yyPos, $Haupt_GUI_Width, $Haupt_GUI_Height, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;=>Draw Buffer new pos
    ;EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_HSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    ; Vertikales Scrollen
    Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $yChar = $aSB_WindowInfo[$index][3]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der vertikalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die y-Position für einen späteren Vergleich
    $Pos = $yPos

    [/autoit] [autoit][/autoit] [autoit]

    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_LINEUP ; Der Anwender klickte auf den oberen Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
    MY_PAINT($xPos, $Pos - 1)
    Case $SB_LINEDOWN ; Der Anwender klickte auf den unteren Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
    MY_PAINT($xPos, $Pos + 1)
    Case $SB_PAGEUP ; Der Anwender klickte oberhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
    MY_PAINT($xPos, $Pos - $Page)
    Case $SB_PAGEDOWN ; Der Anwender klickte unterhalb des Scrollbalkens
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
    MY_PAINT($xPos, $Pos + $Page)
    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    MY_PAINT($xPos, $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    ; // Falls sich die y-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    ; $yyPos = DllStructGetData($tSCROLLINFO, "nPos")
    ;If ($yyPos <> $yPos) Then
    ; ;_GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
    ; _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap_BG_Buffer, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height);;= BG Buffer soll an der setelle bleiben
    ; _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, $xxPos,$yyPos, $Haupt_GUI_Width, $Haupt_GUI_Height, 0, 0, $Haupt_GUI_Width, $Haupt_GUI_Height) ;;=>Draw Buffer new pos
    ; $yPos = $Pos
    ;EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $GUI_RUNDEFMSG

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>WM_VSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (7. Juni 2010 um 23:36)

  • So ich habs jetzt auch noch nach der methode von name33 Probiert und ich habs jetzt erstmal soweit, dass wenn man pfeiltaste nach oben und unten benutzt der Vordergrund Scrollt.
    Außerdem hab ich eine hiver Funktion aus dem Englischen Forum mit drinne, sodas ich feststellen kann ob die maus über einem ctrl ist und eben wie in meinem bsp watt zeichnen^^. Funktioniert soweit auch nur ich hab alles Probiert mit den ctrls immer wenn die neue Position den ctrls gesetzt wird flackert das ding weiß durch und ich hab keine anhnung warum hat wer ne Idee.

    Spoiler anzeigen
    [autoit]

    #Include <GDIPlus.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <GUICtrlOnHover.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{UP}","up")
    HotKeySet("{DOWN}","down")

    [/autoit] [autoit][/autoit] [autoit]

    Global $GUI_Widh = 500
    Global $GUI_Height = 500
    Global $iYpos = 0
    Global $GUI, $hGUI, $Lab ;=>GUI Var
    Global $hGraphics, $hBitmap, $hBuffer, $hBack_Pic, $FR_Brush, $FR_Brush_H ;=>GDI+ Var
    Global $u = 1
    Opt("GUIOnEventMode",1)
    $GUI = GUICreate("Formel 1", $GUI_Widh, $GUI_Height)
    $hGUI = WinGetHandle($GUI)
    Global $aLab[2] =[200,200]
    $Lab = GUICtrlCreateLabel("",$aLab[0],$aLab[1],100,100)
    _GUICtrl_OnHoverRegister($Lab, "hover","leave")
    GUISetOnEvent(-3,"_exit")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Draw()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Draw()
    _GDIPlus_Startup()
    #Region Create Graphic Obj
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    #EndRegion

    #Region Buffer
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($GUI_Widh, $GUI_Height, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    #EndRegion

    #Region load bg picture
    $hBack_Pic = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "/Bilder/hintergrund2.bmp")
    #EndRegion

    #Region Create Pen/brush
    $FR_Brush = _GDIPlus_BrushCreateSolid("0x" & Hex(10170230230))
    $FR_Brush_H = _GDIPlus_BrushCreateSolid("0x" & Hex(25170240130))
    #EndRegion

    #Region Draw in Kontext
    _GDIPlus_GraphicsDrawImage($hBuffer, $hBack_Pic, 0, $iYpos)
    _GDIPlus_GraphicsFillRect($hBuffer,200,200+$iYpos,100,100,$FR_Brush)
    #EndRegion

    #Region Draw Kontext on Graphic
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    #EndRegion
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func up()
    $iYpos +=5
    redraw()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func down()
    $iYpos -=5
    redraw()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func redraw()
    #Region Draw in Kontext
    _GDIPlus_GraphicsDrawImage($hBuffer, $hBack_Pic, 0, 0)
    _GDIPlus_GraphicsFillRect($hBuffer,200,200+$iYpos,100,100,$FR_Brush)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region ctrl Set
    ;__GUICtrl_SOH_ReleaseResources()
    ;GUICtrlDelete($Lab)
    GUICtrlSetPos($Lab,$aLab[0],$aLab[1]+$iYpos)
    ;GUICtrlSetState($Lab,$GUI_DISABLE)
    ;_GUICtrl_OnHoverRegister($Lab, "hover","leave")
    #EndRegion

    #Region Draw Kontext on Graphic
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    #EndRegion
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func hover($nix)
    $u +=1
    ConsoleWrite("hover " & $u & @crlf)
    _GDIPlus_GraphicsFillRect($hGraphics,$aLab[0],$aLab[1]+$iYpos,100,100,$FR_Brush_H)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func leave()
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit]
  • Ok da ich immer noch keine Antwort erhalten habe, hab ich mich drangesetzt und versucht ne Funktion/Funktionen zu schreiben, welche man nur einmal Registriert und es dann immer Prüft ob die Maus drüber ist. Außerdem sollte man die Position neu setzten können(wir beim scollen benötigt).
    EDIT: Vorschläge zur Verbesserung oder auch ganz anderee Ansätze sind natürlich erwünscht


    Die Funktion
    [autoit]

    Func GUI_Register_Set_Pos($index, $iX, $iY, $Widh = -1, $Height = -1)
    Local $aold_Hover_pos_Infos = StringSplit($aGUI_Register_Hover_Info[$index], "|")
    If $Widh = -1 and $Height <> -1 Then $aGUI_Register_Hover_Info[$index] = $aold_Hover_pos_Infos[1] & "|" & $aold_Hover_pos_Infos[2] & "|" & $iX & "|" & $iY & "|" & $aold_Hover_pos_Infos[5] & "|" & $Height & "|" & $aold_Hover_pos_Infos[7] & "|" & $aold_Hover_pos_Infos[8]
    If $Widh <> -1 and $Height = -1 Then $aGUI_Register_Hover_Info[$index] = $aold_Hover_pos_Infos[1] & "|" & $aold_Hover_pos_Infos[2] & "|" & $iX & "|" & $iY & "|" & $Widh & "|" & $aold_Hover_pos_Infos[6] & "|" & $aold_Hover_pos_Infos[7] & "|" & $aold_Hover_pos_Infos[8]
    If $Widh = -1 and $Height = -1 Then $aGUI_Register_Hover_Info[$index] = $aold_Hover_pos_Infos[1] & "|" & $aold_Hover_pos_Infos[2] & "|" & $iX & "|" & $iY & "|" & $aold_Hover_pos_Infos[5] & "|" & $aold_Hover_pos_Infos[6] & "|" & $aold_Hover_pos_Infos[7] & "|" & $aold_Hover_pos_Infos[8]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GUI_Register_Hover($hWin,$iX,$iY,$Widh,$Height,$HoverFunc, $LeaveFunc = -1)
    If Not IsDeclared("anz") Then
    Global $aGUI_Register_Hover_Info[1]
    Global $anz = 1
    Global $Hover_one = 0
    $aGUI_Register_Hover_Info[0] = 0 & "|" & 0 & "|" & 0 & "|" & 0 & "|" & 0 & "|" & 0 & "|" & 0 & "|" & 0
    EndIf
    If $anz <> 1 Then $anz += 1
    ;$aGUI_Register_Hover_Info[0] = UBound($aGUI_Register_Hover_Info)
    _ArrayAdd($aGUI_Register_Hover_Info,$hWin & "|" & $anz & "|" & $iX & "|" & $iY & "|" & $Widh & "|" & $Height & "|" & $HoverFunc & "|" & $LeaveFunc)
    ;_ArrayDisplay($aGUI_Register_Hover_Info)
    If $anz = 1 Then
    AdlibRegister("GUI_Register_Hover_check",10)
    EndIf
    Return $anz
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GUI_Register_Hover_check()
    Local $aGUI_Register_Hover_Infos = StringSplit($aGUI_Register_Hover_Info[1],"|")
    ;_ArrayDisplay($aGUI_Register_Hover_Infos)
    Local $aWinInfo = WinGetPos(HWnd($aGUI_Register_Hover_Infos[1]))
    Local $aMouseinfo = MouseGetPos()
    If $aMouseinfo[0] > $aWinInfo[0] And $aMouseinfo[0] < $aWinInfo[0]+$aWinInfo[2] And $aMouseinfo[1] > $aWinInfo[1] And $aMouseinfo[1] < $aWinInfo[1]+$aWinInfo[3] Then
    For $i = 1 To UBound($aGUI_Register_Hover_Info)-1
    $aGUI_Register_Hover_Infos = StringSplit($aGUI_Register_Hover_Info[$i],"|")
    ;_ArrayDisplay($aGUI_Register_Hover_Infos)
    $aMouseinfo2 = GUIGetCursorInfo (HWnd($aGUI_Register_Hover_Infos[1]))
    ;ConsoleWrite($aMouseinfo2[0] & "x" & $aMouseinfo2[1] & "|" & $aGUI_Register_Hover_Infos[3] & "x" & $aGUI_Register_Hover_Infos[4] & " " & $aGUI_Register_Hover_Infos[5] & "x" & $aGUI_Register_Hover_Infos[6] & @CRLF)
    If $aMouseinfo2[0] > $aGUI_Register_Hover_Infos[3] And $aMouseinfo2[0] < $aGUI_Register_Hover_Infos[3]+$aGUI_Register_Hover_Infos[5] And $aMouseinfo2[1] > $aGUI_Register_Hover_Infos[4] And $aMouseinfo2[1] < $aGUI_Register_Hover_Infos[4]+$aGUI_Register_Hover_Infos[6] Then
    If $Hover_one <> $aGUI_Register_Hover_Infos[2] Then
    Call($aGUI_Register_Hover_Infos[7],$aGUI_Register_Hover_Infos[2])
    ;MsgBox(0,"","")
    $Hover_one = $aGUI_Register_Hover_Infos[2]
    ConsoleWrite("hover " & $aGUI_Register_Hover_Infos[2] & @CRLF)
    EndIf
    Else
    $aGUI_Register_Hover_Infoss = StringSplit($aGUI_Register_Hover_Info[$Hover_one],"|")
    ;_ArrayDisplay($aGUI_Register_Hover_Infoss)
    If $Hover_one = $aGUI_Register_Hover_Infoss[2] Then
    ;ConsoleWrite($aMouseinfo2[0] & "x" & $aMouseinfo2[1] & "|" & $aGUI_Register_Hover_Infoss[3] & "x" & $aGUI_Register_Hover_Infoss[4] & " " & $aGUI_Register_Hover_Infoss[5] & "x" & $aGUI_Register_Hover_Infoss[6] & @CRLF)
    If $aMouseinfo2[0] > $aGUI_Register_Hover_Infoss[3] And $aMouseinfo2[0] < $aGUI_Register_Hover_Infoss[3]+$aGUI_Register_Hover_Infoss[5] And $aMouseinfo2[1] > $aGUI_Register_Hover_Infoss[4] And $aMouseinfo2[1] < $aGUI_Register_Hover_Infoss[4]+$aGUI_Register_Hover_Infoss[6] Then

    Else
    $Hover_one = 0
    Call($aGUI_Register_Hover_Infoss[8])
    EndIf
    EndIf
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit]
    Beispiel
    [autoit]

    #Include <GDIPlus.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <MyHover.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{UP}","up")
    HotKeySet("{DOWN}","down")

    [/autoit] [autoit][/autoit] [autoit]

    Global $GUI_Widh = 500
    Global $GUI_Height = 500
    Global $iYpos = 0
    Global $GUI, $hGUI, $Lab ;=>GUI Var
    Global $hGraphics, $hBitmap, $hBuffer, $hBack_Pic, $FR_Brush, $FR_Brush_H ;=>GDI+ Var
    Global $u = 1
    Opt("GUIOnEventMode",1)
    $GUI = GUICreate("Formel 1", $GUI_Widh, $GUI_Height)
    $hGUI = WinGetHandle($GUI)
    Global $aLab[2] =[200,200]
    ;$Lab = GUICtrlCreateLabel("",$aLab[0],$aLab[1],100,100)
    ;_GUICtrl_OnHoverRegister($Lab, "hover","leave")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent(-3,"_exit")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Draw()
    GUI_Register_Hover($hGUI,200,200,100,100,"hover", "leave")
    GUI_Register_Hover($hGUI,400,400,100,100,"hover2", -1)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Draw()
    _GDIPlus_Startup()
    #Region Create Graphic Obj
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    #EndRegion

    #Region Buffer
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($GUI_Widh, $GUI_Height, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    #EndRegion

    #Region load bg picture
    $hBack_Pic = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "/Bilder/hintergrund2.bmp")
    #EndRegion

    #Region Create Pen/brush
    $FR_Brush = _GDIPlus_BrushCreateSolid("0x" & Hex(10170230230))
    $FR_Brush_H = _GDIPlus_BrushCreateSolid("0x" & Hex(25170240130))
    #EndRegion

    #Region Draw in Kontext
    _GDIPlus_GraphicsDrawImage($hBuffer, $hBack_Pic, 0, $iYpos)
    _GDIPlus_GraphicsFillRect($hBuffer,200,200+$iYpos,100,100,$FR_Brush)
    #EndRegion

    #Region Draw Kontext on Graphic
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    #EndRegion
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func up()
    $iYpos +=5
    redraw()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func down()
    $iYpos -=5
    redraw()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func redraw()
    #Region Draw in Kontext
    _GDIPlus_GraphicsDrawImage($hBuffer, $hBack_Pic, 0, 0)
    _GDIPlus_GraphicsFillRect($hBuffer,200,200+$iYpos,100,100,$FR_Brush)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region ctrl Set
    ;__GUICtrl_SOH_ReleaseResources()
    ;GUICtrlDelete($Lab)
    ;GUICtrlSetPos($Lab,$aLab[0],$aLab[1]+$iYpos)
    ;GUICtrlSetState($Lab,$GUI_DISABLE)
    ;_GUICtrl_OnHoverRegister($Lab, "hover","leave")
    GUI_Register_Set_Pos(1, $aLab[0], $aLab[1]+$iYpos)
    #EndRegion

    #Region Draw Kontext on Graphic
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    #EndRegion
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func hover($nix)
    ;$u +=1
    ;ConsoleWrite("hover " & $u & @crlf)
    _GDIPlus_GraphicsFillRect($hGraphics,$aLab[0],$aLab[1]+$iYpos,100,100,$FR_Brush_H)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func leave()
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    EndFunc
    Func _exit()
    _GDIPlus_BitmapDispose($hBack_Pic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (8. Juni 2010 um 22:13)

  • Könnte das bitte jemand testen und mir sagen ob bei euch auch wenn ich von dem zweiten direkt über das erste fahre, das zweite dann nicht zurückgesetzt wird bzw. es gemalt bleibt
    Wenn es einen interessiert und es test würde ich mich über eine Antwort freuen, wich sich das beheben lässt.

    EDIT: Da der Thread eh völlig Ignoriert wird und ich es selbst gelösz habe kann man Closen


    Funktion
    [autoit]

    Func GUI_Register_Set_Pos($index, $iX, $iY, $Widh = -1, $Height = -1)
    Local $aold_Hover_pos_Infos = StringSplit($aGUI_Register_Hover_Info[$index], "|")
    If $Widh = -1 and $Height <> -1 Then $aGUI_Register_Hover_Info[$index] = $aold_Hover_pos_Infos[1] & "|" & $aold_Hover_pos_Infos[2] & "|" & $iX & "|" & $iY & "|" & $aold_Hover_pos_Infos[5] & "|" & $Height & "|" & $aold_Hover_pos_Infos[7] & "|" & $aold_Hover_pos_Infos[8]
    If $Widh <> -1 and $Height = -1 Then $aGUI_Register_Hover_Info[$index] = $aold_Hover_pos_Infos[1] & "|" & $aold_Hover_pos_Infos[2] & "|" & $iX & "|" & $iY & "|" & $Widh & "|" & $aold_Hover_pos_Infos[6] & "|" & $aold_Hover_pos_Infos[7] & "|" & $aold_Hover_pos_Infos[8]
    If $Widh = -1 and $Height = -1 Then $aGUI_Register_Hover_Info[$index] = $aold_Hover_pos_Infos[1] & "|" & $aold_Hover_pos_Infos[2] & "|" & $iX & "|" & $iY & "|" & $aold_Hover_pos_Infos[5] & "|" & $aold_Hover_pos_Infos[6] & "|" & $aold_Hover_pos_Infos[7] & "|" & $aold_Hover_pos_Infos[8]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GUI_Register_Hover($hWin,$iX,$iY,$Widh,$Height,$HoverFunc, $LeaveFunc = -1)
    If Not IsDeclared("anz") Then
    Global $aGUI_Register_Hover_Info[1]
    Global $anz = 0
    Global $Hover_one = 0
    Global $Leave_one = 0
    $aGUI_Register_Hover_Info[0] = 0 & "|" & 0 & "|" & 0 & "|" & 0 & "|" & 0 & "|" & 0 & "|" & 0 & "|" & 0
    EndIf
    $anz += 1
    ;$aGUI_Register_Hover_Info[0] = UBound($aGUI_Register_Hover_Info)
    _ArrayAdd($aGUI_Register_Hover_Info,$hWin & "|" & $anz & "|" & $iX & "|" & $iY & "|" & $Widh & "|" & $Height & "|" & $HoverFunc & "|" & $LeaveFunc)
    ;_ArrayDisplay($aGUI_Register_Hover_Info)
    If $anz = 1 Then
    AdlibRegister("GUI_Register_Hover_check",10)
    EndIf
    Return $anz
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GUI_Register_Hover_check()
    Local $aGUI_Register_Hover_Infos = StringSplit($aGUI_Register_Hover_Info[1],"|")
    ;_ArrayDisplay($aGUI_Register_Hover_Infos)
    Local $aWinInfo = WinGetPos(HWnd($aGUI_Register_Hover_Infos[1]))
    Local $aMouseinfo = MouseGetPos()
    If $aMouseinfo[0] > $aWinInfo[0] And $aMouseinfo[0] < $aWinInfo[0]+$aWinInfo[2] And $aMouseinfo[1] > $aWinInfo[1] And $aMouseinfo[1] < $aWinInfo[1]+$aWinInfo[3] Then
    For $i = 1 To UBound($aGUI_Register_Hover_Info)-1
    $aGUI_Register_Hover_Infos = StringSplit($aGUI_Register_Hover_Info[$i],"|")
    ;_ArrayDisplay($aGUI_Register_Hover_Infos)
    $aMouseinfo2 = GUIGetCursorInfo (HWnd($aGUI_Register_Hover_Infos[1]))
    ;ConsoleWrite($aMouseinfo2[0] & "x" & $aMouseinfo2[1] & "|" & $aGUI_Register_Hover_Infos[3] & "x" & $aGUI_Register_Hover_Infos[4] & " " & $aGUI_Register_Hover_Infos[5] & "x" & $aGUI_Register_Hover_Infos[6] & @CRLF)
    If $aMouseinfo2[0] > $aGUI_Register_Hover_Infos[3] And $aMouseinfo2[0] < $aGUI_Register_Hover_Infos[3]+$aGUI_Register_Hover_Infos[5] And $aMouseinfo2[1] > $aGUI_Register_Hover_Infos[4] And $aMouseinfo2[1] < $aGUI_Register_Hover_Infos[4]+$aGUI_Register_Hover_Infos[6] Then
    If $Hover_one <> $aGUI_Register_Hover_Infos[2] Then
    $Hover_one = $aGUI_Register_Hover_Infos[2]
    Call($aGUI_Register_Hover_Infos[7],$aGUI_Register_Hover_Infos[2])
    ;MsgBox(0,"","")
    ConsoleWrite("hover " & $aGUI_Register_Hover_Infos[2] & @CRLF)
    EndIf
    Else
    $aGUI_Register_Hover_Infoss = StringSplit($aGUI_Register_Hover_Info[$Hover_one],"|")
    ;_ArrayDisplay($aGUI_Register_Hover_Infoss)
    $aMouseinfo = MouseGetPos()
    If $Hover_one = $aGUI_Register_Hover_Infoss[2] Or $aGUI_Register_Hover_Infoss[2] = 0 Then
    ;ConsoleWrite($aMouseinfo2[0] & "x" & $aMouseinfo2[1] & "|" & $aGUI_Register_Hover_Infoss[3] & "x" & $aGUI_Register_Hover_Infoss[4] & " " & $aGUI_Register_Hover_Infoss[5] & "x" & $aGUI_Register_Hover_Infoss[6] & @CRLF)
    If $aMouseinfo2[0] > $aGUI_Register_Hover_Infoss[3] And $aMouseinfo2[0] < $aGUI_Register_Hover_Infoss[3]+$aGUI_Register_Hover_Infoss[5] And $aMouseinfo2[1] > $aGUI_Register_Hover_Infoss[4] And $aMouseinfo2[1] < $aGUI_Register_Hover_Infoss[4]+$aGUI_Register_Hover_Infoss[6] Then

    Else
    $Hover_one = 0
    $Leave_one = $aGUI_Register_Hover_Infoss[2]
    Call($aGUI_Register_Hover_Infoss[8])
    EndIf
    EndIf
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GUI_Reguster_Witch_Hovered()
    Return $Hover_one
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GUI_Reguster_Witch_Leave()
    Return $Leave_one
    EndFunc

    [/autoit]
    Beispiel
    [autoit]

    #Include <GDIPlus.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <MyHover.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{UP}","up")
    HotKeySet("{DOWN}","down")

    [/autoit] [autoit][/autoit] [autoit]

    Global $GUI_Widh = 500
    Global $GUI_Height = 500
    Global $iYpos = 0
    Global $GUI, $hGUI, $Lab ;=>GUI Var
    Global $hGraphics, $hBitmap, $hBuffer, $hBack_Pic, $FR_Brush, $FR_Brush_H ;=>GDI+ Var
    Global $u = 1
    Opt("GUIOnEventMode",1)
    $GUI = GUICreate("Formel 1", $GUI_Widh, $GUI_Height)
    $hGUI = WinGetHandle($GUI)
    Global $aLab[4] =[200,200,100,100]
    Global $aLab2[4] =[301,200,100,100]
    ;$Lab = GUICtrlCreateLabel("",$aLab[0],$aLab[1],100,100)
    ;_GUICtrl_OnHoverRegister($Lab, "hover","leave")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent(-3,"_exit")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Draw()
    GUI_Register_Hover($hGUI,$aLab[0],$aLab[1],$aLab[2],$aLab[3],"hover", "leave")
    GUI_Register_Hover($hGUI,$aLab2[0],$aLab2[1],$aLab2[2],$aLab2[3],"hover", "leave")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func MY_PAINT($hWnd, $msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($hGUI, "", "", BitOR($RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_FRAME))
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>MY_PAINT

    [/autoit] [autoit][/autoit] [autoit]

    Func Draw()
    _GDIPlus_Startup()
    #Region Create Graphic Obj
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    #EndRegion

    #Region Buffer
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($GUI_Widh, $GUI_Height, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    #EndRegion

    #Region load bg picture
    $hBack_Pic = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "/Bilder/hintergrund2.bmp")
    #EndRegion

    #Region Create Pen/brush
    $FR_Brush = _GDIPlus_BrushCreateSolid("0x" & Hex(10170230230))
    $FR_Brush_H = _GDIPlus_BrushCreateSolid("0x" & Hex(25170240130))
    #EndRegion

    #Region Draw in Kontext
    _GDIPlus_GraphicsDrawImage($hBuffer, $hBack_Pic, 0, $iYpos)
    _GDIPlus_GraphicsFillRect($hBuffer,$aLab[0],$aLab[1]+$iYpos,$aLab[2],$aLab[3],$FR_Brush)
    _GDIPlus_GraphicsFillRect($hBuffer,$aLab2[0],$aLab2[1]+$iYpos,$aLab2[2],$aLab2[3],$FR_Brush)
    #EndRegion

    #Region Draw Kontext on Graphic
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    #EndRegion
    GUIRegisterMsg(0x000F, "MY_PAINT");=>Redraw
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func up()
    $iYpos +=5
    redraw()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func down()
    $iYpos -=5
    redraw()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func redraw()
    #Region Draw in Kontext
    _GDIPlus_GraphicsDrawImage($hBuffer, $hBack_Pic, 0, 0)
    _GDIPlus_GraphicsFillRect($hBuffer,$aLab[0],$aLab[1]+$iYpos,$aLab[2],$aLab[3],$FR_Brush)
    _GDIPlus_GraphicsFillRect($hBuffer,$aLab2[0],$aLab2[1]+$iYpos,$aLab2[2],$aLab2[3],$FR_Brush)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region ctrl Set
    GUI_Register_Set_Pos(1, $aLab[0], $aLab[1]+$iYpos)
    GUI_Register_Set_Pos(2, $aLab2[0], $aLab2[1]+$iYpos)
    #EndRegion

    #Region Draw Kontext on Graphic
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    #EndRegion
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func hover($nix)
    Local $a = GUI_Reguster_Witch_Hovered()
    Switch $a
    Case 1
    _GDIPlus_GraphicsFillRect($hGraphics,$aLab[0],$aLab[1]+$iYpos,$aLab[2],$aLab[2],$FR_Brush_H)
    Case 2
    _GDIPlus_GraphicsFillRect($hGraphics,$aLab2[0],$aLab2[1]+$iYpos,$aLab2[2],$aLab2[3],$FR_Brush_H)
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func leave()
    Local $a = GUI_Reguster_Witch_Leave()
    Switch $a
    Case 1
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    Case 2
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _GDIPlus_BitmapDispose($hBack_Pic)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (8. Juni 2010 um 23:45)