2008-12-16 55 views
1

我正在討論Windows桌面應用程序。我期待編寫一個函數,例如SelectObject(例如)阻止調用者,直到用戶單擊應用程序客戶區中的對象。一旦用戶選擇了一個對象,該函數就會返回一個指向它的指針。次要消息循環與單獨輸入線程

執行此操作的一種方法是運行一個小型消息循環並過濾掉WM_MOUSE*,同時將其他消息傳遞迴外部消息循環。 (CRectTracker是否這樣做我想。)

這也可以重新設計,以在它自己的單獨線程中運行調用者。然後,SelectObject將使用CreateEvent/SetEvent/ResetEvent與處理鼠標消息的主線程同步,並在滿足滿足對象選擇的條件時返回控制。

每種方法的優缺點是什麼?我在哪裏可以找到關於這種設計的更多信息?這些事情的正式條款是什麼?

密切觀察或使用AutoCAD的程序員可能會理解我在這裏如此糟糕的表達。

回答

1

我不知道它的一個術語,但是您所描述的功能類型是我稱之爲模態函數,與模態窗口一樣。這聽起來像你想要的東西有點像TrackPopupMenu。我希望它能像你所描述的那樣工作,並帶有一個消息循環來處理彈出式菜單的鼠標和鍵盤消息。

我認爲你的主意只會變得複雜而沒有多少好處。底層窗口的消息仍然會到達該窗口的線程,而不是您單獨的線程,並且您在該窗口上執行的任何繪畫都將不得不在該窗口的線程中發生。

您是否知道SetCapture?我認爲這可能有助於獲得您想要去的地方。它允許您將所有鼠標事件彙集到單個窗口,即使鼠標不在該窗口之上。

-1

Modal在Win32中沒有意義。 SelectObject完全偏離主題(GDI)

+0

請仔細閱讀該問題。我不是在談論GDI的SelectObject函數。 – 2010-08-12 11:19:29