我已經掉下了一個深深的兔子洞。實際上我已經處理了兩個問題。我不認爲任何人會爲第一個問題提供解決方案(在下一段中提到),所以我想真正的問題是如何可靠地使用PointToScreen/PointToClient。客戶端/屏幕座標轉換
我想使用氣球來顯示我寫的用戶控件的驗證失敗。做到這一點的方法是在IsBalloon集中使用工具提示。在我的驗證錯誤處理程序中,我使用用戶控件作爲參數在工具提示上調用Show()。如果我點擊另一個控件,這將起作用,但如果我使用Tab離開控件,則不適用。我甚至嘗試過在另一個線程上排隊等待一些任務,然後嘗試顯示氣球。什麼都沒有
所以,我決定嘗試去解決這個和使用主窗口(「本」)作爲參數,並指定座標,即:我好像
_balloon.Show(text, this, pos);
不能計算位置(但是)。
我想這個職位是控制的右下角,所以這裏是:
var clientBottomRight = new Point(_ctrlCallbackPhone.Width, _ctrlCallbackPhone.Height);
於是,我試圖讓那個地方的實際屏幕座標,像這樣:
var screenPosition = _ctrlCallbackPhone.PointToScreen(clientBottomRight);
最後,我試圖讓在主窗體上的座標( 「本」),像這樣:
var mainPosition = this.PointToClient(screenPosition);
然後我顯示氣球。由於Windows錯誤,您必須執行兩次操作。
_balloon.Show(string.Empty, this, mainPosition);
_balloon.Show(text, this, mainPosition);
結果遠高於它的位置,稍微偏左。雖然錯誤的邊界看起來像標題欄的大小,但我不明白這是怎麼回事。我得到一個地點的屏幕座標,並詢問同一地點的客戶端座標。
當然,如果有人有一個真正的解決方案來讓氣球工作,當我離開控制檯時,我會停止關心屏幕座標的事情。我認爲這是某種Windows怪異,但我無法解決。