Auf welche Methode bezieht sich Deine Frage?
Beiträge von Oscar
-
-
Aber solche Methoden können die Lesbarkeit des Codes um einiges erhöhen.
Ja, an Enum hatte ich zuerst auch gedacht, aber ich finde die Structs doch noch besser, weil man da notfalls auch gleich einen Pointer auf die Daten hat (für evtl. Assembler-Routinen) und weil man beim Laden/Speichern nicht verschachtelte Schleifen und Trennzeichen braucht.
-
Für mein aktuelles Projekt machte ich mir gerade darüber Gedanken, wie ich die Datensätze im Programm verwalten will und kam zu dem Schluß, dass ein "Array of struct" eigentlich ganz gut dafür geeignet ist.
Vor allem sieht man im Quelltext dann auch gleich welche Daten wo liegen, weil man sie über die Punktnotation ansprechen kann. Das ist gegenüber einem 2D-Array ein großer Vorteil.
Aber auch das Laden und Speichern der Daten ist so viel unkomplizierter. Vielleicht könnt ihr das ja auch gebrauchen...
Hier mal ein Beispiel dazu:
AutoIt
Alles anzeigen#include <WinAPIHObj.au3> #include <WinAPIInternals.au3> ; Datenstruktur definieren Global Const $tagWORKER = 'struct;uint ID;char Nachname[60];char Vorname[60];char Geburtstag[8];' & _ 'char Strasse[60];char HausNr[6];char PLZ[5];char Wohnort[60];char TelNr[20];endstruct' ; Das "Array of struct" erstellen Global $g_aWorker[2] For $i = 0 To UBound($g_aWorker) - 1 $g_aWorker[$i] = DllStructCreate($tagWORKER) Next #Region "Array of struct" mit Testdaten fuellen $g_aWorker[0].ID = 10000 $g_aWorker[0].Nachname = 'Meiselbach' $g_aWorker[0].Vorname = 'Karl-Heinz' $g_aWorker[0].Geburtstag = '19640428' $g_aWorker[0].Strasse = 'Josef-Zinnbauer-Straße' $g_aWorker[0].HausNr = '308D' $g_aWorker[0].PLZ = '75633' $g_aWorker[0].Wohnort = 'Hintertupfingen' $g_aWorker[0].TelNr = '+49 7366 783411' $g_aWorker[1].ID = 10001 $g_aWorker[1].Nachname = 'Rotfuss' $g_aWorker[1].Vorname = 'Theodor' $g_aWorker[1].Geburtstag = '19591030' $g_aWorker[1].Strasse = 'Am alten Forsthaus' $g_aWorker[1].HausNr = '33' $g_aWorker[1].PLZ = '58721' $g_aWorker[1].Wohnort = 'Kronsbach' $g_aWorker[1].TelNr = '+49 4862 11598' #EndRegion ConsoleWrite('Vor dem speichern auf Festplatte:' & @CRLF) ConsoleWrite('$g_aWorker[0].Nachname = ' & $g_aWorker[0].Nachname & @CRLF) ConsoleWrite('$g_aWorker[0].Wohnort = ' & $g_aWorker[0].Wohnort & @CRLF) ConsoleWrite('$g_aWorker[0].TelNr = ' & $g_aWorker[0].TelNr & @CRLF) ConsoleWrite('$g_aWorker[1].Nachname = ' & $g_aWorker[1].Nachname & @CRLF) ConsoleWrite('$g_aWorker[1].Wohnort = ' & $g_aWorker[1].Wohnort & @CRLF) ConsoleWrite('$g_aWorker[1].TelNr = ' & $g_aWorker[1].TelNr & @CRLF & @CRLF) Global Const $sDatafile = @ScriptDir & '\Data.bin' _WriteData($sDatafile) ; alle Daten auf Festplatte speichern $g_aWorker = 0 ; Array of struct loeschen _ReadData($sDatafile) ; die Daten wieder von der Festplatte laden ConsoleWrite('Nach dem laden von Festplatte:' & @CRLF) ConsoleWrite('$g_aWorker[0].Nachname = ' & $g_aWorker[0].Nachname & @CRLF) ConsoleWrite('$g_aWorker[0].Wohnort = ' & $g_aWorker[0].Wohnort & @CRLF) ConsoleWrite('$g_aWorker[0].TelNr = ' & $g_aWorker[0].TelNr & @CRLF) ConsoleWrite('$g_aWorker[1].Nachname = ' & $g_aWorker[1].Nachname & @CRLF) ConsoleWrite('$g_aWorker[1].Wohnort = ' & $g_aWorker[1].Wohnort & @CRLF) ConsoleWrite('$g_aWorker[1].TelNr = ' & $g_aWorker[1].TelNr & @CRLF) Func _WriteData($sPath) Local $hFile, $nBytes, $tData $hFile = _WinAPI_CreateFile($sPath, 1, 4) ; 1 = create file if not exist, 4 = write access If Not $hFile Then Return $tData = DllStructCreate('uint Count;') $tData.Count = UBound($g_aWorker) _WinAPI_WriteFile($hFile, $tData, DllStructGetSize($tData), $nBytes) For $i = 0 To UBound($g_aWorker) - 1 _WinAPI_WriteFile($hFile, $g_aWorker[$i], DllStructGetSize($g_aWorker[$i]), $nBytes) Next _WinAPI_CloseHandle($hFile) EndFunc Func _ReadData($sPath) Local $hFile, $nBytes, $tData $hFile = _WinAPI_CreateFile($sPath, 2, 2) ; 2 = open file, 2 = read access If Not $hFile Then Return $tData = DllStructCreate('uint Count;') _WinAPI_ReadFile($hFile, $tData, DllStructGetSize($tData), $nBytes) Global $g_aWorker[$tData.Count] For $i = 0 To $tData.Count - 1 $g_aWorker[$i] = DllStructCreate($tagWORKER) _WinAPI_ReadFile($hFile, $g_aWorker[$i], DllStructGetSize($g_aWorker[$i]), $nBytes) Next _WinAPI_CloseHandle($hFile) EndFunc -
Das sieht mir doch sehr nach SPAM aus.
Das sieht mir auch danach aus. Ich habe den Beitrag gelöscht.
-
Das was die beiden aufgerufenen Funktionen machen spielt dabei, wenn überhaupt, nur eine untergeordnete Rolle.
Und genau das ist völlig falsch!
Die ExtMsgBox benutzt eine eigene MsgLoop und stellt somit einen blockierenden Code dar.
Wie soll "nebenbei" noch eine andere Funktion ausgeführt werden, wenn der Prozess bereits "blockiert" wird?
Die Lösung ist also: entweder eine eigene Gui erstellen oder die UDF umschreiben.
-
Das Syslink-Control bietet die Möglichkeit, Links ins Internet in einen Text einzubetten, wie das bei HTML-Seiten (mit: <a href="...">link</a>) möglich ist.
Man muss also nicht mehr einzelne Label-Controls zusammensetzen, um das zu erreichen.
Zu dem Thema gibt es schon ein paar UDFs, aber da fehlte mir immer die Möglichkeit die Schriftart und -größe anzupassen.
Bei meinem Beispiel benutze ich auch die WindowProc um die Nachrichten ($WM_NOTIFY und $WM_CTLCOLORSTATIC) auszuwerten.
AutoIt
Alles anzeigen#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_UseX64=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <FontConstants.au3> #include <GUIConstantsEx.au3> #include <SendMessage.au3> #include <StructureConstants.au3> #include <WinAPIGdiDC.au3> #include <WinAPIGdiInternals.au3> #include <WinAPIHObj.au3> #include <WinAPISysInternals.au3> #include <WinAPISysWin.au3> #include <WindowsConstants.au3> Opt('GUIOnEventMode', 1) Global Const $g_iBkColor = 0xD0D0D0 Global $g_hBkBrush = _WinAPI_CreateSolidBrush($g_iBkColor) Global $g_hMainGui = GUICreate('Syslink example', 640, 240) GUISetBkColor($g_iBkColor, $g_hMainGui) GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit') Global $g_sText = 'AutoIt' & @CRLF & _ '© 1999-2022 Jonathan Bennett' & @CRLF & _ 'Homepage: <a href="https://www.autoitscript.com/site/autoit/">www.autoitscript.com</a>' & @CRLF & _ 'Homepage deutsch: <a href="https://autoit.de/wcf/">autoit.de</a>' & @CRLF & _ 'Onlinehilfe deutsch: <a href="https://autoit.de/onlinehilfe/online/html/index.htm">autoit.de/onlinehilfe</a>' Global $g_hSyslink = _WinAPI_CreateWindowEx(0, $WC_LINK, $g_sText, BitOR($WS_VISIBLE, $WS_CHILD, $WS_TABSTOP), 10, 10, 620, 200, $g_hMainGui) Global $g_hFont = _WinAPI_CreateFont(32, 0, 0, 0, 400, True, False, False, $DEFAULT_CHARSET, _ $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $PROOF_QUALITY, 0, 'Verdana') _SendMessage($g_hSyslink, $WM_SETFONT, $g_hFont, True) Global $g_hSyslinkProc = DllCallbackRegister('_SyslinkProc', 'ptr', 'hwnd;uint;long;ptr') Global $g_hProcOld = _WinAPI_SetWindowLong($g_hMainGui, $GWL_WNDPROC, DllCallbackGetPtr($g_hSyslinkProc)) GUISetState(@SW_SHOW, $g_hMainGui) WinWaitClose($g_hMainGui) Exit Func _Exit() _WinAPI_SetWindowLong($g_hMainGui, $GWL_WNDPROC, $g_hProcOld) _WinAPI_DeleteObject($g_hFont) _WinAPI_DeleteObject($g_hBkBrush) _WinAPI_DestroyWindow($g_hSyslink) GUIDelete($g_hMainGui) EndFunc ;==>_Exit Func _SyslinkProc($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd Local Const $tagLITEM = 'uint mask;int iLink;uint state;uint stateMask;wchar szID[48];wchar szURL[2083]' Local Const $tagNMLINK = $tagNMHDR & ';' & $tagLITEM Local $tNMHDR, $tNMLINK Switch $iMsg Case $WM_CTLCOLORSTATIC ; um die Farben beim Syslink festzulegen Switch $lParam ; $lParam = Static-hWnd, $wParam = Static-hDC Case $g_hSyslink _WinAPI_SetTextColor($wParam, 0x0000FF) ; die Textfarbe fuer die Schrift (BGR-Format) ;~ _WinAPI_SetBkColor($wParam, 0x222222) ; die Hintergrundfarbe fuer die Schrift (BGR-Format) _WinAPI_SetBkMode($wParam, $TRANSPARENT) ; der Hintergrundmodus Return $g_hBkBrush ; der Return-Brush bestimmt die Hintergrundfarbe (ausserhalb der Schrift) EndSwitch Case $WM_NOTIFY ; um auf einen Mausklick oder <RETURN> auf einen Link zu reagieren $tNMHDR = DllStructCreate($tagNMHDR, $lParam) Switch $tNMHDR.Code Case $NM_CLICK, $NM_RETURN $tNMLINK = DllStructCreate($tagNMLINK, $lParam) ShellExecute($tNMLINK.szURL) EndSwitch EndSwitch Return _WinAPI_CallWindowProc($g_hProcOld, $hWnd, $iMsg, $wParam, $lParam) EndFunc -
Da fällt mir direkt eine Frage ein: GUIRegisterMsg hat ja keinen Parameter für hWND. Hat ein Layered-Window dort einen eigenen Zugang
In der WindowProc kannst Du alle Nachrichten des überwachten Fensters auswerten (wie bei GUIRegisterMsg, also auch WM_CHAR).
-
Was zum Problem führt, dass der User später keinen eigenen (gleichartigen) Hook in seinem Code einbauen kann, da dieser in der UDF bereits registriert ist.
Bei der Window-Prozedur muss man doch nur zur bisherigen Prozedur springen, dann ist auch eine Verkettung möglich.
Hier mal ein Beispiel:
AutoIt
Alles anzeigen#include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <WinAPISysInternals.au3> #include <WinAPISysWin.au3> #include <WindowsConstants.au3> Opt('GUIOnEventMode', 1) _GDIPlus_Startup() Global $hMainGui = GUICreate('Example', 400, 300) GUISetBkColor(0xD0D0D0, $hMainGui) GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit') Global $iTransColor = 0x00FF00, $iW = 200, $iH = 200, $iX = 20, $iY = 20 Global $hChild = GUICreate('', $iW, $iH, $iX, $iY, $WS_POPUP, BitOR($WS_EX_MDICHILD, $WS_EX_LAYERED), $hMainGui) GUISetBkColor($iTransColor, $hChild) _WinAPI_SetLayeredWindowAttributes($hChild, $iTransColor) Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hChild) Global $hProcNew = DllCallbackRegister('_MyWindowProc', 'ptr', 'hwnd;uint;long;ptr') Global $hProcOld = _WinAPI_SetWindowLong($hChild, $GWL_WNDPROC, DllCallbackGetPtr($hProcNew)) GUISetState(@SW_SHOW, $hChild) GUISetState(@SW_SHOW, $hMainGui) _GDIPlus_GraphicsFillRect($hGraphic, 10, 10, 180, 30) WinWaitClose($hMainGui) _GDIPlus_Shutdown() Exit Func _Exit() _GDIPlus_GraphicsDispose($hGraphic) _WinAPI_SetWindowLong($hChild, $GWL_WNDPROC, $hProcOld) GUIDelete($hChild) GUIDelete($hMainGui) EndFunc Func _MyWindowProc($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $lParam Local $iVKey Switch $iMsg Case $WM_SETFOCUS ConsoleWrite('SETFOCUS' & @CRLF) Case $WM_KILLFOCUS ConsoleWrite('KILLFOCUS' & @CRLF) Case $WM_KEYDOWN $iVKey = $wParam ConsoleWrite('KEYDOWN: ' & Chr($iVKey) & @CRLF) Case $WM_KEYUP $iVKey = $wParam ConsoleWrite('KEYUP: ' & Chr($iVKey) & @CRLF) EndSwitch Return _WinAPI_CallWindowProc($hProcOld, $hWnd, $iMsg, $wParam, $lParam) EndFunc -
Meine Tendenz ist GUIRegisterMsg zu verwenden, aber vllt hat ja jemand hier mehr Erfahrung und kann mir einen Tipp geben.
Erstell für die GDI+ Grafik ein Layered-Window (geht auch transparent) und werte die Events in der Window-Prozedur aus.
Das sollte sich wie ein Input-Control verhalten, von der Rechenzeit her.
-
jo, danke Dir, gelesen hatte ich das auch schon, aber es funktioniert bloss nicht
Poste bitte lauffähige Beispiele!
-
Zitat aus der Hilfe: "If a picture is set as a background picture the other controls will overlap, so it is important to disable the pic control: GUICtrlSetState(-1, $GUI_DISABLE)."
-
Ich habe gerade eine tolle Funktion im engl. Forum gefunden (_GUICtrlStatusBar_SetFont).
Vielleicht kennt ihr die ja schon, aber ich habe trotzdem mal ein Beispiel-Script erstellt, mit dem man die Schriftgröße der Statusbar während der Laufzeit ändern kann.
Das brauchte ich für ein anderes Projekt und dachte, dass es der Ein oder Andere auch gebrauchen kann.
AutoIt
Alles anzeigen#include <FontConstants.au3> #include <GUIConstantsEx.au3> #include <GuiStatusBar.au3> #include <SendMessage.au3> #include <WinAPIConv.au3> #include <WinAPIGdiInternals.au3> #include <WinAPIHObj.au3> #include <WindowsConstants.au3> Global $g_iFontSize = 18, $g_iFontWeight = 400, $g_iFontStyle = 2, $g_sFontname = 'Times New Roman' Global $g_hGui = GUICreate('Statusbar change fontsize', 800, 200) GUISetState(@SW_SHOW, $g_hGui) GUISetBkColor(0xCCCCCC) Global $g_hFont, $g_aParts[] = [120, -1], $g_aText[] = [$g_iFontSize & 'px', '<STRG> & Mousewheel to change'] Global $g_hStatus = _GUICtrlStatusBar_Create($g_hGui, $g_aParts, $g_aText) _GUICtrlStatusBar_SetMinHeight($g_hStatus, $g_iFontSize) _GUICtrlStatusBar_SetFont($g_hStatus, $g_iFontSize, $g_iFontWeight, $g_iFontStyle, $g_sFontname) GUISetState(@SW_SHOW, $g_hGui) GUIRegisterMsg($WM_MOUSEWHEEL, '_WM_MOUSEWHEEL') While True Switch GUIGetMsg() Case $GUI_EVENT_CLOSE If $g_hFont Then _WinAPI_DeleteObject($g_hFont) Exit EndSwitch WEnd Func _WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $lParam Local Const $iWheelDelta = 120, $MK_CONTROL = 0x0008, $iMinSize = 10, $iMaxSize = 48 Local $iWheel, $iVKey Local Static $iOldSize = $g_iFontSize $iWheel = _WinAPI_HiWord($wParam) / $iWheelDelta ; down = -1, up = 1 $iVKey = _WinAPI_LoWord($wParam) If BitAND($iVKey, $MK_CONTROL) Then ; if pressed [STRG/CTRL] $g_iFontSize += $iWheel If $g_iFontSize < $iMinSize Then $g_iFontSize -= $iWheel If $g_iFontSize > $iMaxSize Then $g_iFontSize -= $iWheel If $g_iFontSize <> $iOldSize Then $iOldSize = $g_iFontSize _GUICtrlStatusBar_SetMinHeight($g_hStatus, $g_iFontSize) _GUICtrlStatusBar_SetText($g_hStatus, $g_iFontSize & 'px') _GUICtrlStatusBar_SetFont($g_hStatus, $g_iFontSize, $g_iFontWeight, $g_iFontStyle, $g_sFontname) EndIf EndIf Return $GUI_RUNDEFMSG EndFunc ;==>_WM_MOUSEWHEEL ; from rasim (https://www.autoitscript.com/forum/topic/88063-_guictrlstatusbar_settext/?do=findComment&comment=632524) Func _GUICtrlStatusBar_SetFont($hWnd, $iSize = 15, $iWeight = 400, $iAttr = 0, $sFontName = "Arial") If $g_hFont Then _WinAPI_DeleteObject($g_hFont) $g_hFont = _WinAPI_CreateFont($iSize, 0, 0, 0, $iWeight, _ BitAND($iAttr, 2), BitAND($iAttr, 4), BitAND($iAttr, 8), _ $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, _ $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, _ 0, $sFontName) _SendMessage($hWnd, $WM_SETFONT, $g_hFont, 1) EndFunc ;==>_GUICtrlStatusBar_SetFont -
Doku lesen hilft anscheinend - muss ich mir mal beherzigen.
Dito!
Bis zu Deinem Post kannte ich die WinApi-Funktion "PathCleanupSpec" gar nicht.

