guictrlsetgraphics() Linien Problem

  • Habe folgendes Problem:
    Ich male eine Linie von einem Punkt zu einem Anderen und wenn ich dann den Punkt verschiebe bewegt sich die alte Linie mit o_O
    Kann das grad nicht so gut erklären probiert es selbst aus.
    "Add Vertex" fügt einen Punkt hinzu.
    !Bewegt als erstes den Punkt woanders hin!
    Dann 2. Punkt erstellen.
    Dann Auf 1. Punkt klicken und dann auf den 2. -> Linie kommt.
    Und dann könnt ihr mal rumspielen und sehen was passiert. Der Fehler liegt irgendwo in der letzten Funktion (edge_create) glaube ich.
    Quelltext

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>

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

    ; AutoIt Version: 3.2.10.0
    ; Author: Nozdrum

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

    #region Graphical User Interface
    Const $g_pfad = @ScriptDir & "\Images\"
    Const $header = "GraphMaker"
    $g_v_height = 10
    GUICreate("GraphMaker",800,600)
    $g_p_upperleft = GUICtrlCreatePic($g_pfad & "Rahmen\o_l.bmp",10 ,10 , 3, 3)
    $g_p_upper = GUICtrlCreatePic($g_pfad & "Rahmen\o.bmp" ,13 ,10 ,651, 3)
    $g_p_upperright = GUICtrlCreatePic($g_pfad & "Rahmen\o_r.bmp",663,10 , 5, 4)
    $g_p_right = GUICtrlCreatePic($g_pfad & "Rahmen\r.bmp" ,665,14 , 3,573)
    $g_p_lowerright = GUICtrlCreatePic($g_pfad & "Rahmen\u_r.bmp",664,587, 4, 5)
    $g_p_left = GUICtrlCreatePic($g_pfad & "Rahmen\l.bmp" ,10 ,13 , 3,578)
    $g_p_lowerleft = GUICtrlCreatePic($g_pfad & "Rahmen\u_l.bmp",10 ,588, 4, 4)
    $g_p_lower = GUICtrlCreatePic($g_pfad & "Rahmen\u.bmp" ,13 ,589,651, 3)
    $g_g = GUICtrlCreateGraphic(13,13,652,576)
    $g_b_vertex_add = GUICtrlCreateButton("Add Vertex",677,10,114,25)
    $g_b_end = GUICtrlCreateButton("End",677,567,114,25)
    $g_b_clear = GUICtrlCreateButton("Clear",677,10*4+25*4,114,25)
    $g_i_vertex_height = GUICtrlCreateInput("20",677,464,114,20,$ES_Number)
    $g_l_vertex_height = GUICtrlCreateLabel("Vertex-Height: ",680,448,114,15)
    GUICtrlSetGraphic($g_g,$GUI_GR_PENSIZE,3)
    GUICtrlSetGraphic($g_g,$GUI_GR_COLOR, 0x000000,0x000000)

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

    #endregion

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

    Global $f[51][55]
    Init($f,$g_g)
    GUISetState(@SW_SHOW)

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

    #cs
    f - Info
    f[0][0] = Anzahl der Knoten
    f[0][1] = Irgendwas selektiert ? (0/1)
    f[0][2] = selektierter Knoten ( Nummer )
    f[x][0] = Anzahl der Kanten
    f[x][1] = x-Pos
    f[x][2] = y-Pos
    f[x][3] = wert ( falls bewerter Graph )
    f[x][4..50] = zu welchen Knoten verbunden
    #ce

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case ( $msg = $Gui_Event_Close ) Or ( $msg = $g_b_end )
    Exit
    Case $msg = $g_b_vertex_add
    vertex_add($f,$g_g,$g_v_height)
    Case $msg = $g_i_vertex_height
    $g_v_height = Int(Round(GUICtrlRead($g_i_vertex_height)/2,0))
    Case $msg = $g_b_clear
    Init($f,$g_g)
    Case $msg = $g_g
    $g_mouse = GUIGetCursorInfo()
    If IsArray($g_mouse) Then
    $z = vertexthere($f,$g_g,$g_mouse[0]-13,$g_mouse[1]-13,$g_v_height)
    If $z Then
    If $f[0][1] Then
    If $z = $f[0][2] Then
    vertexunselect($f,$g_g,$g_v_height)
    Else
    If edgethere($f,$z) Then
    ;edge_destroy
    Else
    edge_create($f,$g_g,$g_v_height,$z)
    EndIf
    EndIf
    Else
    vertexselect($f,$g_g,$z,$g_v_height)
    EndIf
    ElseIf $f[0][1] Then
    vertexmove($f,$g_g,$g_mouse[0]-13,$g_mouse[1]-13,$g_v_height,$f[0][2])
    EndIf
    EndIf
    EndSelect
    WEnd

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

    Func vertexthere($f,$g_g,$x,$y,$g_v_height)
    For $i = 1 To $f[0][0]
    For $j = $x-$g_v_height To $x+$g_v_height
    For $k = $y-$g_v_height to $y+$g_v_height
    If ( $f[$i][1] = $j ) And ( $f[$i][2] = $k ) Then Return $i
    Next
    Next
    Next
    Return 0
    EndFunc

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

    Func edgethere($f,$n)
    For $i = 4 To 50
    If $f[$f[0][2]][$i] = $n Then Return 1
    Next
    Return 0
    EndFunc

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

    Func vertex_add(ByRef $f, ByRef $g_g,$g_v_height)
    If Not( $f[0][0] <= 50 ) Then
    MsgBox(0,$header,"Maximum number of vertex reached.")
    Return 1
    EndIf
    $f[0][0] += 1
    $f[$f[0][0]][1] = 326
    $f[$f[0][0]][2] = 288
    GUICtrlSetGraphic($g_g,$GUI_GR_PIE,326,288,$g_v_height,0,360)
    GUICtrlSetGraphic($g_g,$GUI_GR_REFRESH)

    EndFunc

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

    Func Init(ByRef $f, ByRef $g_g)
    For $i = 0 to 50
    for $j = 0 to 50
    $f[$i][$j] = 0
    Next
    Next
    GUICtrlSetBkColor($g_g,0xffffff)
    GUICtrlSetGraphic($g_g,$GUI_GR_COLOR,0xffffff,0xffffff)
    GUICtrlSetGraphic($g_g,$GUI_GR_RECT,0,0,652,576)
    GUICtrlSetGraphic($g_g,$GUI_GR_REFRESH)
    GUICtrlSetGraphic($g_g,$GUI_GR_COLOR,0x000000,0x000000)
    Return 0
    EndFunc

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

    Func vertexmove(ByRef $f,ByRef $g_g,$x,$y,$g_v_height,$n)
    GUICtrlSetGraphic($g_g,$GUI_GR_COLOR,0xffffff,0xffffff)
    GUICtrlSetGraphic($g_g,$GUI_GR_PIE,$f[$n][1],$f[$n][2],$g_v_height,0,360)
    GUICtrlSetGraphic($g_g,$GUI_GR_COLOR,0x000000,0x000000)
    GUICtrlSetGraphic($g_g,$GUI_GR_PIE,$x,$y,$g_v_height,0,360)
    GUICtrlSetGraphic($g_g,$GUI_GR_REFRESH)
    $f[$n][1] = $x
    $f[$n][2] = $y
    $f[0][1] = 0
    $f[0][2] = 0
    Return 0
    EndFunc

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

    Func vertexselect(ByRef $f,ByRef $g_g,$n,$g_v_height)
    GUICtrlSetGraphic($g_g,$GUI_GR_COLOR,0xFF00ff,0xFF00ff)
    GUICtrlSetGraphic($g_g,$GUI_GR_PIE,$f[$n][1],$f[$n][2],$g_v_height,0,360)
    GUICtrlSetGraphic($g_g,$GUI_GR_COLOR,0x000000,0x000000)
    GUICtrlSetGraphic($g_g,$GUI_GR_REFRESH)
    $f[0][1] = 1
    $f[0][2] = $n
    Return 0
    EndFunc

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

    Func vertexunselect(ByRef $f, ByRef $g_g,$g_v_height)
    GUICtrlSetGraphic($g_g,$GUI_GR_COLOR,0x000000,0x000000)
    GUICtrlSetGraphic($g_g,$GUI_GR_PIE,$f[$f[0][2]][1],$f[$f[0][2]][2],$g_v_height,0,360)
    GUICtrlSetGraphic($g_g,$GUI_GR_REFRESH)
    $f[0][1] = 0
    $f[0][2] = 0
    Return 0
    EndFunc

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

    Func edge_create(ByRef $f, ByRef $g_g,$g_v_height,$n)
    GUICtrlSetGraphic($g_g,$GUI_GR_COLOR,0x000000,0x000000)
    GUICtrlSetGraphic($g_g,$gui_GR_LINE,$f[$n][1],$f[$n][2])
    GUICtrlSetGraphic($g_g,$GUI_GR_REFRESH)
    $f[$f[0][2]][0] +=1
    $f[$f[0][2]][$f[$f[0][2]][0]+4] = $n
    $f[$n][0] +=1
    $f[$n][$f[$n][0]+4] = $f[0][2]
    vertexunselect($f,$g_g,$g_v_height)
    Return 0
    EndFunc

    [/autoit]
  • Hm ok.
    Ich reduziere es mal auf das Problem ( ich glaube ich habe es inzwischen lokalisieren können )
    Bsp:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    GUICreate("blub",300,300)
    $g = GUICtrlCreateGraphic(0,0,300,300)
    GUICtrlSetGraphic($g,$GUI_GR_PIE,15,15,5,0,360)
    GUICtrlSetGraphic($g,$GUI_GR_LINE,100,100)
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    WEnd

    [/autoit]


    Da kommt folgendes Bild bei raus

    Spoiler anzeigen


    Alles wie erwartet.
    Fügt man aber eine Zeile hinzu

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    GUICreate("blub",300,300)
    $g = GUICtrlCreateGraphic(0,0,300,300)
    GUICtrlSetGraphic($g,$GUI_GR_PIE,15,15,5,0,360)
    GUICtrlSetGraphic($g,$GUI_GR_LINE,100,100)
    GUICtrlSetGraphic($g,$GUI_GR_PIE,200,100,10,0,360) ; <- Hinzugefügt
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    WEnd

    [/autoit]


    Kommt folgendes Bild

    Spoiler anzeigen


    Die alte Linie ist weg und die neue ist da. Irgendwie wandert die Linie wenn ich irgendwas neues zeichne und das sollte möglichst aber nicht passieren ^^.
    Hoffe jetzt ist es klarer. Tut mir Leid für alle die sich durch mein Gewurschtel durchgewühlt haben. :|

  • Hm, hab diese Funktion noch nie verwendet.
    Habs aber mal probiert. Schon komisch ?(

    Habs hinbekommen indem ich ne 2.te Grafik erstelle.
    Ist aber denke ich nicht die Lösung.
    Muß doch auch einfacher gehen. :whistling:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    GUICreate("blub",300,300)
    $g = GUICtrlCreateGraphic(0,0,300,300)
    GUICtrlSetGraphic($g,$GUI_GR_PIE,15,15,5,0,360)
    GUICtrlSetGraphic($g,$GUI_GR_LINE,100,100)

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

    $w = GUICtrlCreateGraphic(0,0,300,300) ; <- Hinzugefügt
    GUICtrlSetGraphic($w,$GUI_GR_PIE,200,100,10,0,360) ; <- Hinzugefügt

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    WEnd

    [/autoit]