欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GUI 參考 - 消息循環(huán)模式

在消息循環(huán)模式下, 腳本大部分時(shí)間都在執(zhí)行一個(gè)周期非常短的循環(huán),這個(gè)循環(huán)通知 GUI 使用 GUIGetMsg 函數(shù)截獲消息.

當(dāng)某個(gè)消息發(fā)生時(shí), GUIGetMsg 函數(shù)的返回值將顯示消息的詳細(xì)信息(如按鈕點(diǎn)擊, GUI 關(guān)閉, 等等.).

該 MessageLoop 模式是 AutoIt 默認(rèn) GUI 模式 - 另一個(gè)模式是 OnEvent 事件模式.

在消息模式下, 只有頻繁調(diào)用 GUIGetMsg 函數(shù)才有可能接收到消息,

因此您必須確保每秒時(shí)間內(nèi)多次調(diào)用該函數(shù),否則您的 GUI 將無(wú)法響應(yīng)消息.

 

基本消息循環(huán) 構(gòu)

下面是消息循環(huán)的基本結(jié)構(gòu)代碼:

While 1
  $msg = GUIGetMsg()
  ...
  ...
WEnd

 

像上面這種循環(huán)周期非常短的腳本通常會(huì)把 CPU 占用推高到 100%,

幸運(yùn)的是 GUIGetMsg 函數(shù)可在無(wú)消息時(shí)自動(dòng)閑置 CPU.

另外千萬(wàn)不要因?yàn)榕略黾?CPU 的壓力而自己添加休眠語(yǔ)句(Sleep)到腳本中,這么做只會(huì)讓 GUI 響應(yīng)遲鈍.

 

GUI 消息

GUIGetMsg 返回的消息消息有以下三種:

 

無(wú)消息

沒(méi)有截獲任何消息時(shí), GUIGetMsg 的返回值為 0.這也是 最常發(fā)生的消息

 

控件消息

當(dāng)某個(gè)控件被點(diǎn)擊或該控件有其它變化時(shí)將發(fā)送控件消息. 這些消息代碼都是正數(shù), 并且關(guān)聯(lián)發(fā)送消息的控件ID.

(也即使用 GUICtrlCreate.... 函數(shù)創(chuàng)建該控件時(shí)的返回值).

 

系統(tǒng)消息

系統(tǒng)消息包括 GUI 關(guān)閉等在內(nèi),它們的值都是負(fù)數(shù).下面列出了各種系統(tǒng)消息(與事件模式完全相同),

(在 GUIConstantsEx.au3 中定義):

$GUI_EVENT_CLOSE ---------- 窗口關(guān)閉
$GUI_EVENT_MINIMIZE ------- 窗口最小化
$GUI_EVENT_RESTORE -------- 窗口還原
$GUI_EVENT_MAXIMIZE ------- 窗口最大化
$GUI_EVENT_PRIMARYDOWN ---- 鼠標(biāo)左鍵按下
$GUI_EVENT_PRIMARYUP ------ 鼠標(biāo)左鍵釋放
$GUI_EVENT_SECONDARYDOWN -- 鼠標(biāo)右鍵按下
$GUI_EVENT_SECONDARYUP ---- 鼠標(biāo)右鍵釋放
$GUI_EVENT_MOUSEMOVE ------ 鼠標(biāo)移動(dòng)
$GUI_EVENT_RESIZED -------- 調(diào)整大小
$GUI_EVENT_DROPPED -------- 拖動(dòng)操作

 

GUI 示例

GUI 概論 頁(yè)面上我們?cè)帉?xiě)過(guò)一個(gè)簡(jiǎn)單的窗口:

#include <GUIConstantsEx.au3>

GUICreate("您好,世界", 200, 100)
GUICtrlCreateLabel("您好,世界! 你過(guò)得怎么樣?", 30, 10)
GUICtrlCreateButton("確定", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)

 

現(xiàn)在我們來(lái)嘗試使用消息循環(huán)以及上面描述的消息來(lái)完成全部代碼.

出于腳本的可讀性考慮, 我們使用 Select 條件選擇語(yǔ)句:

#include <GUIConstantsEx.au3>

