So, jetzt gibt es auch noch Smileys (siehe Post#1). ![]()
Beiträge von Oscar
-
-
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...
-
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. -
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. -
Sehr hilfreich!
Jetzt muss man nicht erst das Script starten, um zu sehen, wie die Farbe aussieht. -
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. -
Dann musst Du halt den Bereich entsprechend skalieren, sodass die Werte in das Diagramm passen.
Hier mal ein Beispiel:AutoIt
Alles anzeigen#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 -
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
Alles anzeigen#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 -
-
-
-
-
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. -
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
-
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.
-
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? -
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
Alles anzeigen#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 -
Die Hilfe sagt dazu:
ZitatThe 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.
-
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. -
Nach einigen Stunden Trial & Error habe ich nun doch eine Lösung gefunden:
AutoIt
Alles anzeigen#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) EndFuncMit dieser Lösung bin ich erstmal zufrieden. Wenn jemand noch einen anderen Weg kennt, immer her damit...
