• 沒有找到結果。

訊息問題

在文檔中 探討彈性顯示方式 (頁 33-36)

第四章 問題探討

4.2 軟體問題

4.2.1 訊息問題

圖表 35 操控區域

在本系統的擺設中,攝影機只擷取操控區域的影像。雖然此時仍會有畫面閃 爍和可見光干擾效應,但操控區域為單純的白色影像,因此投出來的畫面只剩閃 爍的影像,再透過 Mix Background 的方法,可以將閃爍問題降到最低。

4.2 軟體問題

軟體問題探討本系統遇到所有非硬體所產生的問題。 我們列出了四個主要 的問題:

1. 訊息問題: 利用傳送訊息方式與微軟系統溝通發生的問題。

2. 系統流暢度: 系統執行的速度問題。

3. 場景變動: 攝影機擷取畫面變化太複雜所產生的問題。

4. 討論操控方式: 探討使用者操控本系統的方式。

4.2.1 訊息問題

訊息問題只要是要探討當透過傳遞訊息與微軟系統溝通的時候所發生的 問題,我們列出兩個主要的問題:

1. 訊息延遲(Delay)

2. 無法處理的訊息

探討這兩個問題之前,我們先瞭解微軟系統是如何處理接收到的訊息。

如流程圖 36 所示,當使用者送出訊息的時候,如 WM_PAINT。 微軟系統 會先將所有訊息先放到一個訊息佇列(Message Queue)中,再將訊息透過訊息 迴路將存在訊息佇列中的訊息分派給指定的訊息處理(Message Handler),最 後,訊息處理會將訊息送到正確的函式(function)處理訊息。

圖表 36 微軟訊息傳遞流程

在瞭解微軟系統如何處理訊息之後,首先,探討訊息延遲的原因。

本系統利用 PostMessage 的方式傳送訊息到訊息佇列中而告知此時我們希望 透過標記下達的指令為何。

z 右鍵單擊:

::PostMessage(g_hwndFoundWindow, WM_RBUTTONDOWN, MK_LBUTTON, lParam);

::PostMessage(g_hwndFoundWindow, WM_RBUTTONUP, MK_LBUTTON, lParam);

z 左鍵雙擊:

::PostMessage(g_hwndFoundWindow, WM_LBUTTONDOWN, MK_LBUTTON, lParam);

::PostMessage(g_hwndFoundWindow, WM_LBUTTONUP, MK_LBUTTON, lParam);

::PostMessage(g_hwndFoundWindow,WM_LBUTTONDBLCLK,MK_LBUTTON,lParam);

PostMessage 處理傳遞訊息的方式類似網路的 UDP(Universal Datagram Protocol) 模式,即訊息傳送出去以後不管訊息有沒有被處理都繼續執行接下來的流程。 因 此,本系統偶而會發生下達指令以後,訊息可能因為優先權(Priority)不夠高,一 直被擺在訊息佇列中,等到所有優先權高的訊息處理完才處理使用者下達的指 令,或者因為 PostMessage 沒有檢查訊息是否真的有被執行,導致訊息根本沒有 被放到訊息佇列中,讓使用者下達的命令根本不會觸發。

雖然有另外一種 SendMessage 的方式傳遞訊息。 SendMessage 的處理方式類 似網路的 TCP(Transmission Control Protocol)模式,即訊息送出去以後會等訊息確 定被處理以後才繼續接下來的流程。 但是,如果系統利用此方法傳遞訊息的話,

將會造成系統為了要等待每一個訊息的處理,而失去了系統即時性的優點。所 以,本系統最終還是採用 PostMessage 的方法來處理訊息傳遞的工作。

PostMessage 傳遞訊息的方式與微軟系統溝通,透過這種方式,要處理滑鼠拖 曳(Drag)指令會變的很困難。 一般拖曳的動作可以分成下面幾步:

1. 在想要被拖曳的檔案或資料夾上面按單擊滑鼠左鍵。

2. 按著滑鼠左鍵不放,將檔案或資料夾拖曳到想要的地點。

3. 放開滑鼠左鍵。

照著這樣的流程利用 PostMessage 的方法應該如下:

1. ::PostMessage(g_hwndFoundWindow, WM_LBUTTONDOWN, MK_LBUTTON, lParam);

2. 移動滑鼠到想要的地點。

3. ::PostMessage(g_hwndFoundWindow, WM_LBUTTONUP, MK_LBUTTON, lParam);

照這樣的流程發現檔案只能稍微的抖動一下,沒辦法順利的拖曳。 因此,我們 為了避免流程錯誤,我們測試框選數個檔案和資料夾,而並非只針對單一檔案或 資料夾做拖曳動作,流程如下:

1. ::PostMessage(g_hwndFoundWindow, WM_LBUTTONDOWN, MK_LBUTTON, lParam);

2. 移動滑鼠框選欲拖曳的檔案和資料夾到指定位置

3. ::PostMessage(g_hwndFoundWindow, WM_LBUTTONUP, MK_LBUTTON, lParam);

照這樣的流程發現我們可以利用 PostMessage 框選出欲拖曳的檔案和資料夾,如 圖 37 紅色框選部分

圖表 37 利用傳遞訊息做框選的動作

但同樣的,我們只能稍微的讓檔案們抖動,並沒有辦法移動他們。 因此,如果 要利用 PostMessage 的方法模擬滑鼠的拖曳動作,必須瞭解整個拖曳動作的流 程,其中包括在微軟系統是如何處理拖曳這個動作?回傳的是什麼參數?我們該 怎麼去處理這一串的流程?而不再只是單純的利用 PostMessage 傳遞訊息給訊息 佇列,整個過程冗長且繁瑣,因此,在本系統中,並沒有處理拖曳這個動作。

在文檔中 探討彈性顯示方式 (頁 33-36)

相關文件