GUICreate("您好,世界", 200, 100)
GUICtrlCreateLabel("您好,世界! 你過(guò)得怎么樣?", 30, 10)
$okbutton = GUICtrlCreateButton("確定", 70, 50, 60)
GUISetState(@SW_SHOW)

While 1
  $msg = GUIGetMsg()

  Select
    Case $msg = $okbutton
      MsgBox(0, "GUI 消息", "你點(diǎn)擊了 '確定'!")

    Case $msg = $GUI_EVENT_CLOSE
      MsgBox(0, "GUI 消息", "您選擇了關(guān)閉窗口!正在退出...")
      ExitLoop
  EndSelect
WEnd

就這么簡(jiǎn)單. 很明顯的, 創(chuàng)建的窗口及控件越多則腳本越復(fù)雜, 但基本結(jié)構(gòu)都是類(lèi)似上面的這個(gè)示例.

 

高級(jí) GUIGetMsg 與多窗口操作

即使有多窗口存在, 控件 ID 也是唯一的. 因此上面的腳本也能在多窗口環(huán)境中正常工作.

但是在處理如 $GUI_EVENT_CLOSE(窗口關(guān)閉) 或 $GUI_MOUSEMOVE(鼠標(biāo)移動(dòng)) 等消息時(shí),

您還必須知道究竟是哪個(gè)窗口引發(fā)的消息. 為了解決這個(gè)問(wèn)題, 您可以參考下面這個(gè)語(yǔ)句來(lái)調(diào)用 GUIGetMsg 函數(shù)

$msg = GUIGetMsg(1)

 

當(dāng)調(diào)用函數(shù) GUIGetMsg 指定參數(shù) 1, 則它將返回一個(gè)數(shù)組而不是消息值,

這個(gè)數(shù)組不僅包括被截獲的消息(保存在$array[0]中), 還包括其它信息, 如窗口句柄等(保存在$array[1]中).

假設(shè)我們要?jiǎng)?chuàng)建兩個(gè)窗口, 則相應(yīng)的腳本代碼如下:

#include <GUIConstantsEx.au3>

$mainwindow = GUICreate("您好,世界", 200, 100)
GUICtrlCreateLabel("您好,世界! 你過(guò)得怎么樣?", 30, 10)
$okbutton = GUICtrlCreateButton("確定", 70, 50, 60)

$dummywindow = GUICreate("用于測(cè)試用虛擬窗口,不會(huì)顯示 ", 200, 100)

GUISwitch($mainwindow)
GUISetState(@SW_SHOW)

While 1
  $msg = GUIGetMsg(1)

  Select
    Case $msg[0] = $okbutton
      MsgBox(0, "GUI 消息", "你點(diǎn)擊了 '確定'!")

    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $mainwindow
      MsgBox(0, "GUI 消息", "您選擇了關(guān)閉主窗口!正在退出...")
      ExitLoop
  EndSelect
WEnd

 

第一個(gè)主要的變化是 GUISwitch 函數(shù)的調(diào)用.

當(dāng)新的窗口被創(chuàng)建之后, 該窗口即成為后面所有 GUI 操作(包括創(chuàng)建控件)的“默認(rèn)”工作窗口,

也就是說(shuō)這些 GUI 操作的對(duì)象都會(huì)是這個(gè)默認(rèn)窗口.

現(xiàn)在要處理的是"您好,世界"的窗口, 而不是那個(gè)虛擬測(cè)試窗口, 這時(shí)就要使用 GUISwitch 函數(shù)來(lái)切換操作對(duì)象.

某些 GUI 函數(shù)允許調(diào)用時(shí)使用窗口句柄指定操作目標(biāo), 同時(shí)也將自動(dòng)切換該目標(biāo)窗口為"默認(rèn)窗口".

所以在這個(gè)示例中, 我們可以改用這樣的語(yǔ)句:

GUISetState(@SW_SHOW, $mainwindow)

 

下一個(gè)變化是 GUIGetMsg 函數(shù)的用法以及消息是如何被截獲并處理的.注意腳本中 $msg[0] 和 $msg[1] 的用法.

現(xiàn)在可以確保窗口關(guān)閉按鈕被點(diǎn)擊的消息是從主窗口發(fā)送的時(shí)候才退出 GUI 了.

 

provider with jb51.net (unicode)