Hallo zusammen,
ich muss mit _WinAPI_RedrawWindow() öfters eine Graphic aktualisieren. Dies nervt aber beim hingucken ziemlich, da es alle paar sec. passiert. Gibt es eine Möglichkeit dies weniger auffällig zu gestalten und wie genau funktioniert es, nur ein Teil des Bildschirms zu aktualisieren?
Vielen Dank im Voraus
RapIT
_WinAPI_RedrawWindow()
-
- [ offen ]
-
RapIt -
6. Juli 2010 um 21:06 -
Geschlossen -
Erledigt
-
-
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.
-
Könntest du das Skript posten?
-
- Offizieller Beitrag
Schau dir mal alle Parameter der Funktion an
Du kannst ein Rectangle des Windows bestimmen, das neu gezeichnet werden soll. -
Wie funktioniert denn die "$tagRECT Struktur" Wie kann ich die Koordinaten in dem Parameter angeben?
-
Die Struktur musst du mit den 4 Eckpunkten befüllen:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <winapi.au3>
#cs
Global Const $tagRECT = "int Left;int Top;int Right;int Bottom"
#ceDllStructSetData($tagRECT, 1, 10)
[/autoit]
DllStructSetData($tagRECT, 2, 10)
DllStructSetData($tagRECT, 3, 20)
DllStructSetData($tagRECT, 4, 20) -
Beispiel:
[autoit]$tagRECT = "int Left;int Top;int Right;int Bottom" ;structstruktur benennen
[/autoit][autoit][/autoit][autoit]
$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)$a=DllStructGetData($struct,"Right") ;struct auslesen
[/autoit][autoit][/autoit][autoit][/autoit]
MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$a' & @lf & @lf & 'Return:' & @lf & $a) ;### Debug MSGBOX/EDIT/ ....die Vorschau hat nuts Thread nicht angezeigt, obwohl dieser mehrere Minuten vorher gepostet wurde...das kam in letzter Zeit schon öfter vor!?
-
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....
[autoit]
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.$pointer=DllStructGetPtr($struct) ;Pointer auf den Anfang der Struct
[/autoit]
$pointer=DllStructGetPtr($struct,"Right") ;Pointer auf ein Element der Struct -
Und so ists laut msdn auch hier!
Also so ca.Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <winapi.au3>
#cs
Global Const $tagRECT = "int Left;int Top;int Right;int Bottom"
#ce
$struct=DllStructCreate($tagRECT) ;erstellenDllStructSetData($struct, 1, 10) ;die Werte setzen
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($struct, 2, 10)
DllStructSetData($struct, 3, 20)
DllStructSetData($struct, 4, 20);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
-
Genau so müsste das hinhauen.
Ansonsten solltest du mal ein lauffähiges Beispiel posten bei dem es nicht funktioniert. -
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?
-
Aber mal ganz davon abgesehen was reichen würde ;-das sit ja ein kleines Beispiel, ganz anders als das richtige- was ist denn falsch, bzw. das Problem?
Im Anhang das was ich bis jetzt habe.