Что нового

Элементы GUI Мигает GUICtrlCreateInput при условии блокирования чекбоксом

Tosyk

Новичок
Сообщения
206
Репутация
0
Приветствую,

Помогите победить мигание поля ввода в скрипте:

Код:
#include <File.au3>
#Include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ColorConstants.au3>

AutoItSetOption("MustDeclareVars", 1)
HotKeySet("{ESC}", "Terminate")

Local $i
Local $sSourceFile, $sDestFile, $sDestFile3, $sRunWait, $sParams, $sNewFileName, $sFileLogPath, $iFileSize, $ScriptNameWoExt
Local $hGUI, $ProgressBar1, $Label, $Progress, $Progress1, $inpVal, $CheckKeepAlpha, $v1, $sNewFileName2, $sDestFile2, $sParams2, $sRunWait2, $LabelStatus, $bMover, $cMover, $qMover, $ExtractAlpha, $FlipY, $ExtractBlue
Local $sDrive, $sFolder, $sFileName, $sExt
Local $sIMConv = 'magick.exe', $sIMPathFull = 'C:\Program Files\ImageMagick\', $sIMPath = FileGetShortName($sIMPathFull & $sIMConv) ; path to image magick tools
Local $Exts = "tga|jpg|bmp|dds|png|tif|jpeg", $sPattern = "\.(?i:" & $Exts & ")", $ExtsPreview = " tga | jpg | bmp | dds | png | tif | jpeg "  ; supported input file extensions
Local $ExtOutput = "jpg", $ExtOutput2 = "png"
Local $LogDefaultSize = '70'

If Not $CmdLine[0] Then
    MsgBox($MB_SYSTEMMODAL, "Usage", "Drop " & $ExtsPreview & " file(s)" & @LF & "on " & @ScriptName)
    ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
    Exit
EndIf

If $CmdLine[0] <> 0 Then
    If FileExists($sIMPath) Then
        ProcessFiles()
    Else
        MsgBox(0, $sIMConv & " not found", "File [" & $sIMPathFull & $sIMConv & "] not found" & @CRLF)
        ConsoleWrite("Download Image Magick: " & $sIMConv & " to use this tool." & @CRLF)
    EndIf
