Mh bei anderen Scripten ohne GDI+ habe ich das nicht, darum dachte ich es liegt an GDI+
Beiträge von chip
-
-
Genau das ist auch was mich etwas wundert, wo die Größernersparniss ist. In seinem Beispiel ist eine Input.au3 drin mit einer Größe von 9 Byte. Die Input.a3x die dabei ist hat aber eine größe von 357 Bytes, also ca. 40mal größer.
-
Also z.b. bei diesem hier ist es, bei einem AMD Athlon 64 X2 4600+ (2,4 GHz), bei 46 wenn die Maus nicht bewegt wird und 50 Prozent wenn die Maus bewegt wird:
Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>Opt("GuiOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]
Opt("MouseCoordMode", 0)OnAutoItExitRegister("_end")
[/autoit] [autoit][/autoit] [autoit]$Gui = GUICreate("Beispiel", 800, 600)
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUISetState(@SW_SHOW)_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$chipset = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\chipsets\1.png")
[/autoit] [autoit][/autoit] [autoit]$graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
[/autoit] [autoit][/autoit] [autoit]
$bitmap = _GDIPlus_BitmapCreateFromGraphics(800, 600, $graphic)
$buffer = _GDIPlus_ImageGetGraphicsContext($bitmap);~ _GDIPlus_GraphicsDrawImageRectRect($buffer, $chipset, 0, 0, 256, 1024, 672, 0, 128, 512)
[/autoit] [autoit][/autoit] [autoit]
;~ _GDIPlus_GraphicsDrawImageRectRect($buffer, $chipset, 0, 0, 256, 1024, 0, 515, 128 / 6, 512 / 6)
;~ _GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0)
;~ _GDIPlus_GraphicsClear($buffer, 0xFF000000)$mouscordsalt = MouseGetPos()
[/autoit] [autoit][/autoit] [autoit]
While 1
$mouscords = MouseGetPos()
If $mouscordsalt[0] <> $mouscords[0] Or $mouscordsalt[1] <> $mouscords[1] Then
;~ $mouscordsalt[0] = $mouscords[0]
;~ $mouscordsalt[1] = $mouscords[1]
;~
;~ If $mouscords[0] Or $mouscordsalt[1] <> $mouscords[1] Then
_GDIPlus_GraphicsDrawImageRectRect($buffer, $chipset, 0, 0, 256, 1024, 672, 0, 128, 512)
_GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0)
_GDIPlus_GraphicsClear($buffer, 0xFF000000)
;~ EndIf
EndIf
WEndFunc CLOSEClicked()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc ;==>CLOSEClickedFunc _end()
[/autoit]
_GDIPlus_ImageDispose($chipset)
_GDIPlus_GraphicsDispose($graphic)
_GDIPlus_GraphicsDispose($buffer)
_GDIPlus_BitmapDispose($bitmap)
_GDIPlus_Shutdown()
EndFunc ;==>_end -
Damit verändert man ja die Renderqualität des Grafik-Objekts, das will ich allerdings nicht. Daher eher an irgendeinen Trick um z.b. GDI+ statt mit der CPU mit der GPU render zu lassen oder dergleiche.
-
Hi,
gibt es irgendeinen Trick um die Prozessorauslastung durch GDI+ zu reduzieren?
mfg
-
Also so ganz kapier ich auch nicht wie das gehen soll. Deine GenScript.au3 generiert eine CompileME.au3 und die CompileME.au3 eine OUT.exe.
Die Out.exe hat wiederrum diesen Code wodruch sie sich selbst versucht zu öffnen:
Spoiler anzeigen
[autoit]DIM $AUTOITEXE_BYTES=646144,$AUTOITA3X_SCRIPT=""
[/autoit]
$AUTOITA3X_SCRIPT&=BINARYTOSTRING("")
$AUTOITEXE=@SCRIPTFULLPATH
$AUTOITEXE_OPEN=FILEOPEN($AUTOITEXE)
$AUTOITEXE_READ=FILEREAD($AUTOITEXE_OPEN)
$AUTOITEXE_BINARY=STRINGTRIMRIGHT($AUTOITEXE_READ,FILEGETSIZE($AUTOITEXE)-$AUTOITEXE_BYTES)
FILECLOSE($AUTOITEXE_OPEN)
$OUT_OPEN=FILEOPEN("OUT.exe",18)
FILEWRITE($OUT_OPEN,$AUTOITEXE_BINARY&$AUTOITA3X_SCRIPT)
FILECLOSE($OUT_OPEN)Weder kann man ein Script auswählen aus dem der a3x Code generiert werden soll, noch passiert sonst irgendetwas. Erklär das bitte nochmal genauer was da passieren sollte.
-
Ach misst da hab ich doch glatt vergessen gehabt die raus zu machen. *lach* aber lieber so ein Fehler als was ernstes. Danke :).
-
Wie gesagt mach das Tutorial durch und lernen die Grundlagen, vorher wird das nichts ;).
-
Mach es so:
[autoit]$config = IniReadSection(@ScriptDir & "\UserInfo.ini", "Configuration")
[/autoit] -
Klar, warum sollte es nicht gehen:
Spoiler anzeigen
[autoit]FileSetAttrib(@WindowsDir & "\Temp", "-R -S", 1)
[/autoit]
FileDelete(@WindowsDir & "\Temp")
If Not FileExists(@WindowsDir & "\Temp") Then
DirCreate(@WindowsDir & "\Temp")
EndIfNur ob das Sinn macht es 1 zu 1 von batch in Autoit zu portieren, bezweifel ich.
-
Hi,
habe ein, zumindestens für mich, seltsamens Problem. In folgendem Script lade ich zu beginn eine Bild in einer globale Variable:
[autoit]Global $char = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\chars\1.png")
[/autoit]aus dieem Bild werden dann in einer Funktion mit "_GDIPlus_GraphicsDrawImageRectRect" einzelnen Bereiche ausgeschnitten und vergößert dargestellt. Soweit so gut. Jetzt habe ich allerdings drin, dass wenn eine Variable einen bestimmten Wert erreicht ein anderes Bild in die globale Variable geladen werden soll:
[autoit]If $charselectkordy == 64 Then
[/autoit][autoit][/autoit][autoit]
$charselectkordy = 192
Else
$charselectkordy = 64$chardateicount = $chardateicount + 1
[/autoit]
$char = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\chars\" & $chardateicount & ".png")
EndIfUnd nun kommt das komische. Beim diekt drauffolgenden "_GDIPlus_GraphicsDrawImageRectRect" wird aus dem neuen Bild der Ausschnitt genommen. Beim nächsten aufrufen der Funktion allerdings wieder von dem alten obwohl das garnichtmehr in die Variable geladen wird.
Spoiler anzeigen
[autoit]#include <File.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>Opt("GuiOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]OnAutoItExitRegister("_end")
[/autoit] [autoit][/autoit] [autoit]$Gui = GUICreate("Form1", 320, 240)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$charselectleft = GUICtrlCreateLabel("", 80, 180, 34, 25, 0x0000000D)
GUICtrlSetOnEvent($charselectleft, "charselectleft")
$charselectright = GUICtrlCreateLabel("", 195, 180, 34, 25, 0x0000000D)
GUICtrlSetOnEvent($charselectright, "charselectright")
GUISetState(@SW_SHOW)$chardateien = _FileListToArray(@ScriptDir & "\chars")
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$bitmap = _GDIPlus_BitmapCreateFromGraphics(320, 240, $graphic)
$buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)Global $char = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\chars\1.png")
[/autoit] [autoit][/autoit] [autoit]
$height = _GDIPlus_ImageGetHeight($char)
$width = _GDIPlus_ImageGetWidth($char)$bk = _GDIPlus_ImageLoadFromFile("charselect.png")
[/autoit] [autoit][/autoit] [autoit]$changeright = _GDIPlus_ImageLoadFromFile("auswahlrechts.png")
[/autoit] [autoit][/autoit] [autoit]$changeleft = _GDIPlus_ImageLoadFromFile("auswahllinks.png")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Global $charselectkordx = 0
[/autoit] [autoit][/autoit] [autoit]
Global $charselectkordy = 0
Global $chardateicount = 1
_charchange($buffer, $bk, $char, $graphic, $bitmap)While 1
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit]Func charselectleft()
[/autoit] [autoit][/autoit] [autoit]
_charchange($buffer, $bk, $char, $graphic, $bitmap, "left")
EndFunc ;==>charselectleftFunc charselectright()
[/autoit] [autoit][/autoit] [autoit]
_charchange($buffer, $bk, $char, $graphic, $bitmap, "right")
EndFunc ;==>charselectrightFunc CLOSEClicked()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc ;==>CLOSEClickedFunc _charchange($buffer, $bk, $char, $graphic, $bitmap, $direction = "start")
[/autoit] [autoit][/autoit] [autoit]
Switch $direction
Case "start"
$charselectkordx = 24
$charselectkordy = 64
Case "left"
$charselectkordx = $charselectkordx - 72
If $charselectkordx < 24 Then
If $charselectkordy == 64 Then
$charselectkordy = 192
Else
$charselectkordy = 64
EndIf$charselectkordx = 240
[/autoit] [autoit][/autoit] [autoit]
EndIf
Case "right"
$charselectkordx = $charselectkordx + 72
If $charselectkordx > 240 Then
If $charselectkordy == 64 Then
$charselectkordy = 192
Else
$charselectkordy = 64$chardateicount = $chardateicount + 1
[/autoit] [autoit][/autoit] [autoit]
$char = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\chars\" & $chardateicount & ".png")
EndIf$charselectkordx = 24
[/autoit] [autoit][/autoit] [autoit]
EndIf
EndSwitch_GDIPlus_GraphicsDrawImageRect($buffer, $bk, 0, 0, 320, 240)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawImageRect($buffer, $changeleft, 80, 180, 34, 25)
_GDIPlus_GraphicsDrawImageRect($buffer, $changeright, 195, 180, 34, 25)
_GDIPlus_GraphicsDrawImageRectRect($buffer, $char, $charselectkordx, $charselectkordy, 24, 32, 120, 110, 24 * 3, 32 * 3)
_GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0)
_GDIPlus_GraphicsClear($buffer, 0xFF000000)
EndFunc ;==>_charchangeFunc _end()
[/autoit]
_GDIPlus_GraphicsDispose($graphic)
_GDIPlus_GraphicsDispose($buffer)
_GDIPlus_BitmapDispose($bitmap)
_GDIPlus_ImageDispose($char)
_GDIPlus_ImageDispose($bk)
_GDIPlus_Shutdown()
EndFunc ;==>_end -
1. Ist es möglich dies auch in Autoit zu realisieren ohne das ich auf Batch dateien zugreifen muss? Ich hätte am ende gerne nur ein .exe File und bei Klick auf Button 2 wird auch das Programm 2 ausgeführt.Ja, Autoit ist wesentlich mächtiger als Batch
2. Gibt es die Möglichkeit eine Checkbox einzufügen in der ich die Auswahl "runas" habe? So das ich das dann als user oder als Admin ausführen kann?Auch ja. Schau dir am besten erstmal das Tutorial an: http://wiki.autoit.de/wiki/index.php/Tutorial
-
Ay die Idee ist gut, hatte das die ganze Zeit versucht irgendie mit GUICtrlCreateButton zu machen, aber das sah bescheiden aus.
-
Hi,
gibt es eine Möglichkeit auf eine mit _GDIPlus_GraphicsDrawImageRect eingefügte grafik ein "OnEvent" zu legen um bei einem klick auf die Grafik eine Funktion aufzurufen oder muss man das über zum Fenster reletaive Mauscoords machen?
mfg
-
So hab dein Problem gelöst. Dein komischen ASCII-Sonderzeichen nach "Copyright by 2011" verhindert, dass beim compilen die Details entsprechend verändert werden.
-
Edit: Ok habs jetzt doch hinbekommen
-
Mh und wie? Da kann man doch nur die linke obere Ecke von Quelle und Ziel definieren.
-
Mh damit vergrößere bzw. verkleinerre ich ja aber nur einen ausschnitt und kann nicht irgedwo innerhalb des Quellbildes einen definierten Bereich auswählen.
-
Hi,
ich habe folgende Grafik:
[Blockierte Grafik: http://rpg2000.4players.de/chipsets/Fassade/AkteX.png]
Diese würde ich nun gerne einmal mit _GDIPlus_ImageLoadFromFile oder so im mein Script einlegen und dann nur einen kleine Ausschnitt z.b. einen der Monitore "ausschneiden" und nur diesen Monitor zeichnen. Die höhe und breite der Ausgeschnittenen fläche ist immer gleich nur die Position von wo es ausgeschnitten wird ändert sich.
Da ich mehrere Felder nacheinander in die gleiche Oberfläche zeichnen will ist der weg über alles andere schwarz machen leider nicht möglich. es müsste schon wirklich die gezeichnete Grafik dann die größe des ausgeschnittenen Bereiches haben.
jemand eine Idee?
mfg
-
Wohaaaa das ist ja optimal XD. Danke.