Оптимизация управления вкладками с AutoIT - PullRequest
0 голосов
/ 03 апреля 2019

Итак, я написал это для имитации программы, которая будет иметь функцию запуска и остановки и имеет tab design.Прямо сейчас есть вкладка с объектом RichEdit, предназначенным для запуска журнала.

Как вы можете видеть, после того, как мы "запустили" программу, я положил всего несколько миллисекунд sleep для имитации запускаинструкции.Я создал функцию для проверки запросов, которые будут вызываться в большем масштабе случайным образом по всему коду, чтобы пропинговать GUI за слово.

#include <GUIConstantsEx.au3>
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>

Global Const $h_numOfTabs = 2
Global Enum $H_TAB_1, $H_TAB_2, $H_TAB_END
Global $hGui, $h_logRichEdit, $iMsg,  $h_tabs, $h_startButton, $h_stopButton

Example()

Func Example()
    $hGui = GUICreate("Example (" & StringTrimRight(@ScriptName, StringLen(".exe")) & ")", 400, 550, -1, -1)

    ; ADD START AND STOP BUTTONS
    $h_startButton = GUICtrlCreateButton( "Start", 50, 450 )
    $h_stopButton = GUICtrlCreateButton( "Stop", 150, 450 )

    $h_tabs = GUICtrlCreateTab( 5, 5, 390,375 )

    ; LOG TAB
    GUICtrlCreateTabItem( "Log" )
    $h_logRichEdit = _GUICtrlRichEdit_Create ( $hGui, "", 8, 30, 384, 347, BitOR( $ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY ) )

    ; STATS TAB
    GUICtrlCreateTabItem( "Stats" )

    ; Close TABS
    GUICtrlCreateTabItem( "" )

    GUISetState( @SW_SHOW ) ; initialize the gui

    While True
        CheckRequests()
    WEnd
EndFunc   ;==>Example

Func Start()
    while true
        Sleep(100)
        CheckRequests()
    WEnd
EndFunc

Func Stop()

EndFunc

Func CheckRequests()
    $iMsg = GUIGetMsg()
    while $iMsg <> 0
        Select
            Case $iMsg = $GUI_EVENT_CLOSE
                _GUICtrlRichEdit_Destroy($h_logRichEdit) ; needed unless script crashes
                ; GUIDelete()   ; is OK too
                Exit
            Case $iMsg = $h_tabs
                Switch GUICtrlRead( $h_tabs )
                    Case $H_TAB_1
                        ControlShow( $hGui, "", $h_logRichEdit )
                    Case Else
                        ControlHide( $hGui, "", $h_logRichEdit )
                EndSwitch
            Case $iMsg = $h_startButton
                Start()
            Case $iMsg = $h_stopButton
                Stop()
        EndSelect
        $iMsg = GUIGetMsg()
    WEnd
EndFunc

При сне около 500 мс задержка при переключении вкладокявляется видимым.

Мой вопрос: В более широком масштабе это то, как мы будем обрабатывать / обновлять элементы, относящиеся к вкладке, при запуске более крупной программы?Если нет, то что было бы более эффективным способом обновления специфических свойств вкладок при запуске более крупной общей программы.

Недавно я также видел дизайн, в котором все вкладки и связанные компоненты были их GUI's, но я не уверен, что все, что является его собственным GUI, относится к этому вопросу.

Любая помощь или разъяснения очень важны, я новичок в AutoIT и пытаюсь выяснить некоторые преимущества и недостатки, а также эффективность.

1 Ответ

0 голосов
/ 05 апреля 2019
#include <GUIConstantsEx.au3>
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>

Global Const $h_numOfTabs = 2
Global Enum $H_TAB_1, $H_TAB_2, $H_TAB_END
Global $hGui, $h_logRichEdit, $iMsg,  $h_tabs, $h_startButton, $h_stopButton

Example()

Func Example()
    $hGui = GUICreate("Example (" & StringTrimRight(@ScriptName, StringLen(".exe")) & ")", 400, 550, -1, -1)

    ; ADD START AND STOP BUTTONS
    $h_startButton = GUICtrlCreateButton( "Start", 50, 450 )
    $h_stopButton = GUICtrlCreateButton( "Stop", 150, 450 )

    $h_tabs = GUICtrlCreateTab( 5, 5, 390,375 )

    ; LOG TAB
    GUICtrlCreateTabItem( "Log" )
    $h_logRichEdit = _GUICtrlRichEdit_Create ( $hGui, "", 8, 30, 384, 347, BitOR( $ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY ) )
    _GUICtrlRichEdit_AppendText($h_logRichEdit, "{\rtf {Showing \b1 Rich Text \b0}")

    ; STATS TAB
    GUICtrlCreateTabItem( "Stats" )

    ; Close TABS
    GUICtrlCreateTabItem( "" )

    ; Register Windows message.
    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

    GUISetState( @SW_SHOW ) ; initialize the gui

    GuiMessageLoop()
EndFunc

Func GuiMessageLoop()
    While 1
        $iMsg = GUIGetMsg()

        Switch $iMsg
            Case $GUI_EVENT_CLOSE
                _GUICtrlRichEdit_Destroy($h_logRichEdit) ; needed unless script crashes
                ; GUIDelete()   ; is OK too
                Exit

            Case $h_startButton
                Start()

            Case $h_stopButton
                Stop()
        EndSwitch
    WEnd
EndFunc

Func Start()
    ConsoleWrite('# Sleep' & @CRLF)
    Sleep(5000)
    ConsoleWrite('# Awake' & @CRLF)
EndFunc

Func Stop()

EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $iLoWord = _WinAPI_LoWord($lParam)
    Local $iHiWord = _WinAPI_HiWord($lParam)
    ConsoleWrite('- WM_NOTIFY' & ' ' & $iLoWord & ' ' & $iHiWord & @CRLF)

    Switch GUICtrlRead( $h_tabs )
        Case $H_TAB_1
            ControlShow( $hGui, "", $h_logRichEdit )
        Case Else
            ControlHide( $hGui, "", $h_logRichEdit )
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

Попробуйте этот пример. Он использует GuiRegisterMessage для захвата WM_NOTIFY Сообщения Windows. WM_NOTIFY не идеал Код сообщения для этого, хотя что-то не нашли больше подходит только для смены вкладок.

Код для скрытия и отображения элемента управления Rich Edit был перешел в функцию WM_NOTIFY, чтобы каждый раз сообщение получено, вкладка скрыть и показать код выполняется.

ConsoleWrite используется, чтобы показать, какие события представляют интерес делают во время тестирования. Если ваш редактор имеет выход панель консоли, то вы сможете просматривать записи в панель консоли.

Если событие, такое как функция Start, занимает много времени, тогда многопроцессорная обработка может помочь оставаться отзывчивым с циклом сообщений.

Хотите сделать не, избегать ( циклический ) рекурсивной функции звонки и избегайте зацикливания.


Дополнительные ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...