_WinAPI_RedrawWindow()

  • Könntest du das Skript posten? Ich weiß jetzt nicht wozu man jede Sekunde eine Grafik erneuert (wird bestimmt einen Grund geben)

  • das ist etwas schwierig ihc kanns besse rbeschreiben. Es soll ein Mühlespiel sein. Wenn man mit der Maus über eine mögliche Ablageposition hovert, wird ein Kreis angezeigt, aber er geht wieder weg wenn man mit der Maus wieder weggeht ohne zu drücken. Dieses "weggehen" ist das _WinAPI_RedrawWindow() und das passiert halt alle paar Sec wobei das ganze Spiel dann immer aktualisiert.

  • Die Struktur musst du mit den 4 Eckpunkten befüllen:

    Spoiler anzeigen
    [autoit]


    #include <winapi.au3>
    #cs
    Global Const $tagRECT = "int Left;int Top;int Right;int Bottom"
    #ce

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

    DllStructSetData($tagRECT, 1, 10)
    DllStructSetData($tagRECT, 2, 10)
    DllStructSetData($tagRECT, 3, 20)
    DllStructSetData($tagRECT, 4, 20)

    [/autoit]
  • Beispiel:

    [autoit]

    $tagRECT = "int Left;int Top;int Right;int Bottom" ;structstruktur benennen
    $struct = DllStructCreate($tagRECT) ;struct erstellen
    DllStructSetData($struct,"Left" , 100) ;hier die parameter eingeben
    DllStructSetData($struct,"Top", 100) ;struct beschreiben
    DllStructSetData($struct,"Right", 150)
    DllStructSetData($struct,"Bottom", 200)

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

    $a=DllStructGetData($struct,"Right") ;struct auslesen

    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$a' & @lf & @lf & 'Return:' & @lf & $a) ;### Debug MSGBOX

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

    /EDIT/ ....die Vorschau hat nuts Thread nicht angezeigt, obwohl dieser mehrere Minuten vorher gepostet wurde...das kam in letzter Zeit schon öfter vor!?

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (6. Juli 2010 um 23:28)

  • Ah, vielen Dank.
    Sähe das dann z.B so aus: _WinAPI_RedrawWindow($form, 0, 0,$struct) . Weil hier darf ja nur ein Wert rein, da bringt es mir ja nichts mit DllStructGetData($struct,"Right") einen Wert der Struktur auszulesen... Oder muss die Zeile _WinAPI_RedrawWindow($form, 0, 0,$RECT) aussehen. Es funktioniert i-wie beides nicht, die Funktion wird dann einfach übersprungen, obwohl das eig. sehr richtig aussieht, wie ihr das geschrieben habt. ;)

  • Lies dir mal Bugfix´ens Tut´s zum Thema durch....
    IdR werden einer Funktion die Pointer auf eine Struct übergeben. Das hat den großen Vorteil, bei angenommenen 10 Parametern nur eine einzige Variable an die Funktion bzw. DLL übergeben zu müssen. Eine Struct ist nichts weiter als eine Liste von bestimmter Struktur im Speicher.
    Wenn du Pralinen kaufen möchtest, dann gehst du auch nicht in den Laden und kaufst die einzeln(" 7 Nuss, 8 Weinbrandbohnen, 3 Nougat, 5 Weiße Schokolade..."), sondern in einer Schachtel. Da weiss auch jeder, was drin ist. Oder Wurstaufschnitt...da sind in jeder Packumg immer gleich viele Scheiben der unterschiedlichsten Sorten.
    Der "Pointer" auf diese Struktur ist der Wegweiser zur Packung Pralinen bzw Wurstaufschnitt. Fach Nr. 127.
    In unserem Fall ist der Pointer also die Beschreibung, an welcher Speicherstelle die Struktur liegt.
    Der Vorteil ist, daß man mehrere Strukturen erstellen kann und dann der Funktion statt 28 Parameter nur EINEN Zeiger (Pointer) auf die Daten übergibt.

    [autoit]

    $pointer=DllStructGetPtr($struct) ;Pointer auf den Anfang der Struct
    $pointer=DllStructGetPtr($struct,"Right") ;Pointer auf ein Element der Struct

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    4 Mal editiert, zuletzt von Andy (7. Juli 2010 um 10:01)

  • Und so ists laut msdn auch hier!
    Also so ca.

    Spoiler anzeigen
    [autoit]


    #include <winapi.au3>
    #cs
    Global Const $tagRECT = "int Left;int Top;int Right;int Bottom"
    #ce
    $struct=DllStructCreate($tagRECT) ;erstellen

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

    DllStructSetData($struct, 1, 10) ;die Werte setzen
    DllStructSetData($struct, 2, 10)
    DllStructSetData($struct, 3, 20)
    DllStructSetData($struct, 4, 20)

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

    ;ConsoleWrite(DllStructGetData($struct,1)) ;zum anschauen

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

    _WinAPI_RedrawWindow($hwnd, DllStructGetPtr($struct))

    [/autoit]
  • Also ich habe das jetzt so verstanden, dass ich eine Pointer erstellen muss, der auf die Struktur verweist, in der sich die vier Koordinaten befinden. Dann kann ich den Pointer in _WinAPI_RedrawWindow() einbinden. (Er ist ja dann nur eine Variable) und dieser verweist dann auf die 4 Punkte. Den Pointer erstelle ich mit DllStructGetPtr($struct).
    Also sähe das dann ca so aus:


    -------------------------------------------------------------------------------------
    Global Const $RECT = "int Left;int Top;int Right;int Bottom"
    Global $struct = DllStructCreate($RECT)

    DllStructSetData($struct,"Left" ,150)
    DllStructSetData($struct,"Top", 150)
    DllStructSetData($struct,"Right",900)
    DllStructSetData($struct,"Bottom",900)

    Global $Pointer = DllStructGetPtr($struct)


    _WinAPI_RedrawWindow($form,$Pointer)

    -------------------------------------------------------------------------------------------

    Habe ich etwas falsch verstanden? Ich habe es nämich genau so und trotzdem wird das ganze Fenster aktualisiert.

    edit: Komischerweise habe ich den Thread nicht gesehen und Quellcode nicht gesehen, obwohl er schon dagewesen sein müsste

  • Hier, ich habe etwas kleines gebastelt:

    Eigentlich sollte sich nur das Brett aktualisieren, aber die Labels tun das auch...Oder ist das vielleicht nur ein Darstellungsfehler!??


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    #Include <WinAPI.au3>

    $Form = GUICreate("Mühle",@DesktopWidth+10, @DesktopHeight+30,-10,-30)
    GUISetBkColor(0x000000)
    GUICtrlCreatePic(@scriptdir&"\"&"brett.jpg",(@DesktopWidth-800)/2,150,800,800)
    $1 = GUICtrlCreateLabel("Player 1", 50, 30, 200, 60,0x01)
    GUICtrlSetColor($1,0xff0000)
    GUICtrlSetFont($1,30)
    $2 = GUICtrlCreateLabel("Player 2", @DesktopWidth-230, 30, 200, 60,0x01)
    GUICtrlSetFont($2,30)
    GUICtrlSetColor($2,0x0000FF)
    Global Const $RECT = "int Left;int Top;int Right;int Bottom"
    GUISetState(@SW_SHOW)
    Global $struct = DllStructCreate($RECT)
    DllStructSetData($struct,"Left" ,(@DesktopWidth-800)/2)
    DllStructSetData($struct,"Top", 150)
    DllStructSetData($struct,"Right",((@DesktopWidth-800)/2)+800)
    DllStructSetData($struct,"Bottom",900)
    Global $Pointer = DllStructGetPtr($struct)

    While 1
    sleep(2000)
    _WinAPI_RedrawWindow($form,$Pointer)
    WEnd

  • Wahrscheinlich würde es hier reichen das Hintergrundbild zu "disablen" -> Guictrlsetstate(-1,$SW_disable), an allen Punkten Labels zu erstllen und anschließend die Label bei Bedarf ein-/auszublenden?