我正在開發多線程TDI UI(如果感興趣,請使用C1 DockingTabs)。到目前爲止,我已經設法讓每個窗口在單獨的線程中打開,並使用SetParent Win32 API將其放入適當的選項卡中。我還設法讓模式對話框在標籤中顯示,並且不阻止其他標籤的工作(通過在對話框窗體上的Shown事件中添加一個處理程序來再次調用SetParent - 一些涉及打開和關閉的小工具TopLevel在選項卡內的表單上,但它起作用)。停止ShowDialog從父窗體中移除焦點
現在,發生什麼有點討厭的是,對話框正在打開,從TDI父窗體移除焦點,然後焦點立即被放回。如果我在顯示它之前調用SetParent,那麼我只是得到一個異常,因爲在具有父級的表單上不能有模態對話框。我已經設法繞過窗口動畫幻燈片/淡入和淡出,通過給它一個0,0的大小,直到它在標籤內,但我無法制定出如何停止焦點輕彈和回到主要父母形式。
我想有兩種可能的途徑:(?也許阻塞窗口消息)
- 禁用窗口作用,這使它看起來像它已失去焦點
- 居然真的停止它失去焦點
我明白這是一個不尋常的查詢,所以真的很高興任何幫助!
編輯:
要澄清這一點在鍛鍊 - 我有一個標籤基於UI其中每個選項卡實際上是獨立的。每次有人調用ShowDialog時,我都有來自最終用戶的抱怨,它阻止了整個應用程序,而不是僅僅一個選項卡。我可以看到解決這個問題的唯一方法就是爲每個選項卡分配一個UI線程,並在選項卡中加載對話框,以便用戶仍然可以訪問其他選項卡。我已經設法在一定程度上消除了一些黑客行爲,並且現在解決了大部分問題(只是玩了更多)。實際上,我已經設法通過在主窗體上阻止WM_NCACTIVATE消息來解決問題,雖然這有點麻煩,因爲現在它從不顯示爲已停用。我想我必須檢測激活的表單是否是此對話框的子對象,以決定是否激活。我也試圖解決一些閃爍問題,但它看起來好多了。我會張貼代碼,但有3種形式涉及到這麼短的上傳項目,它會有點混亂。如果有人好奇,我會看看我能否減少它?
我現在正在玩它作爲概念證明 - 如果我得到這個工作,那麼我需要改造它到我現有的應用程序,這是真正的樂趣開始的地方!儘管我有一個控制TDI方面的框架,所以從這方面來看,它應該是相當直接的。真正的噩夢是審計整個事情,以找出跨不同線程的可能同步問題,因爲有一些共享資源本質上不是線程安全的。
如果你不真的需要'ShowDialog'的行爲,就好像不使用'ShowDialog'會更簡單。你能否不把對話框顯示爲非模態,並禁用父窗體,從對話框的關閉事件中重新啓用它?如果你這樣做,你也不需要從一個單獨的線程打開每個窗口。 – hvd
這種行爲沒有任何意義,發佈重現問題的代碼片段。 –
@HansPassant它對我來說非常有意義。如果表單A包含表單B,表單B具有焦點,則將表單B從表單A中移除並放回,表單A暫時未聚焦,然後重新聚焦。而我所建議的意思是表格B不需要首先從表格A中刪除。 – hvd