2014-02-05 72 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); 
相关问题