Bei Hover - Rand einer GDI-Grafik ändern

  • Hi Community,

    ich möchte mit GDI ein Rechteck zeichnen, das wenn man mit der Maus darüberfährt, einen roten Rand bekommt.

    Normal:
    [Blockierte Grafik: http://johannes-log.spacequadrat.de/1.png]

    Hover:
    [Blockierte Grafik: http://johannes-log.spacequadrat.de/2.png]

    Da ich in GDI noch eine Null bin, wird mein folgender Quellcode vielleicht bei einigen "Augenkrebs" hervorrufen. Ich bitte dies zu entschuldigen :D

    Spoiler anzeigen
    [autoit]

    #include <GUICtrlSetOnHover_UDF.au3>
    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <StaticConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $GUIMain = GUICreate("Test", 570, 200)
    GUISetOnEvent(-3, "Quit")
    $hWnd = WinGetHandle("Test")
    $hDC = _WinAPI_GetWindowDC($hWnd)
    GUISetState()

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

    _GDIPlus_Startup()
    $DUMMY = GUICtrlCreateLabel("", 10, 10, 100, 100)
    GUICtrlSetBkColor(-1, -2)
    $hGraphic2 = _GDIPlus_GraphicsCreateFromHDC($hDC)
    _GDIPlus_BrushCreateSolid(0x000BB)
    _GDIPlus_GraphicsFillRect($hGraphic2, 10, 10, 100, 100)

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

    _GUICtrl_SetOnHover($DUMMY, "_Hover_Proc", "_Leave_Hover_Func")

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Hover_Proc($iCtrlID, $iParam)
    _GDIPlus_GraphicsClear($hGraphic2, 0xFF0000FF)
    EndFunc ;==>_Hover_Proc

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

    Func _Leave_Hover_Func($iCtrlID)

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

    _GDIPlus_GraphicsDispose($hGraphic2)

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

    EndFunc ;==>_Leave_Hover_Func

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

    Func Quit()
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>Quit

    [/autoit]

    3 Mal editiert, zuletzt von Jautois (11. Dezember 2009 um 14:47)

  • Du wirst wahrscheinlich deine Gründe habe, aber ich verwende GDI+ nur wenn es unbedingt sein muss (kenne mich da auch nicht besonders aus ;)).

    Spoiler anzeigen
    [autoit]

    #include <GUICtrlSetOnHover_UDF.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $GUIMain = GUICreate("Test", 570, 200)
    GUISetOnEvent(-3, "Quit")

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

    GUISetState()

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

    $Label1 = GUICtrlCreateLabel("", 10, 10, 100, 100)
    GUICtrlSetBkColor(-1, 0)
    $Label2 = GUICtrlCreateLabel("", 12, 12, 96, 96)
    GUICtrlSetBkColor(-1, 0)

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

    _GUICtrl_SetOnHover($Label1, "_Hover_Proc", "_Leave_Hover_Func")

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Hover_Proc($iCtrlID, $iParam)
    GUICtrlSetBkColor($Label1, 0xFF0000)
    EndFunc ;==>_Hover_Proc

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

    Func _Leave_Hover_Func($iCtrlID)
    GUICtrlSetBkColor($Label1, 0)
    EndFunc ;==>_Leave_Hover_Func

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

    Func Quit()
    Exit
    EndFunc ;==>Quit

    [/autoit]
  • Hier die GDI+ Version:

    Spoiler anzeigen
    [autoit]


    #include <GUICtrlSetOnHover.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode", 1)

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

    $GUIMain = GUICreate("Test", 200, 150)
    GUISetOnEvent(-3, "Quit")
    GUISetState()

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

    _GDIPlus_Startup()

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

    $DUMMY = GUICtrlCreateLabel("", 10, 10, 100, 100)
    GUICtrlSetBkColor(-1, -2)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUIMain)
    _GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFFF)
    $pen_size = 4
    $hPen1 = _GDIPlus_PenCreate(0xFFFF0000, $pen_size)
    $hPen2 = _GDIPlus_PenCreate(0xFF000000, $pen_size)

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

    _GDIPlus_GraphicsFillRect($hGraphic, 10, 10, 100, 100)

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

    _GUICtrl_SetOnHover($DUMMY, "_Hover_Proc", "_Leave_Hover_Func")

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

    While Sleep(50)
    WEnd

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

    Func _Hover_Proc($iCtrlID, $iParam)
    _GDIPlus_GraphicsDrawRect($hGraphic, 10 + $pen_size / 2, 10 + $pen_size / 2, 100 - $pen_size, 100 - $pen_size, $hPen1)
    EndFunc ;==>_Hover_Proc

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

    Func _Leave_Hover_Func($iCtrlID)
    _GDIPlus_GraphicsDrawRect($hGraphic, 10 + $pen_size / 2, 10 + $pen_size / 2, 100 - $pen_size, 100 - $pen_size, $hPen2)
    EndFunc ;==>_Leave_Hover_Func

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

    Func Quit()
    _GDIPlus_PenDispose($hPen1)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>Quit

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich muss das Thema nochmal hervorkramen, da ich ein ziemlich ähnliches Problem habe.

    Also ich erstelle mehrere Grafiken mit "GUICtrlCreateGraphic" und belege diese mit der Funktion "_GUICtrl_SetOnHover" aus der GUICtrlSetOnHover_UDF. Zudem wird der Hintergrund mit einer Farbe belegt und ein Kreis wird in die Grafik gezeichnet.

    [autoit]


    $Grafik = GUICtrlCreateGraphic(10,10, 65, 65)
    _GUICtrl_SetOnHover(-1, "_Hover_Proc", "_Leave_Hover_Func") ; $Grafik wird bei Hover die beiden Funktionen ausführen
    GUICtrlSetBkColor(-1,0x000000) ; Hintergrundfarbe der Grafik
    GUICtrlSetGraphic(-1, $GUI_GR_COLOR, Default, 0x0000ff) ; die Farbe für das nächste Zeichnen wird gesetzt
    GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, 7.5, 7.5, 50, 50) ; Der Kreis wird gezeichnet

    [/autoit]

    Nun soll bei einem "Hover" die $Grafik einfach einen roten Rand bekommen. Verlässt die Maus wieder die Grafik, so soll ausschließlich der rote Rand entfernt werden.

    Kurzes Script, mit dem ihr vielleicht eure Hilfe beginnen könnt:

    Spoiler anzeigen
    [autoit]


    #include <GUICtrlSetOnHover_UDF.au3> ; im ersten Post zu finden - http://www.autoit.de/index.php?page…5903#post125903
    #include <GUIConstantsEx.au3>

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

    Global $Gui = GUICreate("Hover", 200,200)
    $Grafik = GUICtrlCreateGraphic(10, 10, 65, 65)
    _GUICtrl_SetOnHover(-1, "_Hover_Proc", "_Leave_Hover_Func") ; $Grafik wird bei Hover die beiden Funktionen ausführen
    GUICtrlSetBkColor(-1, 0x000000) ; Hintergrundfarbe der Grafik
    GUICtrlSetGraphic(-1, $GUI_GR_COLOR, Default, 0x0000ff) ; die Farbe für das nächste Zeichnen wird gesetzt
    GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, 7.5, 7.5, 50, 50) ; Der Kreis wird gezeichnet
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _Hover_Proc($iCtrlID)

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

    EndFunc ;==>_Hover_Proc

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

    Func _Leave_Hover_Func($iCtrlID)

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

    EndFunc ;==>_Leave_Hover_Func

    [/autoit]

    Vielen Dank schonmal!