2014-02-05 99 views
0

我已經掉下了一個深深的兔子洞。實際上我已經處理了兩個問題。我不認爲任何人會爲第一個問題提供解決方案(在下一段中提到),所以我想真正的問題是如何可靠地使用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怪異,但我無法解決。

回答

1

我不完全理解爲什麼這個作品,但是這導致了正確的座標:

var mainPosition = this.PointToClient(screenPosition); 
mainPosition = new Point(
       mainPosition.X + SystemInformation.VerticalResizeBorderThickness, 
       mainPosition.Y + SystemInformation.CaptionHeight + SystemInformation.HorizontalResizeBorderThickness); 
相關問題