Und SetExtended hatte ich auch nicht so auf dem Schirm (ich benutze zu selten das @extended Makro).
Also gleich ein doppeltes Dankeschön für diese Funktion! So brauche ich nicht mehr extra eine AutoIt-Prüfung schreiben.

-
Ich kenne mich mit der aber nicht wirklich aus um zu entscheiden ob das gewollt oder ein Bug ist.
Wenn man MSDN zu Rate zieht, dann ist das wohl gewollt. Das Flag wird jedenfalls entsprechend gesetzt:
AutoIt
Alles anzeigenGlobal Const $PCS_FATAL = 0x80000000 Global Const $PCS_REPLACEDCHAR = 0x00000001 Global Const $PCS_REMOVEDCHAR = 0x00000002 Global Const $PCS_TRUNCATED = 0x00000004 Global Const $PCS_PATHTOOLONG = 0x00000008 Global $sName = 'T*este /m:ich' ;~ Global $sName = 'Teste /mich' Global $sNameClean = _WinAPI_PathCleanupSpec($sName) Global $iExt = @extended If BitAND($iExt, $PCS_FATAL) Then ConsoleWrite('The cleaned path is not a valid file name.' & @CRLF) If BitAND($iExt, $PCS_REPLACEDCHAR) Then ConsoleWrite('Replaced one or more invalid characters.' & @CRLF) If BitAND($iExt, $PCS_REMOVEDCHAR) Then ConsoleWrite('Removed one or more invalid characters.' & @CRLF) If BitAND($iExt, $PCS_TRUNCATED) Then ConsoleWrite('The returned path is truncated.' & @CRLF) If BitAND($iExt, $PCS_PATHTOOLONG) Then ConsoleWrite('The function failed because the input path is too long.' & @CRLF) ConsoleWrite('Path: "' & $sNameClean & '"' & @CRLF) ; von AspirinJunkie ; https://autoit.de/thread/87822-suche-hilfe-unzul%C3%A4ssige-zeichen-bei-dateinamen-ersetzen-mit-stringregexp-f%C3%BCr-anf/?postID=708339#post708339 Func _WinAPI_PathCleanupSpec($sFileName) Local $aCall = DllCall('Shell32.dll', 'int', 'PathCleanupSpec', 'WSTR', '', 'WSTR', $sFileName) If @error Then Return SetError(@error, StringLen($sFileName), Null) Return SetError(0, $aCall[0], $aCall[2]) EndFunc -
Ja, ich denke auch, dass die StringFunktion (StringReplace) hierfür ausreichen sollte!
Einfach die HTML-Seite komplett als String laden, dann mit StringReplace die <td> ersetzen und wieder abspeichern.
-
wie kann man am besten mit AutoIt HTML Quellcodeseiten modifizieren, also die HTML Datei öffnen, etwas suchen, eine Zeile hinzufügen oder ändern und das ganze wieder abspeichern ?
Kommt darauf an, wo die HTML-Seite gespeichert ist.
Lokal wie bei jeder anderen Textdatei auch. Auf einem Server: da musst Du mehr Infos liefern.
-
Weniger als 0.1 s ist nicht sinnvoll, da dann zu wenig Werte generiert werden und kein an- u. absteigender Graph, sondern eine kurze wilde Zick- Zacklinie entsteht.
Ich mach mir mal Gedanken, wie ich das in einen externen Prozess/anderen Kern auslagern kann.
Stimmt! Ich erinnere mich an mein Programm "FlashTest". Da habe ich das schreiben/lesen auch in einen Slave-Prozess ausgelagert.
Mit Hilfe der MailSlot-UDF habe ich die Kommunikation zwischen dem Master und dem Slave gelöst. Mit MailSlots können die Prozesse asynchron kommunizieren. Das ist wichtig, damit keiner der beiden Prozesse durch den anderen ausgebremst wird, weil der gerade die Nachricht abholt.
Aber als FileCopy-UDF wird das wohl sehr heftig werden, wenn es überhaupt irgendwie geht.