Else
    MsgBox(0, "Usage", "Drop file(s) on " & @ScriptName)
    ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Func ProcessFiles()
    #Region ### START Koda GUI section ### Form=
    $hGUI = GUICreate("Converting to PNG", 300, 285, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")

    ;PNG Option group
    ;$cMover = 0
    ;Local $Group2 = GUICtrlCreateGroup("Options (PNG):", 8, 5+$cMover, 284, 56)
    ;$CheckKeepAlpha = GUICtrlCreateCheckbox("Keep alpha channel", 24, 30+$cMover, 130, 17)
    ;$FlipY = GUICtrlCreateCheckbox("Flip Vertical", 160, 30+$cMover, 130, 17)
    ;GUICtrlSetState($CheckKeepAlpha, $GUI_CHECKED)

    ;JPG Quality Input
    $qMover = 68
    ;Local $Group1 = GUICtrlCreateGroup("Extraction options (JPG):", 8, 5+$qMover, 284, 86)
    $ExtractAlpha = GUICtrlCreateCheckbox("Extract alpha channel", 24, 28+$qMover, 130, 17)
    $ExtractBlue = GUICtrlCreateCheckbox("Extract blue channel", 160, 28+$qMover, 130, 17)
    $inpVal = GUICtrlCreateInput("90", 20, 56+$qMover, 260, 22)
    GUICtrlSetState(-1, $GUI_DISABLE)

    ;Buttons and bar
    $bMover = 92
    $Label = GUICtrlCreateLabel("Press Convert to proceed", 20, 94+$bMover, 220, 20, $SS_LEFT)
    $LabelStatus = GUICtrlCreateLabel("Ready", 20, 153+$bMover, 220, 20, $SS_LEFT)
    $Progress1 = CreateProgress(20, 115+$bMover, 260, 20)
    Local $Button1 = GUICtrlCreateButton("Convert", 206, 150+$bMover, 75, 25)
    GUICtrlSetState ($Button1, $GUI_DEFBUTTON)
    
    ;Initializer
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
                Exit
            Case $ExtractAlpha or $ExtractBlue
                If _IsChecked($ExtractAlpha) or _IsChecked($ExtractBlue) Then
                    GUICtrlSetState($inpVal, $GUI_ENABLE)
                Else
                    GUICtrlSetState($inpVal, $GUI_DISABLE)
                EndIf
            Case $Button1
                GUICtrlSetState($inpVal, $GUI_DISABLE)
                GUICtrlSetState($CheckKeepAlpha, $GUI_DISABLE)
                GUICtrlSetState($Button1, $GUI_DISABLE)
                MainLoop()
                ExitLoop
            Case Else
                ContinueLoop
        EndSwitch
    WEnd
EndFunc   ;==>ProcessFiles

Func Settings()
    If _IsChecked($CheckKeepAlpha) Then
        $v1 = ' '
    Else
        $v1 = ' ' & '-alpha off' & ' '
    EndIf
    
    If _IsChecked($ExtractAlpha) Then
        ;Extracting JPG
        $sSourceFile = '"' & $sSourceFile & '"'
        $sNewFileName = ($sFileName & '_a.' & $ExtOutput)
        $sDestFile = '"' & $sDrive & StringTrimRight($sFolder, 1) & '\' & $sNewFileName & '"'
        $sParams = '-channel A -separate -quality' & ' ' & GUICtrlRead($inpVal) & ' ' & '-colorspace sRGB'
        $sRunWait = $sIMPath & " " & $sSourceFile & " " & $sParams & " " & $sDestFile
    EndIf

    ;Converting PNG
    $sNewFileName2 = ($sFileName & '.' & $ExtOutput2)
    $sDestFile2 = '"' & $sDrive & StringTrimRight($sFolder, 1) & '\' & $sNewFileName2 & '"'
    $sDestFile3 = $sDrive & StringTrimRight($sFolder, 1) & '\' & $sNewFileName2
    $sParams2 = $v1 & '-colorspace sRGB'
    $sRunWait2 = $sIMPath & " " & $sSourceFile & " " & $sParams2 & " " & $sDestFile2
EndFunc   ;==>Settings

Func MainLoop()
    WriteLogFile()
    ConsoleWrite("File Log Path: " & $sFileLogPath & @LF)

    For $i = 1 To $CmdLine[0]
        $sSourceFile = $CmdLine[$i]
        _PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)
        GUICtrlSetData($ProgressBar1, ($i / $CmdLine[0]) * 100)

        UpdateProgress($Progress1, ($i / $CmdLine[0]) * 100)
        GUICtrlSetData($Label, $sFileName & $sExt)
        GUICtrlSetState($LabelStatus, $GUI_ENABLE)
        GUICtrlSetColor($LabelStatus, $COLOR_BLACK)
        GUICtrlSetData($LabelStatus, 'Converting')
        Sleep(20)

        If StringRegExp($sExt, "\A" & $sPattern & "\z", 0) = 1 Then
            If FileExists($sSourceFile) Then
                Settings() ; function of settings
                ConsoleWrite("Full converting path: " & $sRunWait & @LF)
                RunWait(@ComSpec & ' /c ' & $sRunWait, '', @SW_HIDE)
                RunWait(@ComSpec & ' /c ' & $sRunWait2, '', @SW_HIDE)
            Else
                ConsoleWriteError("File [" & $sSourceFile & "] not found" & @CRLF)
            EndIf

            If FileExists($sDestFile3) Then
                LabelAnim(' .')
                LabelAnim(' . .')
                LabelAnim(' . . .')
                LabelAnim(' . . . OK')
                Sleep(20)
            Else
                LabelAnim(' .')
                LabelAnim(' . .')
                LabelAnim(' . . .')
                GUICtrlSetColor($LabelStatus, $COLOR_RED)
                LabelAnim(' . . . ERROR')

                UpdateLogFile()
            EndIf
        Else
;            MsgBox(0, "Wrong extension", "Extension of file [" & $sFileName & "] is [" & $sExt & "] and not in" & @LF & "[" & $ExtsPreview & "]" & @CRLF)
            ConsoleWriteError("Extension of file [" & $sSourceFile & "] is [" & $sExt & "] and not in [" & $sPattern & "]" & @CRLF)
;            Terminate()

            LabelAnim(' .')
            LabelAnim(' . .')
            LabelAnim(' . . .')
            GUICtrlSetColor($LabelStatus, $COLOR_RED)
            LabelAnim(' . . . Wrong Extension')
            
            UpdateLogFile()
        EndIf
    Next

    ; Retrieve the file size (in bytes)
    $iFileSize = FileGetSize($sFileLogPath)
    ConsoleWrite("FileLog size: " & $iFileSize & @LF)

    If $iFileSize < $LogDefaultSize Then
         FileDelete($sFileLogPath)
    ElseIf $iFileSize > $LogDefaultSize Then
        FileMove($sFileLogPath, @WorkingDir, $FC_OVERWRITE)
    EndIf

    GUICtrlSetData($Label, "Converting complete")
    Sleep(10)
EndFunc   ;==>MainLoop

Func LabelAnim($Result)
    GUICtrlSetData($LabelStatus, 'Converting' & $Result)
    Sleep(12)
EndFunc

Func RemoveExt($Input)
    Local $ExtArray = StringSplit($Input, ".")
    Return StringReplace($Input, "." & $ExtArray[$ExtArray[0]], "", -1)
EndFunc

Func GetFileName($Input)
    Local $PathArray = StringSplit($Input, "\/")
    Return $PathArray[$PathArray[0]]
EndFunc

;---------------------------------------------------------------
;- Creating file in @tempdir
;---------------------------------------------------------------
Func WriteLogFile()
    ; Create a constant variable in Local scope of the filepath that will be read/written to.
    $ScriptNameWoExt = RemoveExt(GetFileName(@ScriptName))
    $sFileLogPath = (@TempDir & '\' & '_' & $ScriptNameWoExt & '_errorlog_' & @YEAR & '_' & @MON & '_' & @MDAY & '_' & @HOUR & '_' & @MIN & '_' & @SEC & '_.txt')

       If FileExists($sFileLogPath) Then
        FileDelete($sFileLogPath)
    EndIf

    ; Create a temporary file to write data to.
    If Not FileWrite($sFileLogPath, "ImageMagick converter (" & $sIMConv & ") can't convert these files:" & @CRLF) Then
        MsgBox($MB_SYSTEMMODAL, "", "An error occurred whilst writing the temporary file.")
        Return False
    EndIf
EndFunc

;---------------------------------------------------------------
;- Update log file in @tempdir
;---------------------------------------------------------------
Func UpdateLogFile()
    ; Open the file for writing (append to the end of a file) and store the handle to a variable.
    Local $hFileOpen = FileOpen($sFileLogPath, $FO_APPEND)
    If $hFileOpen = -1 Then
        MsgBox($MB_SYSTEMMODAL, "", "An error occurred whilst writing the temporary file.")
        Return False
    EndIf

    ; Write data to the file using the handle returned by FileOpen.
    FileWriteLine($hFileOpen, ($sFileName & $sExt))
    Sleep(20)

    ; Close the handle returned by FileOpen.
    FileClose($hFileOpen)
EndFunc

;---------------------------------------------------------------
;- Enhanced Progress widget
;---------------------------------------------------------------
Func CreateProgress($x, $y, $w, $h, $Label="")
    Dim $Progress[2]
    $Progress[0] = GuiCtrlCreateProgress($x, $y, $w, $h) ; this is progress bar
    $Progress[1] = GuiCtrlCreateLabel("---", $x+0, $y-21, '', '', $SS_RIGHT) ; this is percentage label
    GUICtrlSetFont($Progress[1], 11, 500, 0, "")
    GUICtrlSetBkColor($Progress[1], $GUI_BKCOLOR_TRANSPARENT)
    Return $Progress
EndFunc

Func UpdateProgress($ProgressID, $Percent, $Label="")
    GUICtrlSetData($ProgressID[0], $Percent)
    GUICtrlSetData($ProgressID[1], $Label & Round($Percent, 1) & "%")
EndFunc

Func _IsChecked($idControlID)
    Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func Terminate()
    If WinGetHandle('') <> $hGUI Then
            HotKeySet('{ESC}')
            Send('{ESC}')
            HotKeySet('{ESC}', '_Close')
            Return
    EndIf

    GUIDelete()
    Exit
EndFunc   ;==>Terminate

Exit(0)


проблема вот в этом месте:
Код:
Case $ExtractAlpha or $ExtractBlue
                If _IsChecked($ExtractAlpha) or _IsChecked($ExtractBlue) Then
                    GUICtrlSetState($inpVal, $GUI_ENABLE)
                Else
                    GUICtrlSetState($inpVal, $GUI_DISABLE)
                EndIf


если убрать "or $ExtractBlue" и "or _IsChecked($ExtractBlue)", то поле не мигает.
Сообщение автоматически объединено:

помогите пожалуйста
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
проблема вот в этом месте:
Так нельзя, в Switch Case нужно указывать условия через запятую, иначе оно срабатывает всё время.
Код:
...
        $iMsg = GUIGetMsg()
    
        Switch $iMsg
            ...
            Case $ExtractAlpha, $ExtractBlue
                GUICtrlSetState($inpVal, (_IsChecked($iMsg) ? $GUI_ENABLE : $GUI_DISABLE))
            ...
        EndSwitch
 
Верх