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. Oscar

Beiträge von Oscar

  • Verschiedene GUI-Elemente

    • Oscar
    • 30. Juli 2015 um 18:10

    So, jetzt gibt es auch noch Smileys (siehe Post#1). :)

  • Verschiedene GUI-Elemente

    • Oscar
    • 28. Juli 2015 um 14:28

    Weil Du nicht die aktuelle AutoIt-Version (v3.3.14.0) installiert hast!
    Die Funktion gibt es erst seit der neuen Version. Siehe auch die erste Zeile in Post#1. ;)

    chesstiger : Mit Subclassing habe ich mich noch nicht beschäftigt. Ein Tutorial fände ich aber interessant. Wenn Du Dir die Mühe nochmal machen würdest...

  • Verschiedene GUI-Elemente

    • Oscar
    • 27. Juli 2015 um 18:13

    Achtung: Es wird die aktuelle AutoIt-Version (v3.3.14.0) benötigt!

    So, hier gibt es jetzt mehrere neue GUI-Elemente.
    Man kann diese über #Include "_GUICtrl..." in eigene Projekte einbinden.

    1. GUI-Element ist "_GUICtrlBatterieLevel.au3":
    Damit kann man eine/mehrere Batterie(n) auf der GUI erzeugen ("_GUICtrlBatterieLevel_Create"). Der Füllstand (Prozent) der Batterie lässt sich mit ("_GUICtrlBatterieLevel_SetData") festlegen.
    Screenshot:



    2. GUI-Element ist "_GUICtrlLightBulb.au3":
    Damit kann man eine/mehrere Glühlampe(n) auf der GUI erzeugen ("_GUICtrlLightBulb_Create"). Ob die Glühlampe(n) an oder aus sein sollen, kann man mit ("_GUICtrlLightBulb_SetData") festlegen.
    Screenshot:

    3. GUI-Element ist "_GUICtrlProgress.au3":
    Damit kann man eine/mehrere Progressbar(s) auf der GUI erzeugen ("_GUICtrlProgress_Create"). Der Füllstand (Prozent) und die Farbe (RGB) der Progressbar(s) lässt sich mit ("_GUICtrlProgress_SetData") festlegen.
    Screenshot:

    4. GUI-Element ist "_GUICtrlTrafficLight.au3":
    Damit kann man eine/mehrere Ampel(n) auf der GUI erzeugen ("_GUICtrlTrafficLight_Create"). Die Ampelphasen lassen sich mit ("_GUICtrlTrafficLight_SetData") festlegen.
    Screenshot:

    5. GUI-Element ist "_GUICtrlSmiley.au3":
    Damit kann man einen/mehrere Smiley(s) auf der Gui erzeugen ("_GUICtrlSmiley_Create"). Es stehen 12 verschiedene Smileys zur Verfügung, die man mit ("_GUICtrlSmiley_SetData") ändern kann. Hier gibt es auch noch die Möglichkeit die Größe der Smileys festzulegen. Standardgröße ist 256 Pixel, alle anderen Größen werden vor der Anzeige skaliert.
    Screenshot:
    _GUICtrlSmiley.png


    Alle UDFs sowie die entsprechenden Beispiele findet ihr als ZIP-Archiv bei den Dateianhängen.



    Dateien

    _GUICtrlBatterieLevel.zip 3,51 kB – 473 Downloads _GUICtrlLightBulb.zip 30,85 kB – 433 Downloads _GUICtrlProgress.zip 3,16 kB – 467 Downloads _GUICtrlTrafficLight.zip 37,38 kB – 467 Downloads _GUICtrlSmiley.zip 686,14 kB – 467 Downloads
  • AutoIT ist ein Virus.

    • Oscar
    • 24. Juli 2015 um 14:58
    Zitat von Chugy

    Ich werde auf meine Homepage schreiben das Avast der letzte Menschliche verbale Dreck ist UND, dass es das einzige Virenprogramm ist was es als VIRUS darstellt.

    Ich denke, dass ist eine ganz schlechte Idee!
    Unter Umständen handelst Du Dir damit eine Menge Ärger (Abmahnung, etc.) ein.

    Eine Mail an Avast (sachlich, ohne Beleidigungen) bringt sicherlich viel mehr.
    Die AV-Hersteller sind genauso daran interessiert, dass die False-Positive-Rate möglichst gering ausfällt.

  • SciTE - Farbe eines Hexwertes im Skript anzeigen

    • Oscar
    • 20. Juli 2015 um 10:22

    Sehr hilfreich!
    Jetzt muss man nicht erst das Script starten, um zu sehen, wie die Farbe aussieht.

  • XY Diagramm als GUI Darstellen

    • Oscar
    • 20. Juli 2015 um 05:21
    Zitat von Bass_tii

    Hmm also so ganz gefällt mir das Script leider nicht.

    Das ist ja auch kein fertiges Script! Das war als Beispiel gedacht.
    Wir sind hier in "Hilfe und Unterstützung". Wenn Du etwas fertiges haben willst, dann "Programmieranfragen".
    Ein bißchen Eigenleistung ist hier schon gefordert.

  • XY Diagramm als GUI Darstellen

    • Oscar
    • 19. Juli 2015 um 17:53

    Dann musst Du halt den Bereich entsprechend skalieren, sodass die Werte in das Diagramm passen.
    Hier mal ein Beispiel:

    AutoIt
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <WindowsConstants.au3>
    
    
    Global $aCoord = StringSplit('2940,2895,2895,2410,2510,2710,2910,2910,2955,2405,2535,2678,2598,2622,2410,2999', ',')
    _GDIPlus_Startup()
    
    
    Global Const $iW = 640, $iH = 480
    
    
    Global $hGui = GUICreate('Liniendiagramm', $iW, $iH)
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    
    
    Global $hBuffer = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Global $hBmpCtxt = _GDIPlus_ImageGetGraphicsContext($hBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hBmpCtxt, $GDIP_SMOOTHINGMODE_HIGHQUALITY)
    _GDIPlus_GraphicsSetCompositingQuality($hBmpCtxt, 3)
    _GDIPlus_GraphicsClear($hBmpCtxt, 0xFFFFFFFF)
    
    
    GUISetState(@SW_SHOW, $hGui)
    GUIRegisterMsg($WM_PAINT, '_WM_PAINT')
    
    
    Global $iX = 0, $iY = $iH, $iXStep = $iW / ($aCoord[0] - 1), $iScaleFactor = $iH / 3500
    _GDIPlus_GraphicsDrawLine($hBmpCtxt, 0, 0, $iX, $iY)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBuffer, 0, 0)
    For $i = 1 To $aCoord[0]
    	_GDIPlus_GraphicsDrawLine($hBmpCtxt, $iX, $iY, ($i - 1) * $iXStep, $iH - $aCoord[$i] * $iScaleFactor)
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBuffer, 0, 0)
    	$iX = ($i - 1) * $iXStep
    	$iY = $iH - $aCoord[$i] * $iScaleFactor
    Next
    
    
    Do
    Until GUIGetMsg() = -3
    _GDIPlus_BitmapDispose($hBuffer)
    _GDIPlus_GraphicsDispose($hBmpCtxt)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    
    
    
    
    Func _WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBuffer, 0, 0)
    EndFunc
    Alles anzeigen
  • XY Diagramm als GUI Darstellen

    • Oscar
    • 19. Juli 2015 um 17:14

    Naja, das hängt natürlich von den Daten ab und wie Du sie darstellen willst.
    Soll die Y-Achse nur positive Werte anzeigen oder auch Negative? Wie groß sind die Werte? Wie sieht die Zeitachse aus? Wie viele Werte sollen dargestellt werden? Und so weiter...
    Aber hier mal ein Beispiel mit GDI+

    AutoIt
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <WindowsConstants.au3>
    
    
    Global $aCoord = StringSplit('0,10,-5,23,-56,44,78,-35,-88,65,-43,77,-23,-16,-20,32,-45,5,-80,56', ',')
    
    
    _GDIPlus_Startup()
    
    
    Global Const $iW = 640, $iH = 480
    
    
    Global $hGui = GUICreate('Liniendiagramm', $iW, $iH)
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    
    
    Global $hBuffer = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Global $hBmpCtxt = _GDIPlus_ImageGetGraphicsContext($hBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hBmpCtxt, $GDIP_SMOOTHINGMODE_HIGHQUALITY)
    _GDIPlus_GraphicsClear($hBmpCtxt, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawLine($hBmpCtxt, 0, $iH / 2, $iW, $iH / 2)
    
    
    GUISetState(@SW_SHOW, $hGui)
    GUIRegisterMsg($WM_PAINT, '_WM_PAINT')
    
    
    Global $iX = 0, $iY = $iH / 2, $iXStep = 10
    _GDIPlus_GraphicsDrawLine($hBmpCtxt, 0, 0, $iX, $iY)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBuffer, 0, 0)
    For $i = 1 To $aCoord[0]
    	_GDIPlus_GraphicsDrawLine($hBmpCtxt, $iX, $iY, $i * $iXStep, $iY - $aCoord[$i])
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBuffer, 0, 0)
    	$iX = $i * $iXStep
    	$iY -= $aCoord[$i]
    Next
    
    
    Do
    Until GUIGetMsg() = -3
    _GDIPlus_BitmapDispose($hBuffer)
    _GDIPlus_GraphicsDispose($hBmpCtxt)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    
    
    
    
    Func _WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBuffer, 0, 0)
    EndFunc
    Alles anzeigen
  • _WinAPI_FindTextDlg() - Example --> APPCRASH - Fehlermodulname: StackHash_f32c

    • Oscar
    • 19. Juli 2015 um 13:13

    Bei mir (Win 7, 64 Bit, AutoIt v3.3.14.0) crasht das Script auch:

    Zitat


    "C:\Program Files (x86)\AutoIt3\Examples\Helpfile\_WinAPI_FindTextDlg.au3" (113) : ==> Subscript used on non-accessible variable.:
    If ($aPos[0] = -1) Or ($aPos[1] = -1) Then
    If ($aPos^ ERROR
    ->13:11:14 AutoIt3.exe ended.rc:1

  • _WinAPI_FindTextDlg() - Example --> APPCRASH - Fehlermodulname: StackHash_f32c

    • Oscar
    • 19. Juli 2015 um 12:44

    Andy meint damit, dass $hRichEdit einmal als globale Variable für das Richedit-Control verwendet wird und einmal als lokale Variable für den Pointer.
    Innerhalb der Funktion wird die Pointer-Variable für die Befehle verwendet, was offensichtlich zum Crash führt (Script fehlerhaft).

  • _WinAPI_FindTextDlg() - Example --> APPCRASH - Fehlermodulname: StackHash_f32c

    • Oscar
    • 19. Juli 2015 um 10:39
    Zitat von Andy

    Schaut euch mal die Verwendung der Variable $hRichEdit an, in der Funktion WM_FINDMSGSTRING wird sie einmal als Pointer verwendet, und gleichzeitig als Handle für´s Richedit-Control der GUI.

    Aua! Wer schreibt denn solche Beispiel-Scripte? ?(

  • _WinAPI_FindTextDlg() - Example --> APPCRASH - Fehlermodulname: StackHash_f32c

    • Oscar
    • 19. Juli 2015 um 09:38

    Schmeiss mal die MsgBoxen aus der WM-Register-Funktion raus!
    Diese Funktion muss so schnell wie möglich wieder verlassen werden und darf auf keinen Fall durch eine MsgBox oder ähnliches blockiert werden.

  • Probleme mit Is Declared

    • Oscar
    • 19. Juli 2015 um 09:25

    Das ganze Problem entsteht doch erst durch die Verwendung von Assign und Eval. Weg damit und ein Array benutzen.
    Dieses einzelne einlesen der Iniwerte sieht auch schrecklich aus. Wozu gibt es IniReadSection.

  • Datei auf dem kompletten Laufwerk suchen und löschen...

    • Oscar
    • 16. Juli 2015 um 18:27

    AspirinJunkie:
    Für den Test habe ich sogar noch meinen Rechner neu gestartet. :)
    Dein Script ist in der Tat noch schneller: ca. 126 sek. beim ersten Durchlauf und ca. 5 sek. beim zweiten Durchlauf.

    Und die Platte ist nicht die neueste/schnellste: 5400 rpm / SATA300 / 32 MB Puffer

  • Datei auf dem kompletten Laufwerk suchen und löschen...

    • Oscar
    • 16. Juli 2015 um 17:53

    Wobei ich jetzt auch die rekursive Suche auf der ganzen Platte nicht so tragisch finden würde.
    Habe das gerade mal mit meiner "F"-Platte (keine SSD) gemacht (2 TB, davon 1.5 TB belegt mit ca. 600.000 Dateien in mehr als 10.000 Ordnern).
    Das Script hat 154 sek. gebraucht um alle Dateien zu durchsuchen:

    AutoIt
    #include <Array.au3>
    #include <File.au3>
    $iTimer = TimerInit()
    $aFileList = _FileListToArrayRec('f:\', 'ca2di.exe', $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
    ConsoleWrite(TimerDiff($iTimer) & @CR)
    _ArrayDisplay($aFileList)

    und das beim ersten Suchlauf, also ohne dass sich das Directory im Cache befindet. Beim zweiten Start dauert das ganze nur 6-7 sek.

  • Programm zum durchsuchen von .inf Datein

    • Oscar
    • 15. Juli 2015 um 15:48

    Außerdem:
    Die erste While...WEnd-Schleife ist überflüssig.
    Eine Datei zeilenweise einzulesen (noch dazu ohne ein Handle zu benutzen) ist sehr langsam. _FileReadToArray und anschließend das Array zu durchsuchen ist erheblich schneller.


    Zitat

    $b = & i + $z

    ist von der Syntax her falsch. Mal abgesehen davon, dass man das nicht extra einer/zwei Variablen zuweisen muss = FileReadLine($datei, $i + 2) würde auch gehen, aber die Schleife darf dann auch nicht bis zum Ende der Zeilen durchlaufen. Aber wie gesagt: _FileReadToArray.
    Insgesamt fehlt auch die Fehlerbehandlung. Was ist, wenn die Datei nicht existiert?

  • GUICtrlCreateTab() TopRight Background

    • Oscar
    • 14. Juli 2015 um 18:00

    Was einem Tab am nächsten kommt, ist eine Gui mit mehreren Child-Guis und Checkboxen mit besonderen Style. Damit lässt sich dann schon etwas ähnliches hinkriegen:

    AutoIt
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    
    Opt('GUIOnEventMode', 1)
    
    
    Global $hMainGui = GUICreate('Test', 800, 600)
    GUISetBkColor(0x005588)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseMainGui')
    
    
    Global $aidTab[3], $ahTab[3], $aColor[3] = [0xFFAAAA, 0xAAFFAA, 0xAAAAFF], $iOld = -1
    For $i = 0 To UBound($aidTab) - 1
    	$aidTab[$i] = GUICtrlCreateCheckbox('Tab' & $i + 1, 50 + $i * 100, 48, 100, 28, BitOR($BS_AUTORADIOBUTTON, $BS_PUSHLIKE))
    	GUICtrlSetFont(-1, 10, 400, 0, 'Arial')
    	GUICtrlSetOnEvent(-1, '_TabClick')
    Next
    Global $aPos = WinGetPos($hMainGui)
    For $i = 0 To UBound($aidTab) - 1
    	$ahTab[$i] = GUICreate('', 700, 500, 50, 78, $WS_POPUP, $WS_EX_MDICHILD, $hMainGui)
    	GUISetBkColor($aColor[$i], $ahTab[$i])
    Next
    
    
    GUISwitch($ahTab[0])
    GUICtrlCreateLabel('Das hier steht auf Tab 1', 10, 50, 200, 20)
    
    
    GUISwitch($ahTab[1])
    GUICtrlCreateLabel('Das hier steht auf Tab 2', 10, 50, 200, 20)
    
    
    GUISwitch($ahTab[2])
    GUICtrlCreateLabel('Das hier steht auf Tab 3', 10, 50, 200, 20)
    
    
    GUISetState(@SW_SHOW, $hMainGui)
    ControlClick($hMainGui, '', $aidTab[0])
    WinWaitClose($hMainGui)
    Exit
    
    
    Func _CloseMainGui()
    	GUIDelete($hMainGui)
    EndFunc   ;==>_CloseMainGui
    
    
    Func _TabClick()
    	Local $iNew = @GUI_CtrlId - $aidTab[0]
    	If $iNew = $iOld Then Return
    	If $iOld = -1 Then $iOld = 0
    	GUISetState(@SW_HIDE, $ahTab[$iOld])
    	$iOld = $iNew
    	GUISetState(@SW_SHOWNOACTIVATE, $ahTab[$iNew])
    EndFunc   ;==>_TabClick
    Alles anzeigen
  • GUICtrlCreateTab() TopRight Background

    • Oscar
    • 14. Juli 2015 um 16:40

    Die Hilfe sagt dazu:

    Zitat

    The tabitem control cannot be colored (too much code ...).

    Ich fürchte, außer mit irgendwelchen Basteleien (überlagernde Labels oder ähnliches) wirst Du das nicht hinbekommen.

  • GUICtrlPic nach dem laden mit GDI+ wieder leeren (transparent)

    • Oscar
    • 13. Juli 2015 um 05:30

    Stimmt, das funktioniert (in diesem Beispiel).
    Ich wollte das Problem auf ein kurzes Beispiel reduzieren und habe dabei übersehen, dass das Beispiel nicht ganz das macht, was das eigentliche Script macht.
    _GDIPlus_GraphicsClear($hGfxCtxt, 0x00000000) habe ich nämlich bereits im Script drin. Beim rumprobieren ist mir aufgefallen, dass es entscheidend ist, dass
    das Anfangs Graphic-Object bereits gelöscht ist, wenn die zweite Graphic angezeigt werden soll.
    Du musst Dir das also wie in meinem zweiten Post vorstellen. Vor der MsgBox sind die Bitmap, die Graphic und das Image bereits gelöscht und werden beim zweiten
    Bild neu erstellt.

  • GUICtrlPic nach dem laden mit GDI+ wieder leeren (transparent)

    • Oscar
    • 12. Juli 2015 um 19:58

    Nach einigen Stunden Trial & Error habe ich nun doch eine Lösung gefunden:

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WinAPI.au3>
    #include <WinAPIConstants.au3>
    #include <WindowsConstants.au3>
    
    
    
    
    Opt('GUIOnEventMode', 1)
    
    
    $sPath = 'c:\Program Files (x86)\AutoIt3\Examples\GUI\'
    
    
    _GDIPlus_Startup()
    
    
    $hGui = GUICreate('Test', 800, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui')
    GUISetBkColor(0xF0F0F0)
    GUICtrlCreatePic($sPath & 'msoobe.jpg', 0, 0, 800, 600)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $idPic = GUICtrlCreatePic('', 80, 60, 440, 440)
    GUISetState(@SW_SHOW, $hGui)
    
    
    $hPic = GUICtrlGetHandle($idPic)
    $aCtrlSize = WinGetClientSize($hPic)
    $hBitmap = _GDIPlus_BitmapCreateFromScan0($aCtrlSize[0], $aCtrlSize[1])
    $hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $hImage = _GDIPlus_BitmapCreateFromFile($sPath & 'Torus.png')
    
    
    _GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $hImage, 0, 0, $aCtrlSize[0], $aCtrlSize[1])
    $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    _WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP))
    _WinAPI_DeleteObject($hBMP)
    _GDIPlus_GraphicsDispose($hGfxCtxt)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hImage)
    
    
    MsgBox(0, 'Test', 'Nach dem schließen dieser MsgBox soll das große Bild Torus.png weg sein' & @CR & 'und nur noch das kleine Bild angezeigt werden.')
    _WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, -1)) ; den alten Inhalt löschen
    _WinAPI_RedrawWindow($hGui, 0, 0, $RDW_INVALIDATE + $RDW_ALLCHILDREN) ; Fenster neuzeichnen
    
    
    $hBitmap = _GDIPlus_BitmapCreateFromScan0($aCtrlSize[0], $aCtrlSize[1])
    $hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $hImage = _GDIPlus_BitmapCreateFromFile($sPath & 'Torus.png')
    _GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $hImage, 0, 0, $aCtrlSize[0] / 2, $aCtrlSize[1] / 2)
    $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    _WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP))
    _WinAPI_DeleteObject($hBMP)
    
    
    _WinAPI_RedrawWindow($hGui, 0, 0, $RDW_INVALIDATE + $RDW_ALLCHILDREN) ; Fenster neuzeichnen
    
    
    WinWaitClose($hGui)
    _GDIPlus_GraphicsDispose($hGfxCtxt)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_Shutdown()
    Exit
    
    
    Func _CloseGui()
    	GUIDelete($hGui)
    EndFunc
    Alles anzeigen

    Mit dieser Lösung bin ich erstmal zufrieden. Wenn jemand noch einen anderen Weg kennt, immer her damit... :)

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™