Leaderboard
Popular Content
Showing content with the highest reputation on 02/26/2024 in all areas
-
Extended Message Box - New Version: 16 Feb 24
hudsonhock reacted to Melba23 for a topic
Are you annoyed by the limitations of the standard Windows message dialog created by MsgBox? Would you like to have coloured backgrounds and text? To choose the justification and font? Do you want to be able to place the message box other than in the centre of the screen? Centred on your GUI, for example, or at a particular location on screen? What about having user-defined text on as many buttons as you need? And user-defined icons? Or a visible countdown of the timeout? Finally, would you like to choose whether the message box has a button on your already too-crowded taskbar? If the answer to any of these questions is "YES" then the ExtMsgBox UDF is for you! [NEW VERSION] 16 Feb 24 Changed: Some additional functionality added to the "TimeOut" parameter of _ExtMsgBox: - A positive integer sets the EMB timeout as before. - A negative integer will double the size of the countdown timer if it is used. - A colon-delimited string (eg: "10:5") will set the normal EMB timeout (first integer) and will also initially disable the EMB buttons for the required period (second integer). New UDF and examples in the zip. Older version changes: ChangeLog.txt As always, I realise nearly all of the DLL calls in these UDFs could be made by using commands in other UDFs like WinAPI.au3 - but as with all my UDFs (which you can find in my sig below) I am trying to prevent the need for any other include files. The UDF and examples (plus StringSize) in zip format: ExtMsgBox.zip Courteous comments and constructive criticisms welcome - guess which I prefer! M231 point -
Well, it's in the notes... While listening to an audio book I got annoyed at the constant misreading of numbers. Example: 692,000 would be read as six hundred ninety two zero-zero-zero. It got me thinking, how difficult is it to read them out to an understandable value? See Zips for Examples AutCode is a part of my personal format library, not sure I'll be releasing it, but maybe. Edit: 02/25/2024 This is script breaking, I added more bloat (purposely) and added Spanish as a sub language. I'm not 100% sure if it's absolutely correct though lol. Same day: Fixed decimal issue and returning the not needed zero/cero at the end of 1200 etc Same day: Added some escape char code for ramdon delimiters being passed Edit: 02/26/2024 Added a Text to Number approach, seems to work on English. Fixed code for NumberToText... probably going to zip them, cuz my copy-paste-kungfu is evidently weak! Same day, fixed Spanish issue with y un mil being shown as y mil Edit: 02/27/2024 Added Text to Number approach for Spanish as well, update in zip as well as an example Update same day: had to fix some found issues with decimal, didn't realize I did case sensitive, and I'm to lazy to make it an option (as we're working with numbers and I don't feel like we should have case sensitivity). Updated same day: fixed some other language issues found in Spanish with something like "mil" only being sent to Text To Number. Added: _AutCode_TextNumberGetLanguage , it's just a simple way to get the language of the numbers you're sending... If I'm being honest, I don't see it being incredibly useful. At the moment, it's sending a string return of the language, I don't like this, so I may change it to what it should be in my opinion (to match $N2T_XXX vars). But I'm tired of playing with this thing atm. Edit: 03/01/2024 Added a database version, it's been nearly a decade since I played with databases, so it is definitely not marked for speed at the moment. Once I'm more proficient (again ), I'll probably update the query optimization and db performance... right now it's fairly vanilla... But hey, it works. See NumTextNumDB zip for this one. Zip has both x86/x64 sqlite3 dll from official site (feel free to download your own if you don't want to do a checksum or don't trust mine) and the .db3 filled with the query data. Edit: 03/03/2024 Fixed: English and Spanish only returning blank string when "0", "00", or "000" only is passed Fixed: English and Spanish returning zero [thousands,millions] when something like 100,000,000 is passed Added: German and French -- Removed non-db version that I am no longer updating because it has less features and the same features are in the db version. NumTextNumDB_03032024(1).zip1 point
-
How to Resize Animated GIF when Loaded by _GDIPlus_BitmapCreateFromMemory()
teodoric666 reacted to UEZ for a topic
You can use _GDIPlus_GIFAnim.au3: ;coded by UEZ build 2017-07-04 ;requires 3.3.11.5+ #AutoIt3Wrapper_Version=b #include-once #include <GDIPlus.au3> #include <Memory.au3> ;_GDIPlus_BitmapConvertTo8Bit ;_GDIPlus_GIFAnimCreateFile ;_GDIPlus_GIFAnimExtractAllFrames ;_GDIPlus_GIFAnimGetFrameCount ;_GDIPlus_GIFAnimGetFrameDelays ;_GDIPlus_GIFAnimGetFrameDelaysFromBinFile ;_GDIPlus_GIFAnimGetFrameDimensionsCount ;_GDIPlus_GIFAnimGetFrameDimensionsList ;_GDIPlus_GIFAnimSelectActiveFrame ;_GDIPlus_ImageGetColorPalette ;_GDIPlus_ImageGetColorPaletteSize ;_GDIPlus_ImageSaveAdd ;_GDIPlus_ImageSaveAddImage ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_GIFAnimGetFrameDimensionsCount ; Description ...: Gets the number of frame dimensions in this Image object. ; Syntax ........: _GDIPlus_GIFAnimGetFrameDimensionsCount($hImage) ; Parameters ....: $hImage - A handle to an image / bitmap object ; Return values .: The number of frame dimensions in this Image object. ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: ; =============================================================================================================================== Func _GDIPlus_GIFAnimGetFrameDimensionsCount($hImage) Local Const $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsCount", "handle", $hImage, "ulong*", 0) If @error Then Return SetError(@error, @extended, 0) If $aResult[0] Then Return SetError(10, $aResult[0], 0) Return $aResult[2] EndFunc ;==>_GDIPlus_GIFAnimGetFrameDimensionsCount ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_GIFAnimGetFrameDimensionsList ; Description ...: Gets the identifiers for the frame dimensions of this Image object which fills the GUID struct. ; Syntax ........: _GDIPlus_GIFAnimGetFrameDimensionsList($hImage, $iFramesCount) ; Parameters ....: $hImage - A handle to an image / bitmap object ; $iFramesCount - An integer value. ; Return values .: tagGUID struct ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: ; =============================================================================================================================== Func _GDIPlus_GIFAnimGetFrameDimensionsList($hImage, $iFramesCount) Local Const $tGUID = DllStructCreate($tagGUID) Local Const $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsList", "handle", $hImage, "struct*", $tGUID, "uint", $iFramesCount) If @error Then Return SetError(@error, @extended, 0) If $aResult[0] Then Return SetError(10, $aResult[0], 0) Return $tGUID EndFunc ;==>_GDIPlus_GIFAnimGetFrameDimensionsList ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_GIFAnimGetFrameCount ; Description ...: Gets the frame count of the loaded gif by passing the GUID struct ; Syntax ........: _GDIPlus_GIFAnimGetFrameCount($hImage, $tGUID) ; Parameters ....: $hImage - A handle to an image / bitmap object ; $tGUID - A struct to a GUID that specifies the frame dimension. ; Return values .: The amount of frames from a GIF animated image handle ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromFile ; Link ..........: ; =============================================================================================================================== Func _GDIPlus_GIFAnimGetFrameCount($hImage, $tGUID) Local Const $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameCount", "handle", $hImage, "struct*", $tGUID, "ptr*", 0) If @error Then Return SetError(@error, @extended, 0) If $aResult[0] Then Return SetError(10, $aResult[0], 0) Return Int($aResult[3]) EndFunc ;==>_GDIPlus_GIFAnimGetFrameCount ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_GIFAnimSelectActiveFrame ; Description ...: Selects the frame in this Image object specified by passing the GUID struct and current frame. ; Syntax ........: _GDIPlus_GIFAnimSelectActiveFrame($hImage, $tGUID, $iCurrentFrame) ; Parameters ....: $hImage - A handle to an image / bitmap object ; $tGUID - A struct to a GUID that specifies the frame dimension. ; $iCurrentFrame - An integer value. ; Return values .: True or False on errors ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromFile ; Link ..........: ; =============================================================================================================================== Func _GDIPlus_GIFAnimSelectActiveFrame($hImage, $tGUID, $iCurrentFrame) Local Const $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageSelectActiveFrame", "handle", $hImage, "struct*", $tGUID, "uint", $iCurrentFrame) If @error Then Return SetError(@error, @extended, 0) If $aResult[0] Then Return SetError(10, $aResult[0], 0) Return True EndFunc ;==>_GDIPlus_GIFAnimSelectActiveFrame ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_GIFAnimGetFrameDelays ; Description ...: Gets the delay of each frame from an image handle ; Syntax ........: _GDIPlus_GIFAnimGetFrameDelays($hImage, $iAnimFrameCount) ; Parameters ....: $hImage - A handle to an image / bitmap object ; $iAnimFrameCount - An integer value. ; Return values .: An array with the information about the delay of each frame or the error code ; Author ........: UEZ ; Modified ......: ; Remarks .......: If frame delays cannot be read try _GDIPlus_GIFAnimGetFrameDelaysFromBinFile instead ; Related .......: _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromFile _GDIPlus_ImageGetPropertyItem ; Link ..........: ; =============================================================================================================================== Func _GDIPlus_GIFAnimGetFrameDelays($hImage, $iAnimFrameCount) If $iAnimFrameCount < 2 Then Return SetError(1, 0, 0) Local Const $GDIP_PROPERTYTAGFRAMEDELAY = 0x5100 Local $tPropItem = __GDIPlus_ImageGetPropertyItem($hImage, $GDIP_PROPERTYTAGFRAMEDELAY) If IsDllStruct($tPropItem) And (Not @error) Then Local $iType = $tPropItem.type, $iLength, $tVal If $iType Then $iLength = $tPropItem.length Switch $iType Case 1 $tVal = DllStructCreate("byte delay[" & $iLength & "]", $tPropItem.value) Case 3 $tVal = DllStructCreate("short delay[" & Ceiling($iLength / 2) & "]", $tPropItem.value) Case 4 $tVal = DllStructCreate("long delay[" & Ceiling($iLength / 4) & "]", $tPropItem.value) Case Else Return SetError(3, 0, 0) EndSwitch Local $aFrameDelays[Int($iAnimFrameCount)], $i For $i = 0 To UBound($aFrameDelays) - 1 $aFrameDelays[$i] = $tVal.delay(($i + 1)) * 10 ;~ ConsoleWrite($i & ": "& $aFrameDelays[$i] & @CRLF) Next EndIf Return $aFrameDelays EndIf Return SetError(2, 0, 0) EndFunc ;==>_GDIPlus_GIFAnimGetFrameDelays ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_ImageGetPropertyItem ; Description ...: Gets a specified property item (piece of metadata) from this Image object. ; Syntax ........: __GDIPlus_ImageGetPropertyItem($hImage, $iPropID) ; Parameters ....: $hImage - A handle to an image object. ; $iPropID - An integer that identifies the property item to be retrieved. ; Return values .: $tagGDIPPROPERTYITEM structure or 0 on errors ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: _GDIPlus_ImageLoadFromFile _GDIPlus_ImageLoadFromStream ; Link ..........: Property Item Descriptions -> http://msdn.microsoft.com/en-us/library/windows/desktop/ms534416(v=vs.85).aspx ; =============================================================================================================================== Func __GDIPlus_ImageGetPropertyItem($hImage, $iPropID) Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipGetPropertyItemSize", "handle", $hImage, "uint", $iPropID, "ulong*", 0) If @error Then Return SetError(@error, @extended, 0) If $aResult[0] Then Return SetError(10, $aResult[0], 0) Local Static $tBuffer ;why static? because otherwise it would crash when running it as x64 exe (workaround) $tBuffer = DllStructCreate("byte[" & $aResult[3] & "]") $aResult = DllCall($__g_hGDIPDll, "int", "GdipGetPropertyItem", "handle", $hImage, "uint", $iPropID, "ulong", $aResult[3], "struct*", $tBuffer) If @error Then Return SetError(@error, @extended, 0) If $aResult[0] Then Return SetError(11, $aResult[0], 0) Local Const $tagGDIPPROPERTYITEM = "uint id;ulong length;word type;ptr value" Local $tPropertyItem = DllStructCreate($tagGDIPPROPERTYITEM, DllStructGetPtr($tBuffer)) If @error Then Return SetError(20, $aResult[0], 0) Return $tPropertyItem EndFunc ;==>__GDIPlus_ImageGetPropertyItem ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_GIFAnimGetFrameDelaysFromBinFile ; Description ...: Gets the delay of each frame from a binary gif file ; Syntax ........: _GDIPlus_GIFAnimGetFrameDelaysFromBinFile($binGIF, $iAnimFrameCount[, $iDelay = 10]) ; Parameters ....: $binGIF - A binary string with the GIF anim. ; $iAnimFrameCount - An integer value. ; Return values .: An array with the information about the delay of each frame or the error code ; Author ........: UEZ ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: ; =============================================================================================================================== Func _GDIPlus_GIFAnimGetFrameDelaysFromBinFile($binGIF, $iAnimFrameCount) If Not IsBinary($binGIF) Then Return SetError(1, 0, 0) If $iAnimFrameCount < 2 Then Return SetError(2, 0, 0) Local $aFrameDelays = StringRegExp($binGIF, "(?i)0021F904[[:xdigit:]]{2}([[:xdigit:]]{4})", 3) If @error Then Return SetError(3, 0, 0) Local Const $iDelay = 10 For $i = 0 To UBound($aFrameDelays) - 1 $aFrameDelays[$i] = $iDelay * Dec(StringRegExpReplace($aFrameDelays[$i], "([[:xdigit:]]{2})([[:xdigit:]]{2})", "$2$1")) Next If UBound($aFrameDelays) <> $iAnimFrameCount Then ReDim $aFrameDelays[$iAnimFrameCount] Return $aFrameDelays EndFunc ;==>_GDIPlus_GIFAnimGetFrameDelaysFromBinFile ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_GIFAnimExtractAllFrames ; Description ...: Extracts all frames from a GIF animation file with the option to resize the frames ; Syntax ........: _GDIPlus_GIFAnimExtractAllFrames($hImage, $sFilename[, $iJPGQual = 85[, $iW = 0[, $iH = 0[, $iResizeQual = 7[, ; $bReverse = False]]]]]) ; Parameters ....: $hImage - A handle to an image / bitmap object ; $sFilename - A string value. Folders will be created if not existing. ; $iJPGQual - [optional] An integer value. Default is 85. ; $iW - [optional] An integer value. Default is 0. ; $iH - [optional] An integer value. Default is 0. ; $iResizeQual - [optional] An integer value. Default is 2. ; $bReverse - [optional] A binary value. Default is False. ; Return values .: True or False on errors ; Author ........: UEZ ; Modified ......: ; Remarks .......: All frames will be extracted whereas the filename will be <filename>_XX.<ext>. XX is the amount of frames. If ; $bReverse is set True then the frames will be saved in reverse order. If $iW and $iH are zero then no resizing will be done. ; Related .......: _GDIPlus_EncodersGetCLSID _GDIPlus_ParamInit _GDIPlus_BitmapCreateFromScan0 _GDIPlus_GraphicsSetInterpolationMode _GDIPlus_ImageSaveToFile ; Link ..........: ; =============================================================================================================================== Func _GDIPlus_GIFAnimExtractAllFrames($hImage, $sFilename, $iJPGQual = 85, $iW = 0, $iH = 0, $iResizeQual = 2, $bReverse = False) If $sFilename = "" Then Return SetError(1, @error, 0) Local Const $iAnimDimCount = _GDIPlus_GIFAnimGetFrameDimensionsCount($hImage) If @error Then Return SetError(2, @error, 0) Local Const $tGUID = _GDIPlus_GIFAnimGetFrameDimensionsList($hImage, $iAnimDimCount) If @error Then Return SetError(3, @error, 0) Local Const $iAnimFrameCount = _GDIPlus_GIFAnimGetFrameCount($hImage, $tGUID) If @error Then Return SetError(4, @error, 0) Local $sPath = StringRegExpReplace($sFilename, "(.+)\\.+", "$1") If StringLen($sPath) > 2 Then If Not FileExists($sPath) Then DirCreate($sPath) EndIf Local $sPrefixList = "jpg,png,bmp,gif,tif,", $sSuffix = StringRight($sFilename, 3) If Not StringInStr($sPrefixList, $sSuffix) Or StringMid($sFilename, StringLen($sFilename) - 3, 1) <> "." Then $sSuffix = "png" $sFilename &= ".png" EndIf Switch $sSuffix Case "jpg" Local $sCLSID = _GDIPlus_EncodersGetCLSID("JPG") Local $tParams = _GDIPlus_ParamInit(1) Local $tData = DllStructCreate("int Quality") Local $pData = DllStructGetPtr($tData) Local $pParams = DllStructGetPtr($tParams) $tData.Quality = $iJPGQual _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData) EndSwitch Local $sPrefix = StringTrimRight($sFilename, 4), $hFrame, $iCurrentFrame = 0, $i, $iRet, $hBitmap, $hGfx, $bError = False, $bResize = False If ($iW > 0) And ($iH > 0) And ($iW <> _GDIPlus_ImageGetWidth($hImage)) And ($iH <> _GDIPlus_ImageGetHeight($hImage)) Then $bResize = True $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap) _GDIPlus_GraphicsSetInterpolationMode($hGfx, $iResizeQual) EndIf Local $iFrame For $i = 0 To $iAnimFrameCount If $bReverse Then $iFrame = $iAnimFrameCount - $i Else $iFrame = $i EndIf _GDIPlus_GIFAnimSelectActiveFrame($hImage, $tGUID, $i) Switch $bResize Case False $hFrame = $hImage Case Else _GDIPlus_GraphicsClear($hGfx, 0x00000000) _GDIPlus_GraphicsDrawImageRect($hGfx, $hImage, 0, 0, $iW, $iH) $hFrame = $hBitmap EndSwitch Switch $sSuffix Case "jpg" $iRet = _GDIPlus_ImageSaveToFileEx($hFrame, $sPrefix & "_" & StringFormat("%0" & StringLen(Int($iAnimFrameCount)) & "i." & $sSuffix, $iFrame), $sCLSID, $pParams) If Not $iRet Then $bError = True Case Else $iRet = _GDIPlus_ImageSaveToFile($hFrame, $sPrefix & "_" & StringFormat("%0" & StringLen(Int($iAnimFrameCount)) & "i." & $sSuffix, $iFrame)) If Not $iRet Then $bError = True EndSwitch Next If $bResize Then _GDIPlus_GraphicsDispose($hGfx) _GDIPlus_BitmapDispose($hBitmap) EndIf Return $bError EndFunc ;==>_GDIPlus_GIFAnimExtractAllFrames ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_GIFAnimCreateFile ; Description ...: Creates a GIF animation file ; Syntax ........: _GDIPlus_GIFAnimCreateFile($aImages, $sFilename[, $iDelay = 100]) ; Parameters ....: $aImages - An array of image handles (animation frames). ; $sFilename - The filename of the GIF animation. ; $iDelay - [optional] An integer value. Default is 100 ms per frame. ; Return values .: True or False on errors ; Author ........: UEZ ; Modified ......: ; Remarks .......: Vista or a higher operating system is required to create a GIF animation! ; Related .......: _GDIPlus_EncodersGetCLSID _GDIPlus_ParamInit _GDIPlus_ParamAdd _GDIPlus_ImageSaveToFileEx ; Link ..........: ; =============================================================================================================================== Func _GDIPlus_GIFAnimCreateFile($aImages, $sFilename, $iDelay = 100) Local Const $GDIP_EVTFrameDimensionTime = 21 Local $sCLSID = _GDIPlus_EncodersGetCLSID("GIF") Local $tMultiFrameParam = DllStructCreate("int;") DllStructSetData($tMultiFrameParam, 1, $GDIP_EVTMULTIFRAME) Local $tParams = _GDIPlus_ParamInit(1) _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tMultiFrameParam)) Local $hStream = _WinAPI_CreateStreamOnHGlobal() Local $tGUID = _WinAPI_GUIDFromString($sCLSID) _GDIPlus_ImageSaveToStream($aImages[1], $hStream, DllStructGetPtr($tGUID), DllStructGetPtr($tParams)) DllStructSetData($tMultiFrameParam, 1, $GDIP_EVTFrameDimensionTime) $tParams = _GDIPlus_ParamInit(1) _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tMultiFrameParam)) Local $i For $i = 2 To $aImages[0] - 1 _GDIPlus_ImageSaveAddImage($aImages[1], $aImages[$i], $tParams) Next DllStructSetData($tParams, 1, $GDIP_EVTLASTFRAME) $tParams = _GDIPlus_ParamInit(1) _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tMultiFrameParam)) _GDIPlus_ImageSaveAddImage($aImages[1], $aImages[$i], $tParams) DllStructSetData($tParams, 1, $GDIP_EVTFLUSH) $tParams = _GDIPlus_ParamInit(1) _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tMultiFrameParam)) _GDIPlus_ImageSaveAdd($aImages[$i], $tParams) Local $hMemory = _WinAPI_GetHGlobalFromStream($hStream) Local $iMemSize = _MemGlobalSize($hMemory) Local $pMem = _MemGlobalLock($hMemory) Local $tData = DllStructCreate("byte[" & $iMemSize & "]", $pMem) Local $bData = DllStructGetData($tData, 1) _WinAPI_ReleaseStream($hStream) _MemGlobalFree($hMemory) $bData = StringRegExpReplace($bData, "(?i)(0021F904[[:xdigit:]]{2})[[:xdigit:]]{4}", "${1}" & StringRegExpReplace(Hex(Int($iDelay / 10), 4), "([[:xdigit:]]{2})([[:xdigit:]]{2})", "$2$1")) Local $iExtended = @extended Local $hFile = FileOpen($sFilename, 2) If @error Then Return SetError(2, 0, False) FileWrite($hFile, Binary($bData)) FileClose($hFile) If Not $iExtended Then Return SetError(1, 0, False) Return SetExtended($iExtended, True) EndFunc ;==>_GDIPlus_GIFAnimCreateFile Func _GDIPlus_GIFAnimCreateFileFromImageFiles($aFrames, $sGIFFileName, $bReplay = True) Local $tagGIFHeader = "byte Header[6];byte Width[2];byte Height[2];byte PackedField[1];byte BackgroundColorIndex[1];byte PixelAspectRatio[1];" Local $tGIFHeader_1frame = DllStructCreate($tagGIFHeader & "byte ColorTable[768];") Local $hFile = _WinAPI_CreateFile($aFrames[0][0], 2, 2), $nBytes _WinAPI_ReadFile($hFile, DllStructGetPtr($tGIFHeader_1frame), DllStructGetSize($tGIFHeader_1frame), $nBytes) _WinAPI_CloseHandle($hFile) Local $iColorTableSize = 3 * 2 ^ (BitAND($tGIFHeader_1frame.PackedField, 7) + 1) Local $tGIFHeader_File = DllStructCreate($tagGIFHeader & "byte ColorTable[" & $iColorTableSize & "];byte ApplicationBlockExtension[18]") $tGIFHeader_File.Header = $tGIFHeader_1frame.Header $tGIFHeader_File.Width = $tGIFHeader_1frame.Width $tGIFHeader_File.Height = $tGIFHeader_1frame.Height $tGIFHeader_File.PackedField = $tGIFHeader_1frame.PackedField $tGIFHeader_File.BackgroundColorIndex = $tGIFHeader_1frame.BackgroundColorIndex $tGIFHeader_File.PixelAspectRatio = $tGIFHeader_1frame.PixelAspectRatio $tGIFHeader_File.ColorTable = BinaryMid($tGIFHeader_1frame.ColorTable, 1, $iColorTableSize) $tGIFHeader_File.ApplicationBlockExtension = Binary("0x21FF0B4E45545343415045322E3003010000") Local $bGIFHeader, $i, $b, $p, $d For $i = 1 To 8 $bGIFHeader &= StringTrimLeft(DllStructGetData($tGIFHeader_File, $i), 2) Next For $i = 0 To UBound($aFrames) - 1 $b = Binary(FileRead($aFrames[$i][0])) $p = Floor(StringInStr($b, "0021F904") / 2) $d = Hex(Dec($aFrames[$i][1] / 10), 4) If Not $p Then ContinueLoop $bGIFHeader &= StringMid(StringRegExpReplace(BinaryMid($b, $p, BinaryLen($b) - $p - 1), "(?i)0021F904([[:xdigit:]]{2})([[:xdigit:]]{4})(.*)", "0021F904${1}" & StringRight($d, 2) & StringLeft($d, 2) & "$3"), 3) Next $hFile = FileOpen($sGIFFileName, 18) FileWrite($hFile, Binary("0x" & $bGIFHeader & "3B")) FileClose($hFile) EndFunc ;==>_GDIPlus_GIFAnimCreateFileFromImageFiles ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GDIPlus_BitmapConvertTo8Bit ; Description ...: Converts a bitmap to a 8-bit image ; Syntax ........: _GDIPlus_BitmapConvertTo8Bit(Byref $hBitmap[, $iColorCount = 253[,$iDitherType = $GDIP_DitherTypeDualSpiral8x8[, ; $iPaletteType = $GDIP_PaletteTypeFixedHalftone252,[$bUseTransparentColor = True]]]]) ; Parameters ....: $hBitmap - A handle to an image / bitmap object ; $iColorCount - [optional] An integer value. Default is 253. ; $iDitherType - [optional] An integer value. Default is $GDIP_DitherTypeDualSpiral8x8. -> http://msdn.microsoft.com/en-us/library/ms534106(v=vs.85).aspx ; $iPaletteType - [optional] An integer value. Default is $GDIP_PaletteTypeFixedHalftone252 . -> http://msdn.microsoft.com/en-us/library/ms534159(v=vs.85).aspx ; $bUseTransparentColor - [optional] A binary value. Default is True. ; Return values .: True or False on errors ; Author ........: UEZ ; Modified ......: ; Remarks .......: Vista or a higher operating system is required ; Related .......: _GDIPlus_PaletteInitialize _GDIPlus_BitmapConvertFormat _GDIPlus_ImageLoadFromFile _GDIPlus_BitmapCreateFromScan0 ; Link ..........: http://msdn.microsoft.com/en-us/library/windows/desktop/ms534106(v=vs.85).aspx) ; =============================================================================================================================== Func _GDIPlus_BitmapConvertTo8Bit(ByRef $hBitmap, $iColorCount = 256, $iDitherType = $GDIP_DitherTypeDualSpiral8x8, $iPaletteType = $GDIP_PaletteTypeFixedHalftone252, $bUseTransparentColor = True) $iColorCount = ($iColorCount > 2 ^ 8) ? 2 ^ 8 : $iColorCount Local $tPalette = _GDIPlus_PaletteInitialize(256, $iPaletteType, $iColorCount, $bUseTransparentColor, $hBitmap) If @error Then Return SetError(1, @error, 0) Local $iRet = _GDIPlus_BitmapConvertFormat($hBitmap, $GDIP_PXF08INDEXED, $iDitherType, $iPaletteType, $tPalette) If @error Then Return SetError(2, @error, 0) Return $iRet EndFunc ;==>_GDIPlus_BitmapConvertTo8Bit Func _GDIPlus_BitmapConvertToXBit(ByRef $hBitmap, $iColorCount = 16, $iPixelFormat = $GDIP_PXF04INDEXED, $iDitherType = $GDIP_DitherTypeDualSpiral8x8, $iPaletteType = $GDIP_PaletteTypeFixedHalftone252, $bUseTransparentColor = False) Switch $iPixelFormat Case $GDIP_PXF08INDEXED $iColorCount = ($iColorCount > 2 ^ 8) ? 2 ^ 8 : $iColorCount Case $GDIP_PXF04INDEXED $iColorCount = ($iColorCount > 2 ^ 4) ? 2 ^ 4 : $iColorCount Case $GDIP_PXF01INDEXED $iPaletteType = $GDIP_PaletteTypeFixedBW $iColorCount = 2 Case Else $iPixelFormat = $GDIP_PXF04INDEXED $iColorCount = 16 $iDitherType = $GDIP_DitherTypeDualSpiral8x8 $iPaletteType = $GDIP_PaletteTypeFixedHalftone252 EndSwitch Local $tPalette = _GDIPlus_PaletteInitialize(256, $iPaletteType, $iColorCount, $bUseTransparentColor, $hBitmap) If @error Then Return SetError(1, @error, 0) Local $iRet = _GDIPlus_BitmapConvertFormat($hBitmap, $iPixelFormat, $iDitherType, $iPaletteType, $tPalette) If @error Then Return SetError(2, @error, 0) Return $iRet EndFunc ;==>_GDIPlus_BitmapConvertToXBit Func _GDIPlus_ImageGetColorPalette($hImage, ByRef $tColorPalette, $iSize) Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipGetImagePalette", "handle", $hImage, "struct*", $tColorPalette, "uint", $iSize) If @error Then Return SetError(@error, @extended, 0) If $aResult[0] Then Return SetError(10, $aResult[0], 0) Return True EndFunc ;==>_GDIPlus_ImageGetColorPalette Func _GDIPlus_ImageGetColorPaletteSize($hImage) Local $aResult = DllCall($__g_hGDIPDll, "uint", "GdipGetImagePaletteSize", "handle", $hImage, "uint*", 0) If @error Then Return SetError(@error, @extended, 0) If $aResult[0] Then Return SetError(10, $aResult[0], 0) Return $aResult[2] EndFunc ;==>_GDIPlus_ImageGetColorPaletteSize Example: ;requires 3.3.15.0+ version #AutoIt3Wrapper_Version=b #AutoIt3Wrapper_UseX64=n #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so ;/pe /rm ;~ #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #include <Array.au3> #include <WindowsConstants.au3> #include "_GDIPlus_GIFAnim.au3" _GDIPlus_Startup() Global $fSize = 3.5 Global $binGIFAnim = _BruceLee() Global $hGIFImage = _GDIPlus_BitmapCreateFromMemory($binGIFAnim) Global Const $iW = _GDIPlus_ImageGetWidth($hGIFImage), $iH = _GDIPlus_ImageGetHeight($hGIFImage) Global Const $hGUI = GUICreate("GIF Anim UDF Example", $iW * $fSize, $iH * $fSize) Global Const $iPic = GUICtrlCreatePic("", 0, 0, $iW * $fSize, $iH * $fSize) GUISetState() Global $iCurrentFrame = 0 Global Const $iAnimDimCount = _GDIPlus_GIFAnimGetFrameDimensionsCount($hGIFImage) Global Const $tGUID = _GDIPlus_GIFAnimGetFrameDimensionsList($hGIFImage, $iAnimDimCount) Global Const $iAnimFrameCount = _GDIPlus_GIFAnimGetFrameCount($hGIFImage, $tGUID) Global Const $aFrameDelays = _GDIPlus_GIFAnimGetFrameDelaysFromBinFile($binGIFAnim, $iAnimFrameCount) AdlibRegister("PlayAnimPreview", 10) Do If GUIGetMsg() = -3 Then ;$GUI_EVENT_CLOSE = -3 AdlibUnRegister("PlayAnimPreview") _GDIPlus_BitmapDispose($hGIFImage) _GDIPlus_Shutdown() GUIDelete() $binGIFAnim = 0 Exit EndIf Until False Func PlayAnimPreview() AdlibUnRegister("PlayAnimPreview") Local $iDelay = $aFrameDelays[$iCurrentFrame] Local Static $iTimerCurrentFrame = TimerInit() _GDIPlus_GIFAnimSelectActiveFrame($hGIFImage, $tGUID, $iCurrentFrame) Local $hBmp = _GDIPlus_BitmapCreateFromScan0($iW * $fSize, $iH * $fSize) Local $hGfx = _GDIPlus_ImageGetGraphicsContext($hBmp) _GDIPlus_GraphicsSetInterpolationMode($hGfx, $GDIP_INTERPOLATIONMODE_NEARESTNEIGHBOR) _GDIPlus_GraphicsClear($hGfx, 0xFFFFFFFF) _GDIPlus_GraphicsDrawImageRectRect($hGfx, $hGIFImage, 0, 0, $iW, $iH, 0, 0, $iW * $fSize, $iH * $fSize) Local $hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp) _WinAPI_DeleteObject(GUICtrlSendMsg($iPic, 0x0172 , 0, $hBitmap_GDI)) ;$STM_SETIMAGE = 0x0172, $IMAGE_BITMAP = 0 _WinAPI_DeleteObject($hBitmap_GDI) _GDIPlus_GraphicsDispose($hGfx) _GDIPlus_BitmapDispose($hBmp) If TimerDiff($iTimerCurrentFrame) > $iDelay Then $iCurrentFrame += 1 $iTimerCurrentFrame = TimerInit() EndIf If $iCurrentFrame > UBound($aFrameDelays) - 1 Then $iCurrentFrame = 0 AdlibRegister("PlayAnimPreview", 10) EndFunc ;==>PlayAnimPreview ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2016-12-01 Func _BruceLee($bSaveBinary = False, $sSavePath = @ScriptDir) Local $BruceLee $BruceLee &= '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' $BruceLee &= '+gOuw86w7AAm0K56lUxu1QAK1a2QVTumwQBrNXzkxX9IsAAvT0Bvr/RNUACv8vXYZ6/99gDcd+/99+CHLyD++PMEAQFFCTIDsEQCRVQAdAAAAgByhI+py+0PowCctNqLs968+wAPhuJIluaJpgDqyrbuC8fyTADX9o3n+s73/gAPDAqHxKLxiABMKpfMpvMJjQBKp9Sq9YrNagC33K73Cw6LxwDksvmMTqvX7AC2+w2Py+f0ugD9js/r9/y+/wAPGCg4SFhoeACImKi4yNjo+AwoURCtYAgKABQAACwGAAwAWABqAAAABf8gJY5kAGmeaJoCbOuyAGosz3RNvThgAO98T+ZAnW9IAEQFc8VkMRBgABUKR5dyumM6AKFRGHUrcz2/AAUm+Cnlmk3eALF4XD6frS+CAJwAB7rd9dacAN4M3t99OEyDAIEvf2Z5LoSJAC2HXIxZZVptAI41kJGTQpSVADN5DJ+goXY3AC0LpgtanDKeAKGtoy6nqEKqADM4pi4DA68AABISsam0MbayACy5u72/s8EqALgDsbm3hiMsAMgLDg7Ay0YtANCn3Tg/vL7WANjK2isAptfXAMnRIiymvfISANnnJ/Dk7Kf4AJnx8/Tm7KFJALfgwIFYyYDBAEJYT+A7ggYRAO5rNK0UQ2UTADJqvMCxI0dHAPhMCRCQMGC4AGQkNP9u9NgRACRBkSQnNqyIAJKCyowsOzZoAJDRJcyaXQBcANNyc0JOjjt7AB7CNxKoMKHlAFKuPHpUxEcuACFlShtYUyVVAKpWL5jJGg3cAL2Xskx4ZUnLAKBbtwniyo17AIQDB3cl1npsAPsW7ly5de+mAE2Bk+0dFwgSACP4y7gxY7szAEUU3nu4heLFAI4zP+YQeYRSADeILyvWHNeAAOnTc82q+HwmALRozJpPowa8ADXG1S0sXr+OAH16FI/bVHLrAL7M27TvHqyTAAgfnph3Zx/JAIssZ+7cJFbrAEGZi9a8qTX2AKfaiWfujhuAAAIFz88mFq5BAMPuvxs2sKD7AF25efT11SNgAO9+O3z5AND3AAcL552nmn7rAAGQQf8GLLTnAKAG8UW4AX3pANlXIH7kVXQZAAsLNvgghBJOAJhAhmO1MM9IAFkk2KFl/qUWAOCI+U3hwokCAKS4n4IMsiieAIsCqpLVTtT8ANMLZDhm8h6PADDS8mMDQQpJAOSKDx1JW4+cAGTlwk4SmUJkADhS0kdlJVa2AIBllltq2OKUAEkG48KFWQzUACVt56xZYJslAEzXXGMVLkWRAA12wiaXcTHqAJknl2eWZsCgAA5t8yagiRLRACdjjDbqw6N/AEUqKQ+UzmXpAKU09HknkohKAOqpn16mySkzAABox9h8pp6qACh1f7Eaqj19AEYQgWy49vbiAKzL1HprrrjKABponKkqBqitALbiIJuwrhKaANixyCqr65ecAE4Hbf+yyrCwAOyuw6pZ7LOHAAKAbAQKAbAtALWNWhvuuDNpABsuuomqywK7ANa5y+yl8oobAO137gIKrzb5ANKL6rmtCtTvALr7dmruuwXTALrwteQGai+3AKIuPG/CNUz8AG+vFuuLLZ8dAG8McMcf76BxAMPEQjvrybx6AAcxoix3OyDJABgr7C/KDtNXADLIN7dcos4RAGMaMs7EAg3zANA+e2d0tzG7ACrszrUgLbOeAEvzzHDSoL0IAGieTZ/K6tYSAEvdLCmsihxOAM9Tu1Q20XWKAI0vAA88gLbNAFenXVncc0edAHe8cD9Q6soLAENtcN9/T+2uAOA5x2r32maDAPmii5M+DqdDAMcJTR+Qdpd3AKDlMGI+tn0QAEAQVxzcWDfLAELooz9QutOSADf+OTqrZv46gNm1zW5yDiEFQ1ATACwsAENMAUMGCP/AiYCQTgDIpP8/EmlsOp/QqPS4rE6v2Cyxyk1qv2BjtxsuawMBZKEwXprfUbSa3fbC7+Lkel9A89dKeIJUc3x+f4GDb3JL' $BruceLee &= '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' $BruceLee &= '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' $BruceLee &= 'E1vWttauwk20aPim7ZXddOOssN5gD913iH+7rbbgSDP4J5ODA8l34oRfmVbZCtOahKRvr403Epgfbvaizmluk+gxj/cA6XigrrhzxTZed4yA13IE62bGLT107KuU2blwfm7ee+RVbv4q8H65jtDwvJupGbkYAgABBMk5Z/y3Rzwf/QPTa6u7dszz9Xv3eyMPPrLifxEEACH5BAkKABcALCoADgA6AGgAAAb/wItwSCwOAcikEmlsOp9Q43IKiFqvTqq2iu1at1SvuBkIIAsFsHLMvpTPaTWzLVai74UyHr2mY+17ent9flBvSwSJBIdahVGMSYqLZluOhpRTZZqYS5ZPkEqboEmeTqNyhKVEp6hzqqucDLKztI1FE7i5uiEhBRS4VpC0wwy2RLrIE7wWFcBXUwsLSgMDxlG4yxbOX0vR09VhV9ghFtoTf0nU0dHq0p1d4+Ve3+sL7VNe8RZjSNEO/w7q9XMHJZk+fgD8ARSYkOATg8rI7avT8MCBegxdiYsoj2I0ixjXpbISrwLCegIEZOSCZVeINgOjpVyZLxcvPwNnimS50SXO/4Y6vfEkiexmoZg722w72pCh0nMUp1icOhVfT6jzqFClapXoUihKEIgdS1ZsgrNo02p08jVK2LJw08pNsLZJWyJa4OpFMHfuyCF3j1DZG7evWlJ2sRZBupIwX8NokZytC7Ypxrd7IUcGMHmoWwASQotGoqC0gilkNZ81YEAyXS6BhSARPRqA6dNLUqtm7XpObMFIlaSkjcTsbgOdO6MLnmR4beOaWSd/jVBJ6QcPVrpOyxuA9NccOGCn/GTK9ew7lczt/h1J+PGes/5jeFsJRPccosH/OX9n/ST3ARCefg+Ql5UW/02HBC4D7ccUgqb1xtlrDDbkoCPFlaXeZp0xp/9KhmRtqGASTpUC4lh+TahESAaycSJ0HL7GmEOevPjYYR02RFx8dNiYYo7R7PghAIXhSN0FXZlIZFk/HplkjUvqZmSLQxYZI5WW2AjjiK80oeWNV/IIpWNNYvkTmXJJ2KVsUY4VQQSsfWekcq/Y+GacyKU5IZ1jjtXdm29OgaeaSpL1J6CCxkkohm0eGihPSAyqopgUGdoaAIBGoFGkik7KqKVIZEoep4v22OilovJIqqemgoopopRy2h2flfqJKqyVSUprVpKmis6sRyLUK67PeHfprl2s6muyxpbK662PPussRYeauVizrAp7q7V4YYvsr9BqSqkU3gZLbbjcIlmabrrkdhbtudOi46642sZb7LzsqgtsvmziO66X6/5bmb/1ZksRwfAanNVql+a76rf3JtCdwwH/tJ254NrLzcUU7yvwtdh5XDDElYV8LMbFiswsdlyaytq76LD8GskpGwBzxP8/hzGaorx66txzsU+a2lkDDVhrzU9DF/3xmtdCAMFZFzJdrNNQF7i01BfTLPW1O2/NbNBelxcOEUEAACH5BAkKABgALB4ADgBAAGgAAAX/ICaOZGmeJKCurIq+cCyLbQ3MeI7a/K3/uJ4NSHwFAqpCQcgqOkfH5JLpejpZymzhqFU2rUBsl9v9gnHRFmFNSPPOOfeK3Ub24Gh77cjXt/Azcix9giuAMoVUZocoiYpVjI1+DJSVlm+RkiyWnAyYRTU0hic1CwssAwOfRKEYiyktpqiqQzk1EhKmsgAKvQqQI7O6C6m7rzO3uboqvr8+sCrFutKtQby+KrjDNRYWFRYmKqYO5A7bALs6zNgA2sst3d3h6Avl5u/pP8m4uCoN/wDjgQtG78CBYeeAWWPBj58/gP8EwjJlEOE7hfraKWMBEWK3CRNEDRMgIOGzKxqN/wHoGLACSJG6SJoEk23jSpYNQOqcUIDCP3ELZL6DU3MXzpw7J3j7SU9oPpopT908GtECSIhAzxGN+pBqg48TsNLTeqaoVK9JJ7AwyJbtKnVcp+JMu7at21phoqqsceHCzm4IAiNIQLiwYcPHYJjd26Lv3wqCBx+eTDjxi8VSA4MM' $BruceLee &= '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' $BruceLee &= '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' $BruceLee &= '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' $BruceLee &= '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' $BruceLee &= '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' $BruceLee &= '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' $BruceLee &= '3IupAGQIAQQ0IcdvACUpLN30A0+/AMmtxklv5XPWAAECzTXGLIQAAAA7' $BruceLee = _WinAPI_Base64Decode($BruceLee) If @error Then Return SetError(1, 0, 0) Local $tSource = DllStructCreate('byte[' & BinaryLen($BruceLee) & ']') DllStructSetData($tSource, 1, $BruceLee) Local $tDecompress _WinAPI_LZNTDecompress($tSource, $tDecompress, 17546) If @error Then Return SetError(3, 0, 0) $tSource = 0 Local Const $bString = Binary(DllStructGetData($tDecompress, 1)) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\BruceLee_128x128.gif", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_BruceLee Func _WinAPI_Base64Decode($sB64String) Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "") Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]") $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "") Return DllStructGetData($bBuffer, 1) EndFunc ;==>_WinAPI_Base64Decode Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize) $tOutput = DllStructCreate("byte[" & $iBufferSize & "]") If @error Then Return SetError(1, 0, 0) Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0) If @error Then Return SetError(2, 0, 0) If $aRet[0] Then Return SetError(3, $aRet[0], 0) Return $aRet[6] EndFunc ;==>_WinAPI_LZNTDecompress It scales the GIF anim to factor 3.5.1 point -
Try this : #include <GUIConstants.au3> #include <WinAPIGdi.au3> #include <WinAPISysWin.au3> Global $hGUI = GUICreate("Test") Global $iW = 150, $iH = 30 Global $hHelp = GUICreate("", $iW, $iH, 20, 20, $WS_CHILD, 0, $hGUI) Global $idLabel = GUICtrlCreateLabel("", 0, 0, $iW, $iH) GUICtrlSetBkColor(-1, 0x6BEFF5) GUICtrlCreateInput("", 5, 5, $iW - 10, $iH - 10, -1, $WS_EX_TOOLWINDOW) GUICtrlSetBkColor(-1, 0x6BEFF5) _WinAPI_SetParent($hHelp, $hGui) Global $hRgn = _WinAPI_CreateRoundRectRgn(0, 0, $iW, $iH, 20, 20) _WinAPI_SetWindowRgn($hHelp, $hRgn) GUISetState(@SW_SHOW, $hGUI) GUISetState(@SW_SHOW, $hHelp) While True Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd1 point
-
Splash screen fade in fade out
teodoric666 reacted to Zedna for a topic
FileInstall will embed PNG image inside EXE at compile time and copy it from EXE to destination directory at run time. With Resources UDF you can use PNG directly from EXE without need of extracting image to disk at runtime. fileInstall("test.png", @tempDir & "\test.png") $hImage = _GDIPlus_ImageLoadFromFile(@tempDir & "\test.png") You would should also add deleting image after using it - in case of FileInstall() ...1 point -
Splash screen fade in fade out
teodoric666 reacted to Zedna for a topic
Difference with this approach is that you have to distribute PNG image separately along with compiled EXE. With Resources UDF you have PNG image compiled inside EXE and use it from resources (inside EXE) so you distribute only EXE file.1 point -
Splash screen fade in fade out
teodoric666 reacted to Gianni for a topic
no need to include "ResourcesEx.au3" just try replacing this line $hImage = _Resource_GetAsImage("TEST_PNG_1") with this other one $hImage = _GDIPlus_ImageLoadFromFile(".\test.png")1 point -
I believe I got it ... if not, we'll just call it TexMex 😂1 point
-
WebDriver - add function (wish)
Erik_NJ reacted to SOLVE-SMART for a topic
FYI: GitHub issue https://github.com/Danp2/au3WebDriver/issues/510. Best regards Sven1 point -
Working now. probably It was web cache things. Saludos1 point
-
Developing a Operating System & Kernel in AutoIt
SOLVE-SMART reacted to Somerset for a topic
Your borderline abusive attitude is going to wear thin quite quickly. I suggest stopping that.1 point -
I fixed the 1200 issue... but the decimal issue is because you didn't tell it what to use in the 4th parameter, you used "" rather than " Point " or " Punto ". See this example after you get the corrected code: Global $gsStr = "1200" ConsoleWrite($gsStr & @CRLF) ConsoleWrite( _ _AutCode_NumberToText($gsStr, False, "", "", $N2T_LANGENGLISH) & @CRLF) ConsoleWrite( _ _AutCode_NumberToText($gsStr, False, "", "", $N2T_LANGSPANISH) & @CRLF) $gsStr = "456.78" ConsoleWrite($gsStr & @CRLF) ConsoleWrite( _ _AutCode_NumberToText($gsStr, True, "", " Point ", $N2T_LANGENGLISH) & @CRLF) ConsoleWrite( _ _AutCode_NumberToText($gsStr, True, "", " Punto ", $N2T_LANGSPANISH) & @CRLF)1 point
-
SpellNumber function to convert numbers to words
ioa747 reacted to LAteNightSpecial for a topic
😇 Who doesn't love a good story that they did not write but took the time to read 16 pages of. ConsoleWrite(_TextNumerusGermanicus("-145323523001267.456") & @CRLF) Func _TextNumerusGermanicus($nNumerus, $iDecimalibus = Default) Local $aSingularis[8] = ["s", "mille", "Millio", "Milliardo", "Billiones", "Billiardes", "Trilliones", "Trilliardes"] Local $aPluralis[8] = ["", "mille", "Milliones", "Milliardes", "Billiones", "Billiardes", "Trilliones", "Trilliardes"] Local $aNullEins[8] = ["s", "mille", "Milliones", "Milliardes", "Billiones", "Billiardes", "Trilliones", "Trilliardes"] Local $aMinusculi[19] = ["unus", "duo", "tres", "quattuor", "quinque", "sex", "septem", "octo", "novem", "decem", "undecim", "duodecim", "tredecim", "quattuordecim", "quindecim", "sedecim", "septendecim", "duodeviginti", "novendecim"] Local $aDecem[8] = ["viginti", "triginta", "quadraginta", "quinquaginta", "sexaginta", "septuaginta", "octoginta", "nonaginta"] Local $aDecimalis[10] = ["nulla", "una", "duo", "tres", "quattuor", "quinque", "sex", "septem", "octo", "novem"] Local $sRet = "" ; Convertitur ad string $nNumerus = IsKeyword($iDecimalibus) = 1 ? String($nNumerus) : StringFormat("%." & $iDecimalibus & "f", $nNumerus) ; Numeri negativi If StringLeft($nNumerus, 1) = "-" Then $nNumerus = StringTrimLeft($nNumerus, 1) $sRet = "Minus " EndIf Local $iInteger = StringInStr($nNumerus, '.', 1) ? StringLeft($nNumerus, StringInStr($nNumerus, ".", 1)) : $nNumerus Local $n = StringLen($iInteger), $h, $r, $z, $e Local $aGruppi[Ceiling($n / 3)] Local $sDecimalis = StringInStr($nNumerus, '.', 1) ? StringTrimLeft($nNumerus, StringInStr($nNumerus, ".", 1)) : "" Local $i = -1 While $iInteger > 0 ; Divide integer in gruppis de tribus: $i += 1 $aGruppi[$i] = Mod($iInteger, 1000) $iInteger = Int($iInteger / 1000) WEnd ; Partis integer Local $h, $r, $z, $e While $i >= 0 If $aGruppi[$i] > 0 Then $h = Int($aGruppi[$i] / 100) $r = Mod($aGruppi[$i], 100) $z = Int($r / 10) $e = Mod($aGruppi[$i], 10) If $h > 0 Then $sRet &= $aMinusculi[$h - 1] & "centum" If $r > 0 Then If $r < 20 Then $sRet &= $aMinusculi[$r - 1] Else If $e > 0 Then $sRet &= $aMinusculi[$e - 1] If $e > 0 And $z > 0 Then $sRet &= "et" If $z > 0 Then $sRet &= $aDecem[$z - 2] EndIf EndIf If $aGruppi[$i] = 1 Then $sRet &= $aSingularis[$i] & " " ElseIf StringRight($aGruppi[$i], 2) = "01" Then $sRet &= $aNullEins[$i] & " " Else $sRet &= $aPluralis[$i] & " " EndIf EndIf $i -= 1 WEnd $sRet = StringStripWS($sRet, 2) ; Partis decimalis If $sDecimalis <> "" Then $sRet &= " Virgula" For $sDigitus in StringSplit($sDecimalis, "", 2) $sRet &= " " & $aDecimalis[Int($sDigitus)] Next EndIf Return $sRet EndFunc ;==>_TextNumerusGermanicus1 point -
I think is not working with decimals. I tried with this: @SmOke_N MsgBox(0,"",_AutCode_NumberToText("456.78",True,"","",$N2T_LANGSPANISH)) Result: cuatrocientos Cincuenta y seissetenta y ocho I think it should be: Cuatrocientos cincuenta y seis con setenta y ocho MsgBox(0,"",_AutCode_NumberToText("456.78",True,"","",$N2T_LANGENGLISH)) Result: four hundred Fifty sixseventy eight I think it should be: Four Hundred Fifty Six Point Seventy Eight also 1200 is showing wrong result en both languages. @LAteNightSpecial any of your code is working properly even with simple 1001 or 1200 Saludos1 point
-
Number to Text String And Text To Number (English/Spanish/German/French)
raphacp reacted to LAteNightSpecial for a topic
A perro entre ein居酒屋 e bibit太多了 vodka. Kisha מתגלגל على फर्श 웃으며! Creating a virtual environment in x64 assembly to run AutoIt code on a Linux machine is an incredibly complex task, and it's not a straightforward process. Additionally, running AutoIt code on Linux directly is not supported because AutoIt is designed for Windows environments. As for building a virtual environment in x64 assembly, this would involve creating a complete runtime environment that emulates the behavior of a Windows system, including system calls, memory management, and more. This is an incredibly challenging task that typically requires a deep understanding of both x64 assembly language and operating system internals. Thank you for the kind words SmOke_N, but I do not think we have ever been properly introduced. Thank you for allowing me to contribute to your community. It is always a pleasure pushing the boundaries of what is and what can be. However, patience and determination can accomplish many tasks. We never throw stones in glass houses, as we might get cut by the sharp shards. Respect ~1 point -
Number to Text String And Text To Number (English/Spanish/German/French)
LAteNightSpecial reacted to SmOke_N for a topic
I thought about the gender part too... tbh, I'm probably never going to use this... it was just something that irritated me enough to do something. BTW, what version of AutoIt are you running that it works in? I ran it and it did nothing but error until I categorized your arrays in the NumberToText_Group() func (and you're missing "ten" and "diez") You're pretty sharp though, you certainly remind me of someone from the past lol... thanks for joining and commenting.1 point