2012-01-19 46 views
3

我正在寫一個自定義的工具提示窗口(我們稱之爲A)。它必須顯示在另一個窗口(我們稱之爲B)和:如何設置另一個窗口?

  • 不要從B偷的焦點

  • 而用戶繼續不要失去在z順序的位置到B輸入到乙

  • A必須收到WM_NCHITTEST消息(ⅰ使用它們跟蹤在非活動窗口的鼠標位置)

  • 當帶過來乙另一個窗口,就必須在使爲好;情況B被覆蓋,不可見,但會顯示一個應該儘量避免

我曾嘗試使用SetWindowPos功能後,由乙方這樣調用它的包裝(A中所定義)來實現這一點:

public void SetLocation(Point location, IntPtr UnderHandle) 
    { 
     SetWindowPos(Handle, HWND_TOPMOST, location.X, location.Y, Width, Height, 
          SetWindowPosFlags.DoNotActivate); 

    } 

(從pinvoke.net SetWindowPosFlags)

結果滿足幾乎所有我除了LST一個需求。

有什麼我也嘗試:

  • HWND_TOP:在活動窗口B不帶來窗A;更確切地說:在通話之後,它確實將窗口A帶到前景,但是然後B轉到前景;在實際中,當B被標題欄移動並且鼠標按鈕被按下時,窗口A被繪製在它上面 - 但是在沒有按下鼠標按鈕的時刻

  • 使用UnderHandle作爲第一參數調用SetWindowPos,在嘗試「窗口中的下把窗口B」產生同樣的結果

SetWindowPos應如何USD正確地實現預期的結果 - 或者,如何可以窗口B的在ZORDER位置進行監控,以迫使窗口中的到它旁邊的位置(從前景窗口)?

回答

2

顯然HWND_TOPMOST是你的問題,你肯定不能這樣做。您可以通過使用B. HWND_TOP,但隨後面臨的挑戰是如何保持一個窗口,窗口上B的頂部做到這一點的方法是使被owned

擁有的窗口

的重疊或彈出式窗口可以由另一個 重疊或彈出式窗口擁有。被擁有對 窗戶放置了幾個限制。

  • 一個擁有的窗口始終在z所有者的上方。
  • 當其擁有者 銷燬時,系統自動銷燬擁有的窗口。
  • 擁有窗口在其所有者最小化時隱藏。

只有 重疊或彈出窗口可以是所有者窗口;子窗口 不能成爲擁有者窗口。當創建一個與WS_OVERLAPPEDWS_POPUP風格的窗口的應用程序創建的 一個擁有窗口指定所有者的窗口句柄作爲 CreateWindowExhwndParent參數。參數hwndParent參數必須標識重疊的 或彈出窗口。如果hwndParent標識子窗口,則系統 將所有權分配給子窗口的頂級父窗口。 創建擁有的窗口後,應用程序無法將窗口的所有權轉移給其他窗口。

事實上,從上面的第一個要點可以看出,一旦擁有權設置正確,就不需要HWND_TOP

+0

謝謝!根據你的建議,我設定A.Owner = B沒有得到我想要的。 – Srv19

相關問題