Klick auf GDI+ Objekt überprüfen

  • Hey @ all,
    ich bin noch kein großer GDI+ Künstler^^. Meine Frage ist nun, wie ich überprüfen kann, ob der Benutzer z.B. auf

    Spoiler anzeigen
    [autoit]

    _GDIPlus_GraphicsDrawString($hGraphics, "klick mich!", 2, 2)

    [/autoit]

    geklickt hat.

    Ich krieg es einfach nicht hin :(
    Wie geht das?! ?(

    mfG Developer30

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

    Einmal editiert, zuletzt von Developer30 (12. September 2010 um 11:53)

  • Du musst die Mausposition abfragen und anschließend überprüfen, ob innerhalb des Feldes geklickt wurde.

    Dafür kann man. z.B. _WinAPI_GetMousePos() (oder die Version mit X bzw Y kombinieren) oder MouseGetPos() und noch einiges mehr nutzen.
    Dann musst du feststellen ob geklickt wurde. z.B. mit _IsPressed('01')
    Sobalt geklickt wurde überprüfst du die Position des Zeigers, und wenn er innerhalb des Feldes ist lässt du deine Funktion ausführen.

    //Edit: Kannst auch mal in meiner Sig schauen. Die GDI+ Buttons funktionieren mit dem Selben Prinzip. //

    mfg
    Mars(i)

  • Du musst mit GuiGetCursorInfo die Mauskoordinaten + einen Klick feststellen.
    Beispiel:

    Spoiler anzeigen
    [autoit]

    $Form1 = GUICreate("Form1", 500, 500, -1, -1)
    GUISetState(@SW_SHOW)

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

    While 1
    $mouse = GUIGetCursorInfo()
    If GUIGetMsg() = -3 Then Exit
    If $mouse[2] = 1 Then
    If $mouse[0] > 200 And $mouse[1] < 100 Then
    MsgBox(0, "Geklickt", "Du hast in der Region geklickt")
    EndIf
    EndIf
    Sleep(20)
    WEnd

    [/autoit]

    $mouse[0] ist die Maus-X-Koordinate, $mouse[1] die Y Koordinate.
    $mouse[2] beinhaltet 0 wenn die linke Maustaste nicht gedrückt ist, 1 wenn sie gedrückt ist.
    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • hm hab ich mir auch schon gedacht.. hatte gehofft, dass es einfacher geht... egal trotzdem danke^^

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Die Frage beantwortet sich ganz einfach dann, wenn man sich klarmacht, daß es ein

    Zitat von Developer30

    GDI+ Objekt

    garnicht gibt. Wo soll das "Objekt" herkommen?
    Einige bunte Pixel, die anstelle anderer bunter Pixel irgendwo auf dem Bildschirm dargestellt werden, sind kein "Objekt", sondern nur ein Haufen bunter Pixel.
    Wenn du allerdings (wie das z.B. bei den Controls gemacht wird) selbst ein "Objekt Pixelhaufen" definierst und dieses dem Windows-System bekannt machst, kannst du sehr wohl über z.B. ein Handle auf dieses "Objekt Pixelhaufen" zugreifen, Eigenschaften definieren uvm.

  • Ich denke mal du suchst das hier :D
    Die Funktionen sind von yxyx , ich hatte damals genau die gleiche Frage und habe mir dann das Beispiel hier erstellt ;)

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GdiPlus.au3>;das include
    #include <Misc.au3>

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

    OnAutoItExitRegister("_end") ; die Funktion _end am Ende des Scriptes ausführen
    _GDIPlus_Startup() ;Gdi starten

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

    Global $x = 100;x und y deklarieren
    Global $y = 100

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

    Global $GUI_Width = 300
    Global $GUI_Height = 280

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

    ;----Bilder laden---------------------
    Global $button = _GDIPlus_ImageLoadFromFile(@ScriptDir & "/Button-Close.png")
    Global $bk = _GDIPlus_ImageLoadFromFile(@ScriptDir & "/bck.png")

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

    $Gui = GUICreate("GDI+ Button Sample", $GUI_Width, $GUI_Height, 300,100)
    ;~ $verhaelnis = $height / $width macht _GDIPlus_ButtonCreate
    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui);Frontbuffer
    $bitmap = _GDIPlus_BitmapCreateFromGraphics($GUI_Width, $GUI_Height, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap);Backbuffer
    GUISetState(@SW_SHOW)
    $Button1 = _GDIPlus_ButtonCreate($buffer, $x, $y, $button, "Button1")

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

    While 1

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch

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

    _Draw()

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

    WEnd

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

    Func _end();die Exit funktion
    _GDIPlus_GraphicsDispose($graphic);Grafik Objekt freigeben
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    ;Bilder freigeben
    _GDIPlus_ImageDispose($button)
    _GDIPlus_ImageDispose($bk)
    _GDIPlus_Shutdown();Ressourcen freigeben
    EndFunc

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

    Func _Draw()
    _GDIPlus_GraphicsClear($buffer);Inhalt des Backbuffer`s wird gelöscht
    _GDIPlus_GraphicsDrawImageRect($buffer,$bk,0,0,$GUI_Width, $GUI_Height)
    _GDIPlus_ButtonCheck($Button1)
    _GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0) ;Backbuffer wird an den Frontbuffer übergeben
    ;Sleep(30)
    EndFunc

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

    Func Button1()
    MsgBox(0, "", "Button1 wurde gedrückt!")
    EndFunc

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

    Func _GDIPlus_ButtonCreate($hGraphics, $x, $y, $hImage, $func = "")
    ; by yxyx
    Local $ImgHeight = _GDIPlus_ImageGetHeight($hImage)
    Local $ImgWidth = _GDIPlus_ImageGetWidth($hImage)
    Local $aInfo[7] = [$hGraphics, $x, $y, $hImage, $ImgWidth, $ImgHeight]
    If $func <> "" Then $aInfo[6] = $func
    Return $aInfo
    EndFunc

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

    Func _GDIPlus_ButtonCheck($data)
    ; by yxyx
    Local $aMouseInfo = GUIGetCursorInfo()
    _GDIPlus_GraphicsDrawImage($data[0], $data[3], $data[1], $data[2])
    If not IsArray($aMouseInfo) Then Return
    If $aMouseInfo[0] > $data[1] and $aMouseInfo[0] < $data[1] + $data[4] and $aMouseInfo[1] > $data[2] and $aMouseInfo[1] < $data[2] + $data[5] and $aMouseInfo[2] = 1 Then
    Call($data[6])
    Sleep(200)
    EndIf
    EndFunc

    [/autoit]
  • Die Frage beantwortet sich ganz einfach dann, wenn man sich klarmacht, daß es ein
    Zitat von »Developer30«
    GDI+ Objekt
    garnicht gibt. Wo soll das "Objekt" herkommen?


    war mir klar, dass das kommt. ich hab ja gesagt, dass ich Anfänger bin, und ein besseres wort fiel mir nicht ein.

    Wenn du allerdings (wie das z.B. bei den Controls gemacht wird) selbst ein "Objekt Pixelhaufen" definierst und dieses dem Windows-System bekannt machst, kannst du sehr wohl über z.B. ein Handle auf dieses "Objekt Pixelhaufen" zugreifen, Eigenschaften definieren uvm.

    Das wollte ich ja ursprünglich machen, wusste aber nicht wie's geht -> daher der Thread.. Jetzt hab ichs wie PrideRage gelöst...

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

    Einmal editiert, zuletzt von Developer30 (12. September 2010 um 13:47)

  • Zitat

    ich hab ja gesagt, dass ich Anfänger bin, und ein besseres wort fiel mir nicht ein.

    Erstens ist das nicht schlimm (dass du Anfänger bist) und zweitens war das Wort an sich ja nicht falsch^^. Ich dachte mir allerdings den zusammenhang zu deinem Problem, z.B. eine Linie per GDI+ auf den Bildschirm malen, diese Linie per Mausklick "anfassen" und an eine andere Position schieben.

  • an PrideRage
    man muss aber auch abfragen IsArray, ansonsten gibt es eine Fehlermeldung wenn man ausserhalb der GUI klickt

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Developer30 Ich hoffe die Funktionen die ich gepostet habe wurden nicht übersehen


    nein es ist nicht in Vergessenheit geraten :)
    ich schau mir die beispiele schon immer an ;)
    aber trotzdem gut das du mich nochmal dran erinnerst. hatte gestern ein teil der funk übersehen. sry^^

    also thx @ alle Ideen und Beiträge :thumbup:

    Edit:

    anPrideRage
    man muss aber auch abfragen IsArray, ansonsten gibt es eine Fehlermeldung wenn man ausserhalb der GUI klickt


    bei mir gibt das keine Fehlermeldung

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • @Developer wenn man das script

    Spoiler anzeigen
    [autoit]


    $Form1 = GUICreate("Form1", 500, 500, -1, -1)
    GUISetState(@SW_SHOW)

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

    While 1
    $mouse = GUIGetCursorInfo()
    If GUIGetMsg() = -3 Then Exit
    If $mouse[2] = 1 Then
    If $mouse[0] > 200 And $mouse[1] < 100 Then
    MsgBox(0, "Geklickt", "Du hast in der Region geklickt")
    EndIf
    EndIf
    Sleep(20)
    WEnd

    [/autoit]


    so verwendet, kann man es starten und es funktioniert auch , wenn man auf die fläsche im Gui klickt, aber wenn du jetzt z.b. auf deinen desktop klickst :
    1. die Gui verschwindet (weil das script sich beendet wegen einem fehler => keine array)
    2. im scite wird eine Fehler meldung kurz angezeigt.
    deswegen muss man

    Spoiler anzeigen
    [autoit]


    $Form1 = GUICreate("Form1", 500, 500, -1, -1)
    GUISetState(@SW_SHOW)

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

    While 1
    $mouse = GUIGetCursorInfo()
    If GUIGetMsg() = -3 Then Exit
    If IsArray($mouse) Then
    If $mouse[2] = 1 Then
    If $mouse[0] > 200 And $mouse[1] < 100 Then
    MsgBox(0, "Geklickt", "Du hast in der Region geklickt")
    EndIf
    EndIf
    EndIf
    Sleep(20)
    WEnd

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


    und sie:
    die GUI bleibt und es wird keine Fehlermeldung mehr angezeigt :P

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake