Jump to content

Converting GUIs to support DPI scaling


paw
 Share

Recommended Posts

I use SetSoundDevice to control my audio devices but the UI was either
 

blurry like this:

Spoiler


 rnNBPZO.png

or unusable like this:

Spoiler

WUiAUX4.png


so I made this horrible thing to add scaling to the GUI:

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_HiDpi=y
#AutoIt3Wrapper_AU3Check_Parameters=-w 3 -w 4 -w 5
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/sf /sv /rm
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <File.au3>

;~ _convertGUI("")
If $CmdLine[0] <> 0 Then _convertGUI($CmdLine[1])
Func _convertGUI($sFilePath)
    If $sFilePath <> "" Then
        Local $aArray = FileReadToArray($sFilePath)
    Else
        ;TEST DATA
        Local $aArray[6] = ['$H_Res_Language = GUICtrlCreateProgress(5, 120, 210 + 25, 480, 20, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE)) ; $CBS_DROPDOWNLIST)', _
                'Local $h_Ok = GUICtrlCreateButton("Ok", 72, 224, 81, 33, 0)', _
                'GUICreate($Warning_TiTle, 700, 310, -1, -1, $WS_SIZEBOX + $WS_SYSMENU + $WS_MINIMIZEBOX)', _
                'GUICtrlCreateLabel("Output type: ", 30, 130, 65, 20) ;, $SS_RIGHT)', _
                '$H_FieldNameEdit = GUICtrlCreateEdit($INP_FieldNameEdit, 100,260+25, 500, 150 - 25) ;comment', 'Local $H_CANCEL = GUICtrlCreateGraphic("Cancel", 224, 224, 97, 33, 0)']
    EndIf

    Local $hTimer = TimerInit(), $iGUIElementCount = 0, $sResult = "", $sFileName = "", $sDrive = "", $sDir = "", $sExtension = ""
    If @Compiled Then
        _PathSplit($sFilePath, $sDrive, $sDir, $sFileName, $sExtension)
        $sFileName = StringRegExpReplace($sFilePath, "^.*\\", "")
    EndIf

    For $i = 0 To (UBound($aArray) - 1)
        If StringRegExp($aArray[$i], "GUICtrlCreate|GUICreate") Then
            $sResult = _splitComma($aArray[$i])
            If Not @error Then $aArray[$i] = $sResult
            $iGUIElementCount += 1
        EndIf
    Next

    ConsoleWrite("t = " & TimerDiff($hTimer) & " GUI elements = " & $iGUIElementCount & " lines = " & (UBound($aArray) - 1) & @CRLF)

    If $sFileName <> "" Then
        Local $hFile = FileOpen("edited." & $sFileName, 2)
        _FileWriteFromArray("edited." & $sFileName, $aArray)
        FileClose($hFile)
    EndIf

    Exit
EndFunc   ;==>_convertGUI


Func _splitComma($sString)
    Local $sSplitResult = "", $sTrimmedR = "", $sTrimmedL = ""
    Local $aSplit = StringSplit($sString, ',')
    If Not @error Then
        $sTrimmedR = ""
        $sTrimmedL = ""
        For $j = 1 To $aSplit[0]

            If StringRegExp($aSplit[1], "(?:.GUICtrlCreateGraphic|GUICtrlCreateProgress|GUICtrlCreateSlider|GUICtrlCreateTab|GUICtrlCreateTreeView)") Then
                If $j = 1 Then
                    While StringLeft($aSplit[$j], 1) <> '('
                        $sTrimmedL &= StringLeft($aSplit[$j], 1)
                        $aSplit[$j] = StringTrimLeft($aSplit[$j], 1)
                    WEnd
                    $aSplit[$j] = StringTrimLeft($aSplit[$j], 1)
                EndIf
            EndIf

            If $j = $aSplit[0] Then
                While StringRight($aSplit[$j], 1) <> ')'
                    $sTrimmedR &= StringRight($aSplit[$j], 1)
                    $aSplit[$j] = StringTrimRight($aSplit[$j], 1)
                WEnd
                $aSplit[$j] = StringTrimRight($aSplit[$j], 1)
            EndIf

            If StringRegExp($aSplit[$j], "[0-9]") And $aSplit[$j] <> -1 And $aSplit[$j] <> 0 And $aSplit[$j] <> 1 And Not StringInStr($aSplit[$j], ')') Then
                If StringRegExp($aSplit[$j], "\-|\+") Then ;put parenthesis around + or -
                    $aSplit[$j] = '(' & $aSplit[$j] & ")*$g_DPI"
                Else
                    $aSplit[$j] = $aSplit[$j] & "*$g_DPI"
                EndIf
            EndIf

            If $j < $aSplit[0] Then
                $sSplitResult &= $aSplit[$j] & ','
            ElseIf $j = $aSplit[0] Then
                $sSplitResult &= $aSplit[$j] & ')'
            Else
                $sSplitResult &= $aSplit[$j]
            EndIf

        Next

        If $sTrimmedR <> "" Then $sSplitResult &= StringReverse($sTrimmedR)
        If $sTrimmedL <> "" Then $sSplitResult = $sTrimmedL & '(' & $sSplitResult

    Else
        SetError(1)
        Return
    EndIf

    ConsoleWrite($sSplitResult & @CRLF)
    Return $sSplitResult

EndFunc   ;==>_splitComma


And now it looks good: 

Spoiler

OkTONha.png

but it doesn't work on everything, for example the "GUICtrlCreateLabel("Output type: ", 30, 130, 65, 20) ;, $SS_RIGHT)" (from the autoit3wrapper gui)
because the comment contains a parenthesis and it would break completely if there were variables as parameters..
Is there some kind of parser around that I could use instead or maybe someone who has already done something like this?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...