-
OK, leider ist das Einbinden des Graphen ncht sinnvoll. Dadurch wird die Geschwindigkeit total ausgebremst, von 86 MB/s bis runter auf 12 MB/s.
Schade.
Auch, wenn Du die Aktualisierung nur z.B. jede Sekunde vornimmst?
-
Hier noch eine Version mit Beschriftung:
AutoIt
Alles anzeigen#include <Array.au3> #include <GDIPlus.au3> #include <GDIPlusConstants.au3> #include <GuiStatusBar.au3> #include <ProgressConstants.au3> #include <SendMessage.au3> #include <StaticConstants.au3> #include <WinAPIHObj.au3> #include <WinAPIInternals.au3> #include <WinAPISysInternals.au3> Global $hGui, $lbPercent, $lbSpeed, $lbFile, $lbRestFiles, $lbRestSize, $lbRestTime, $hStatus, $idProgress Global $idGraph, $aData[] _GDIPlus_Startup() _CreateCopyGui() GUISetState(@SW_SHOW, $hGui) Do _GraphCtrl_Draw($idGraph, _RandomTransferSpeed(95)) Until GUIGetMsg() = -3 _GDIPlus_Shutdown() Func _GraphCtrl_Draw($idCtrl, $iSpeed) Local Static $sData Local $aData, $iMax, $iMin, $iHVal, $iHMin Local $hCtrl, $tRect, $iW, $iH, $hBitmap, $hGraphic, $hPenLine, $hPenMax, $hPenMin, $hBMP, $hPrevImage Local $hFormat, $hBrushMax, $hBrushMin, $hFamily, $hFont, $tLayout $hCtrl = GUICtrlGetHandle($idCtrl) If Not IsHWnd($hCtrl) Then Return SetError(1, 0, False) $tRect = _WinAPI_GetClientRect($hCtrl) $iW = $tRect.Right $iH = $tRect.Bottom $sData &= $iSpeed & ',' $aData = StringSplit(StringTrimRight($sData, 1), ',', 2) If UBound($aData) > $iW Then _ArrayDelete($aData, 0) $sData = StringRegExpReplace($sData, '(.+?,)(.+)', '$2') EndIf $iMax = _ArrayMax($aData, 1) $iMin = _ArrayMin($aData, 1) $iHVal = ($iH - 20) / $iMax $iHMin = Int($iHVal * $iMin) $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap) _GDIPlus_GraphicsSetInterpolationMode($hGraphic, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC) _GDIPlus_GraphicsSetTextRenderingHint($hGraphic, 4) _GDIPlus_GraphicsClear($hGraphic, 0xFF004000) $hPenLine = _GDIPlus_PenCreate(0xFFA0FFA0, 1) $hPenMax = _GDIPlus_PenCreate(0xFFA0FFA0, 1) $hPenMin = _GDIPlus_PenCreate(0xFF108010, 1) For $iX = 0 To UBound($aData) - 1 Step 1 _GDIPlus_GraphicsDrawLine($hGraphic, $iX, $iH, $iX, $iH - Int($iHVal * $aData[$iX]), $hPenLine) Next _GDIPlus_GraphicsDrawLine($hGraphic, 0, 20, $iW, 20, $hPenMax) _GDIPlus_GraphicsDrawLine($hGraphic, 0, $iH - $iHMin, $iW, $iH - $iHMin, $hPenMin) $hFormat = _GDIPlus_StringFormatCreate() _GDIPlus_StringFormatSetAlign($hFormat, 2) $hBrushMax = _GDIPlus_BrushCreateSolid(0xFFA0FFA0) $hBrushMin = _GDIPlus_BrushCreateSolid(0xFF108010) $hFamily = _GDIPlus_FontFamilyCreate('Arial') $hFont = _GDIPlus_FontCreate($hFamily, 10, 1) $tLayout = _GDIPlus_RectFCreate($iW - 100, 4, 98, 16) _GDIPlus_GraphicsDrawStringEx($hGraphic, Int($iMax) & ' MB/s', $hFont, $tLayout, $hFormat, $hBrushMax) $tLayout = _GDIPlus_RectFCreate($iW - 100, $iH - $iHMin + 4, 98, 16) _GDIPlus_GraphicsDrawStringEx($hGraphic, Int($iMin) & ' MB/s', $hFont, $tLayout, $hFormat, $hBrushMin) $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap) $hPrevImage = _SendMessage($hCtrl, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP) If $hPrevImage Then _WinAPI_DeleteObject($hPrevImage) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrushMax) _GDIPlus_BrushDispose($hBrushMin) _GDIPlus_PenDispose($hPenMin) _GDIPlus_PenDispose($hPenMax) _GDIPlus_PenDispose($hPenLine) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_BitmapDispose($hBitmap) EndFunc Func _RandomTransferSpeed($_iMax=-1) Local Static $iMBPerSec = 150 $iMBPerSec += Random(-1,1,1) * ($iMBPerSec / 100) If $iMBPerSec < 1 Then $iMBPerSec = 0 Return $iMBPerSec EndFunc Func _CreateCopyGui() $hGui = GUICreate('Copy with Progress', 400, 260) GUISetBkColor(0xF0F8FF) GUISetFont(10, 400, Default, 'Courier New') ; Prozent GUICtrlCreateLabel('Fortschritt:', 10, 10, 115, 17) $lbPercent = GUICtrlCreateLabel('0', 320, 10, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) GUICtrlCreateLabel('%', 380, 10, 10, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; Speed GUICtrlCreateLabel('Geschwindigkeit:', 10, 32, 125, 17) $lbSpeed = GUICtrlCreateLabel('0 MB', 300, 32, 70, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) GUICtrlCreateLabel('/s', 370, 32, 20, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; akt. Datei GUICtrlCreateLabel('Name:', 10, 54, 40, 17) $lbFile = GUICtrlCreateLabel('', 55, 54, 335, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; verbleibende Elemente GUICtrlCreateLabel('Verbleibende Elemente:', 10, 76, 180, 17) $lbRestFiles = GUICtrlCreateLabel('', 330, 76, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; verbleibende Größe GUICtrlCreateLabel('Verbleibende Größe:', 10, 98, 180, 17) $lbRestSize = GUICtrlCreateLabel('', 280, 98, 110, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; verbleibende Zeit GUICtrlCreateLabel('Restdauer ungefähr:', 10, 120, 180, 17) $lbRestTime = GUICtrlCreateLabel('', 250, 120, 140, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; Graph hellgrün: 0xF0F0F0, dunkelgrün: 0x05B024 $idGraph = GUICtrlCreatePic('', 10, 142, 380, 85) ; Statusbar $hStatus = _GUICtrlStatusBar_Create($hGui) _GUICtrlStatusBar_SetMinHeight($hStatus, 20) $idProgress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH) GUICtrlSetColor(-1, 0x008B00) ; grün _GUICtrlStatusBar_EmbedControl($hStatus, 0, GUICtrlGetHandle($idProgress)) EndFunc -
Ich würde sowas vorschlagen:
AutoIt
Alles anzeigen#include <Array.au3> #include <GDIPlus.au3> #include <GDIPlusConstants.au3> #include <GuiStatusBar.au3> #include <ProgressConstants.au3> #include <SendMessage.au3> #include <StaticConstants.au3> #include <WinAPIHObj.au3> #include <WinAPIInternals.au3> #include <WinAPISysInternals.au3> Global $hGui, $lbPercent, $lbSpeed, $lbFile, $lbRestFiles, $lbRestSize, $lbRestTime, $hStatus, $idProgress Global $idGraph, $aData[] _GDIPlus_Startup() _CreateCopyGui() GUISetState(@SW_SHOW, $hGui) Do _GraphCtrl_Draw($idGraph, _RandomTransferSpeed(95)) Until GUIGetMsg() = -3 _GDIPlus_Shutdown() Func _GraphCtrl_Draw($idCtrl, $iSpeed) Local Static $sData Local $aData, $iMax, $iMin, $iHVal, $iHMin Local $hCtrl, $tRect, $iW, $iH, $hBitmap, $hGraphic, $hPenLine, $hPenMax, $hPenMin, $hBMP, $hPrevImage $hCtrl = GUICtrlGetHandle($idCtrl) If Not IsHWnd($hCtrl) Then Return SetError(1, 0, False) $tRect = _WinAPI_GetClientRect($hCtrl) $iW = $tRect.Right $iH = $tRect.Bottom $sData &= $iSpeed & ',' $aData = StringSplit(StringTrimRight($sData, 1), ',', 2) If UBound($aData) > $iW Then _ArrayDelete($aData, 0) $sData = StringRegExpReplace($sData, '(.+?,)(.+)', '$2') EndIf $iMax = _ArrayMax($aData, 1) $iMin = _ArrayMin($aData, 1) $iHVal = ($iH - 16) / $iMax $iHMin = Int($iHVal * $iMin) $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap) _GDIPlus_GraphicsSetInterpolationMode($hGraphic, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC) _GDIPlus_GraphicsClear($hGraphic, 0xFF004000) $hPenLine = _GDIPlus_PenCreate(0xFF80F080, 1) $hPenMax = _GDIPlus_PenCreate(0xFFA0FFA0, 1) $hPenMin = _GDIPlus_PenCreate(0xFF30AA30, 1) For $iX = 0 To UBound($aData) - 1 Step 1 _GDIPlus_GraphicsDrawLine($hGraphic, $iX, $iH, $iX, $iH - Int($iHVal * $aData[$iX]), $hPenLine) Next _GDIPlus_GraphicsDrawLine($hGraphic, 0, 16, $iW, 16, $hPenMax) _GDIPlus_GraphicsDrawLine($hGraphic, 0, $iH - $iHMin, $iW, $iH - $iHMin, $hPenMin) $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap) $hPrevImage = _SendMessage($hCtrl, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP) If $hPrevImage Then _WinAPI_DeleteObject($hPrevImage) _GDIPlus_PenDispose($hPenMin) _GDIPlus_PenDispose($hPenMax) _GDIPlus_PenDispose($hPenLine) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_BitmapDispose($hBitmap) EndFunc Func _RandomTransferSpeed($_iMax=-1) Local Static $iMBPerSec = 50 $iMBPerSec += Random(-1,1,1) * ($iMBPerSec / 100) If $iMBPerSec < 1 Then $iMBPerSec = 0 Return $iMBPerSec EndFunc Func _CreateCopyGui() $hGui = GUICreate('Copy with Progress', 400, 260) GUISetBkColor(0xF0F8FF) GUISetFont(10, 400, Default, 'Courier New') ; Prozent GUICtrlCreateLabel('Fortschritt:', 10, 10, 115, 17) $lbPercent = GUICtrlCreateLabel('0', 320, 10, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) GUICtrlCreateLabel('%', 380, 10, 10, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; Speed GUICtrlCreateLabel('Geschwindigkeit:', 10, 32, 125, 17) $lbSpeed = GUICtrlCreateLabel('0 MB', 300, 32, 70, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) GUICtrlCreateLabel('/s', 370, 32, 20, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; akt. Datei GUICtrlCreateLabel('Name:', 10, 54, 40, 17) $lbFile = GUICtrlCreateLabel('', 55, 54, 335, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; verbleibende Elemente GUICtrlCreateLabel('Verbleibende Elemente:', 10, 76, 180, 17) $lbRestFiles = GUICtrlCreateLabel('', 330, 76, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; verbleibende Größe GUICtrlCreateLabel('Verbleibende Größe:', 10, 98, 180, 17) $lbRestSize = GUICtrlCreateLabel('', 280, 98, 110, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; verbleibende Zeit GUICtrlCreateLabel('Restdauer ungefähr:', 10, 120, 180, 17) $lbRestTime = GUICtrlCreateLabel('', 250, 120, 140, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; Graph hellgrün: 0xF0F0F0, dunkelgrün: 0x05B024 $idGraph = GUICtrlCreatePic('', 10, 142, 380, 85) ; Statusbar $hStatus = _GUICtrlStatusBar_Create($hGui) _GUICtrlStatusBar_SetMinHeight($hStatus, 20) $idProgress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH) GUICtrlSetColor(-1, 0x008B00) ; grün _GUICtrlStatusBar_EmbedControl($hStatus, 0, GUICtrlGetHandle($idProgress)) EndFunc