1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. UEZ

Beiträge von UEZ

  • Mit GDIPlus Um Punkt Drehen

    • UEZ
    • 24. Dezember 2009 um 13:28

    Das hat nicht viel mit GDI+ zu tun, sondern eher was mit Mathe! ;)

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

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

    Opt("GUIOnEventMode", 1)
    Global $hWnd, $hGraphic, $hPen, $x1, $x2, $y1, $y2, $grad, $clock
    Global $iX = 400, $iY = 400, $rI = 30, $rO = 180, $i = 180
    Global $Pi = 4 * ATan(1), $Pi_Div_180 = $Pi / 180, $w_mid = $iX / 2, $h_mid = $iY / 2
    ; Erstellt eine GUI
    $hWnd = GUICreate("GDI+", $iX, $iY)
    GUISetState()

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

    _GDIPlus_Startup() ;initialisiere GDI+
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd) ;erstelle Grafik Objekt in Verbindug mit der GUI
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, 4) ;aktiviere Kantenglättung
    _GDIPlus_GraphicsClear($hGraphic, 0xFF000000) ;lösche Grafik
    $hPen = _GDIPlus_PenCreate(0xFFFF0000, 4) ;erstelle Stift mit 4 Pixel Breite
    $Ellipse = _GDIPlus_GraphicsDrawEllipse($hGraphic, $iX / 2 - 10, $iY / 2 - 10, 20, 20, $hPen) ;zeichne Kreis in der Mitte

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") ;Aktiviere Exit wenn $GUI_EVENT_CLOSE ausgelöst wird

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

    Do
    $grad = Mod(180 - $i, 360) ;berechne Winkel (0 - 359)
    $clock = Floor($grad / 30) ;berechne Uhrzeit (0-11)
    WinSetTitle($hWnd, "", "GDI+ Demo by UEZ -=> " & $grad & "° / " & $clock) ;schreibe Infos in die Windows Titelleiste
    $x1 = $rI * Sin($i * $Pi_Div_180) + $w_mid ;berechne Punkt x1 vom inneren Kreis
    $y1 = $rI * Cos($i * $Pi_Div_180) + $h_mid ;berechne Punkt y1 vom inneren Kreis
    $x2 = $rO * Sin($i * $Pi_Div_180) + $w_mid ;berechne Punkt x2 vom äußeren Kreis
    $y2 = $rO * Cos($i * $Pi_Div_180) + $h_mid ;berechne Punkt y2 vom äußeren Kreis
    _GDIPlus_PenSetColor($hPen, "0xF0" & Hex(Random(0x111111, 0xFFFFFF, 1), 6)) ;kreiere neue Stiftfarbe zufällig
    _GDIPlus_GraphicsDrawLine($hGraphic, $x1, $y1, $x2, $y2, $hPen) ;zeichne Linie
    $i -= 1
    Until Not Sleep(20)

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

    Func _Exit()
    ; Ressourcen freigeben
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]


    Gruß,
    UEZ

  • GDI+ Image Rotator and Saver

    • UEZ
    • 23. Dezember 2009 um 21:54
    Zitat von Greek

    ... hatte mich daran auch schonmal versucht:

    Weiß ich ;)

    Zitat


    Aber leider geht das komischerweise nicht bei allen Bildern.

    Meinst du dein Programm?

    Bei meinem Programm werden mache Bilder gestreckt angezeigt. Ich weiß nicht warum!

    Zitat


    Nützliches Script, danke ;)

    Bitte!

    Das Skript habe ich auf die Schnelle erstellt, d.h. es können noch Fehler enthalten sein!

    Gruß,
    UEZ

  • GDI+ Image Rotator and Saver

    • UEZ
    • 23. Dezember 2009 um 19:34

    Hi,

    ich hatte letztens von einem User aus einem anderen Forum eine Anfrage, wie man ein Bild drehen kann und dieses anschließend speichert.

    Spoiler anzeigen
    [autoit]


    ;Coded by UEZ 2009.12.23
    #include <GUIConstantsEx.au3>
    #include <GDIplus.au3>
    #include <SliderConstants.au3>
    #Include <GuiStatusBar.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $file, $msg

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

    Do
    $file = FileOpenDialog("Select Image to load", @ScriptDir, "Images (*.jpg;*.png; *.bmp;*.gif)")
    If @error Then
    $msg = MsgBox(20, "Error", "Please select an image!")
    If $msg = 7 Then
    Exit
    Else
    SetError(1)
    EndIf
    EndIf
    Until Not @error
    Global $dll = DllOpen("user32.dll")
    Global $date, $nMsg, $d, $date, $path, $suffix, $sCLSID
    Global $encoder = "PNG"
    _GDIPlus_Startup()
    Global $hImage = _GDIPlus_BitmapCreateFromFile($file)
    Global $iX = _GDIPlus_ImageGetWidth($hImage)
    Global $iY = _GDIPlus_ImageGetHeight($hImage)
    Global $hwnd = GUICreate("GDI+ Image Rotation by UEZ 2009", $iX + 200, $iY + 80, -1, -1)
    Global $Button1 = GUICtrlCreateButton("Rotate_Image", $iX + 63, 36, 75, 25)
    Global $Button2 = GUICtrlCreateButton("Save Image", $iX + 63, 92, 75, 25)
    GUICtrlSetTip($Button2, "Image will be saved to " & @ScriptDir)
    Global $Button3 = GUICtrlCreateButton("Exit", $iX + 63, $iY + 12, 75, 25)
    Global $Input1 = GUICtrlCreateInput("", $iX + 63, 10, 73, 21)
    GUICtrlSetTip($Input1, "Enter degree -359° - 359° here")
    Global $Label = GUICtrlCreateLabel("Degree:", $iX + 20, 12, 40, 17)
    Global $Slider = GUICtrlCreateSlider(10, $iY + 10, $iX - 10, 40, $TBS_AUTOTICKS + $TBS_ENABLESELRANGE)
    GUICtrlSetTip($Slider, "-90° to 90°")
    GUICtrlSetLimit($Slider, 90, -90)
    GUICtrlSetData($Slider, 0)
    Dim $aParts[4] = [106, 148, 250, -1]
    Global $StatusBar = _GUICtrlStatusBar_Create($hwnd, $aParts)
    GUISetState()
    _GUICtrlStatusBar_SetText($StatusBar, "Degree from Slider:", 0)
    _GUICtrlStatusBar_SetText($StatusBar, "Image Dimension:", 2)
    _GUICtrlStatusBar_SetText($StatusBar, $iX & " x " & $iY, 3)
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hwnd)
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iX, $iY, $hGraphic)
    Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    Global $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, $iX / 2, $iY / 2)
    Rotate_Image(0)

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

    $d = GUICtrlRead($Slider)
    _GUICtrlStatusBar_SetText($StatusBar, $d & "° ", 1)
    While Sleep(30)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $Button3
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_MatrixDispose($hMatrix)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    DllClose($dll)
    Exit
    Case $Button1
    $d = GUICtrlRead($Input1)
    If StringIsInt($d) Then
    Rotate_Image(Int($d))
    Else
    MsgBox(16, "Error", "Please enter an integer from -359 - 359!")
    EndIf
    Case $Button2
    $sCLSID = _GDIPlus_EncodersGetCLSID ($encoder)
    $path = @ScriptDir & "\Saved_"
    $date = @YEAR & "-" & @MON & "-" & @MDAY & "_" & @HOUR & @MIN & @SEC
    $suffix = "." & StringLower($encoder)
    _GDIPlus_Save_to_Image($path & $date & $suffix, $hwnd, $encoder, $iX, $iY)
    If Not @error Then
    MsgBox(0, "Information", "Image successfully save to: " & $path & $date & $suffix)
    Else
    MsgBox(16, "Error", "Image could not be saved!")
    EndIf
    Case $Slider, _IsPressed("01")
    $d = GUICtrlRead($Slider)
    _GUICtrlStatusBar_SetText($StatusBar, $d & "° ", 1)
    Rotate_Image(Int($d))
    EndSwitch
    WEnd

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

    Func Rotate_Image($degree)
    _GDIPlus_GraphicsClear($hBackbuffer, 0xFFF0F0F0)
    _GDIPlus_MatrixRotate($hMatrix, $degree, "False")
    _GDIPlus_GraphicsSetTransform($hBackbuffer, $hMatrix)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hImage, -$iX / 2, -$iY / 2, $iX, $iY)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iX, $iY)
    EndFunc

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

    ; #FUNCTION# =============================================================================
    ; Name...........: _GDIPlus_Save_to_Image
    ; Description ...: INTERNAL FUNCTION - save drawn image to file
    ; Syntax.........: _GDIPlus_Save_to_Image($file, $hWnd, $CLSID, $w, $h)
    ; Parameters ....: $file - filename
    ; $hWnd - handle to GUI
    ; Autor .........: ptrex, ProgAndy, UEZ
    ; =========================================================================================
    Func _GDIPlus_Save_to_Image($file, $hWnd, $CLSID = "PNG", $w = 0, $h = 0)
    Local $hDC, $memBmp, $memDC, $hImage, $size, $sCLSID
    If $file <> "" Or $hWnd <> "" Then
    If $w = 0 Or $h = 0 Then
    $size = WinGetClientSize($hWnd)
    $w = $size[0]
    $h = $size[1]
    EndIf
    $hDC = _WinAPI_GetDC($hWnd)
    $memDC = _WinAPI_CreateCompatibleDC($hDC)
    $memBmp = _WinAPI_CreateCompatibleBitmap($hDC, $w, $h)
    _WinAPI_SelectObject ($memDC, $memBmp)
    _WinAPI_BitBlt($memDC, 0, 0, $w, $h, $hDC, 0, 0, 0x00CC0020) ; 0x00CC0020 = $SRCCOPY
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP ($memBmp)
    $sCLSID = _GDIPlus_EncodersGetCLSID ($CLSID)
    _GDIPlus_ImageSaveToFileEx ($hImage, $file, $sCLSID)
    If @error Then
    Return SetError(1, 0, 0)
    Else
    Return SetError(0, 0, 0)
    EndIf
    _GDIPlus_ImageDispose ($hImage)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    _WinAPI_DeleteDC($memDC)
    _WinAPI_DeleteObject ($memBmp)
    Else
    Return SetError(1, 0, 0)
    EndIf
    EndFunc

    [/autoit]


    Es ist nicht besonderes, aber vielleicht ist es ja für irgend jemanden mal nützlich! Vielleicht gibt es ja solche Beispiele hier in diesem Forum ohne Ende...

    @Hamburger: Wolltest du sowas haben :D

    Gruß,
    UEZ

    Edit: Hab's ein bißchen angepasst

    Dateien

    Image Rotation and Save.au3 5,75 kB – 660 Downloads
  • _Au3Optim (Inline-Funktionen und Code-Optimierung)

    • UEZ
    • 23. Dezember 2009 um 12:17

    Hier die Version, die ich benutze.

    Unter GFX\3D Axis\Source\3DAxis_Test_Obfuscated.au3 ist der Code, das mit _Au3Optim.au3 geladen wird (auch im Anhang)!

    3D Axis

    Gruß,
    UEZ

  • _Au3Optim (Inline-Funktionen und Code-Optimierung)

    • UEZ
    • 23. Dezember 2009 um 11:53

    Bekomme jetzt ein Fehler beim Ausführen in folgerder Zeile (etwa um die 350):

    [autoit]


    ; replace arguments from function-call inside the function
    $iAC = UBound($aArgsC) - 1
    If $aArgsC[0] Then
    For $j = 0 To $iAC
    $sArg = StringReplace(StringStripWS($sArg, 3), StringStripWS($aArgs[$j], 3), StringStripWS($aArgsC[$j], 3), 0, 2) ;<=-------- hier
    Next
    EndIf

    [/autoit]
    Code
    C:\Coding\AU3\Tools\_Au3Optim.au3 (351) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $sArg = StringReplace(StringStripWS($sArg, 3), StringStripWS($aArgs[$j], 3), StringStripWS($aArgsC[$j], 3), 0, 2)
    $sArg = StringReplace(StringStripWS($sArg, 3), StringStripWS(^ ERROR

    Gruß,
    UEZ

  • _Au3Optim (Inline-Funktionen und Code-Optimierung)

    • UEZ
    • 21. Dezember 2009 um 14:40

    Was ist $__DEBUG__ für eine Variable in _Au3Optim.au3?

    Jetzt wird aus $a4l = GUICreate("", $a7u, $a7v, -1, -1, BitOR($a6e, $a6g, $a6i, $a6j, $a6f)) -=> $a4l = GUICreate("", 720, 480, -1, -1, )!

    UEZ

  • _Au3Optim (Inline-Funktionen und Code-Optimierung)

    • UEZ
    • 21. Dezember 2009 um 12:23

    Ich habe mal AUTOITEROIDS benutzt und ich bekomme folgende Fehler:

    • die Zeile Global Const $ab8 = 15, $ab9 = 10, $aba = 60, $abb = 6 wird komplett gelöscht, ohne dass die Werte eingetragen werden!
    • aus If Mod(Random(1, 15, 1), 7 - $a8y) = 0 Then wird If , 7 - $a8y) = 0 Then bzw. aus $acz = Mod(Random(1, 3, 1), 3) wird $acz = , 3)


    Gruß,
    UEZ

  • GetMonitor-Funktion testen

    • UEZ
    • 21. Dezember 2009 um 11:26

    Hier die Datei erzeugt mit AutoIt v3.3.2.0 auf Vista x32.

    Hardware: Dell Latitude D830 und ext. TFT ViewSonic. Im Gerätemanager werden beide Monitore als PnP Geräte erkannt.

    Gruß,
    UEZ

    Dateien

    !Monitor-Info.txt 308 Byte – 415 Downloads
  • Computernamen über IP im Lan ausgeben lassen

    • UEZ
    • 21. Dezember 2009 um 11:16
    Zitat von Aquaplant

    Ok danke. Ich würd das mit dem Namen aber gerne in mein Script integrieren und kein externes Programm benutzen. Dann ist das beides gleich auf einen Schlag gemacht und ich wieder etwas mehr an Autoiterfahrung gesammelt :)

    Was für ein externes Programm? WMI ist intern! Für eine Namensauflösung brauchst du ein DNS oder du musst deine hosts Datei editieren, damit du die IP Adressen auflösen kannst.

    Gruß,
    UEZ

  • Computer-Info

    • UEZ
    • 20. Dezember 2009 um 14:52

    Mir würde für SIC2 einfach ein HT = 0/1 reichen!

    Danke,
    UEZ

  • _Au3Optim (Inline-Funktionen und Code-Optimierung)

    • UEZ
    • 20. Dezember 2009 um 13:54

    Hallo Stilgar,

    hier noch ein Fehler:

    aus

    • $a5a = _1h_(Int((_1g_(@AutoItPID) + _1g_($a7p)) / 1024)) wird $a5a = _1h_(Int _1g_(@AutoItPID) + _1g_($a7p) / 1024)) (die Klammern sind nicht mehr richtig).
    • $acu = StringMid($a3u[1], StringInStr($a3u[1], ":Win32_") + 7,(StringInStr($a3u[1], ".") -(StringInStr($a3u[1], ":Win32_") + 7))) wird $acu = StringMid($a3u[1], StringInStr($a3u[1], ":Win32_") + 7 StringInStr($a3u[1], ".") -(StringInStr($a3u[1], ":Win32_") + 7)) (hier fehlt das Komma nach der 7 und eine Klammer am Ende).

    Gruß,
    UEZ

  • Computer-Info

    • UEZ
    • 19. Dezember 2009 um 22:54

    Danke Oscar!

    Kann jemand das auf einem System testen, wo HT aktiviert ist?

    UEZ

  • Computernamen über IP im Lan ausgeben lassen

    • UEZ
    • 19. Dezember 2009 um 21:41

    Dein Skript verfolgt einen ganz anderen Ansatz, deshalb macht es keinen Sinn mein Skript in dein Skript zu integrieren.

    Zeile 5 oder If $CmdLine[0] > 0 Then $ip = $CmdLine[1] ist dafür gedacht, dass du aus der CMD Box einen Parameter mitgeben kannst, wie z.B. GetName.exe 10.10.10.10

    Dadurch würdest du die Build-in IP Adresse (192.168.178.201) übergehen und anstelle die 10.10.10.10 benutzen.
    Wichtig dabei ist, dass Zeile 2 (#AutoIt3Wrapper_Change2CUI=y) existiert, so dass das Skript somit CMD fähig wird!

    WMI hat den Vorteil, dass du eine Menge von den Systemen abfragen kannst, auch von Remote Systemen! Der WMI Dienst muss nur laufen. Nachteil: relativ langsam.

    Ein Klasse Tool ist Scriptomatic von MS! WBEMTest (Build-in Tool) ist nett zum reinschauen!

    Gruß,
    UEZ

  • Computer-Info

    • UEZ
    • 19. Dezember 2009 um 21:29
    Zitat von Oscar

    UEZ: Ab Win_Vista müssten beim TAB "Prozessor" die beiden Einträge "Prozessorkerne" und "logische Prozessoren" angezeigt werden. WindowsXP stellt diese Einträge per WMI leider nicht zur Verfügung.

    Ich weiß, dass man ab Vista die Anzahl der Cores expliziet herauslesen kann (NumberOfCores / NumberOfLogicalProcessors in Win32_Processor), aber ich suche nach einer Möglichkeit für System kleiner Vista / Server2008. ;)

    Dachte nur, dass du was hättest...

    Gruß,
    UEZ

  • Computer-Info

    • UEZ
    • 19. Dezember 2009 um 18:06

    Kann dein Skript auch auslesen, ob eine CPU Hyper Threading unterstützt?

    Ach ja, tolles Skript! :thumbup:

    Gruß,
    UEZ

  • Computernamen über IP im Lan ausgeben lassen

    • UEZ
    • 19. Dezember 2009 um 18:00

    Hier die WMI Version:

    [autoit]


    ;Coded by UEZ 2009
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_UseUpx=n
    Global $ip = "192.168.178.201"
    If $CmdLine[0] > 0 Then $ip = $CmdLine[1]

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

    $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $ip & "\root\cimv2")

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

    MsgBox(0, "Computer Name", "IP: " & $ip & @CRLF & @CRLF & "Computer Name: " & GetName($ip))

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

    Func GetName($srv)
    Local $name, $colItems, $colItem, $ping
    $ping = Ping($srv)
    If $ping Then
    $colItems = $objWMIService.ExecQuery("Select Name from Win32_ComputerSystem", "WQL", 0x30)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $name = $objItem.Name
    Next
    SetError(0)
    Return $name
    Else
    SetError(1)
    Return "Error!"
    EndIf
    Else
    SetError(1)
    Return "Host not reachable"
    EndIf
    EndFunc

    [/autoit]

    Gruß,
    UEZ

  • Verschiedene GDI+ Grafiken zeichnen und verschieben

    • UEZ
    • 18. Dezember 2009 um 23:24

    Ich glaube für ein Objekt gibt es nichts wirklich schnelleres, außer ASM Code, aber wie würde das Ganze aussehen, wenn nicht 1 Objekt, sondern 100 Objekte so bewegt werden würden?
    Und was ist mit der Größe der "Sprites"?

    Ich habe es nicht getestet, aber ich glaube, dass ab einer Anzahl von n Objekte, in Abhängigkeit der Größe der Sprites, der Zeitgewinn sich gegenüber der Buffer Methode ammortisiert.

    Anyway, da ich durch ein paar simple GDI+ Beispiele hier einen zu guten Ruf bekommen habe, werde ich mal überlegen, ob was noch geht!

    Gruß,
    UEZ

  • Verschiedene GDI+ Grafiken zeichnen und verschieben

    • UEZ
    • 18. Dezember 2009 um 16:34

    Und ohne Backbuffer flackern die Objekte! ;)

    Gruß,
    UEZ

  • Verschiedene GDI+ Grafiken zeichnen und verschieben

    • UEZ
    • 18. Dezember 2009 um 14:43

    Genau, denn du erstellst ja das Gesamtbild, indem du einzelne Objekte in den Buffer schreibst und anschließend das komplette Bild in den sichtbaren Bereich kopierst.

    Es sei denn, du hast n Layer die du übereinander legen würdest (pro Objekt), dann könntest du jedes Objekt einzeln ansprechen.

    Gruß,
    UEZ

  • Verschiedene GDI+ Grafiken zeichnen und verschieben

    • UEZ
    • 18. Dezember 2009 um 13:42
    Zitat von Jautois

    Es gibt also keine Möglichkeit nur eine einzelne Grafik über eine Funktion "anzusprechen" und diese dann an anderer Stelle zu zeichnen. Das sehe ich doch richtig so oder?

    Verstehe dich nicht - wie meinst du das?

    UEZ

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™