使用AutoIT优化选项卡控件

问题描述 投票:0回答:1

所以我写这个来模拟一个具有启动和停止功能的程序,并且有一个tab design。现在有一个标签,其中有一个RichEdit对象,用于运行日志。

正如你所看到的,在我们“启动”程序之后,我只用了几毫秒的sleep来模拟运行指令。我创建了一个函数来检查在整个代码中随机调用的更大规模的请求,以便按照说法对GUI进行ping操作。

#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

在大约500ms睡眠时,可以看到切换标签时的延迟。

我的问题:在更大的范围内,这是我们在运行更大的程序时如何处理/更新特定于选项卡的内容?如果没有,那么在运行更大的整体程序时更新特定于标签的属性的更有效方法是什么。

我最近也看到了一个设计,其中所有标签和相关组件都是他们自己的GUI's,但我不确定一切都是自己的GUI的相关性,如果它与这个问题有关。

非常感谢任何帮助或澄清,我是AutoIT的新手,并试图找出一些不做和不做的效率。

performance autoit
1个回答
0
投票
#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不是一个理想的消息代码,虽然没有找到更适合只更改Tabs的东西。

隐藏和显示Rich Edit控件的代码已移至WM_NOTIFY函数中,以便每次收到消息时,Tab隐藏并显示代码执行。

ConsoleWrite用于显示测试期间感兴趣的事件。如果编辑器具有输出控制台窗格,则可以查看对控制台窗格的写入。

如果诸如函数Start之类的事件需要很长时间,那么多处理可能有助于允许Gui保持对消息循环的响应。

想要一个 做 不要,避免(循环)递归函数调用,避免陷入循环中。


其他参考文献:

© www.soinside.com 2019 - 2024. All rights reserved.