当您处理客户端坐标时,原点(左上角)点具有坐标(0,0).总是.范围由表单的宽度和高度定义,可分别通过Me.ClientSize.Width和Me.ClientSize.Height访问.因此,客户端矩形是:
{(0,0)×(ClientSize.Width,ClientSize.Height)},也可以使用ClientRectangle属性进行检索.
客户区的独特之处在于它排除了表单的非客户区域 – 边框,标题栏和其他依赖于系统的属性.
(图片用于创建Aero ToolStrip时从Jose Menendez Póo’s article开始的说明)
您不必担心计算这些尺寸(也不应该,因为它们可能会发生变化).您只需在客户端坐标中工作,框架将负责其余部分.在父窗体上定位子对象(如控件)时使用客户端坐标,甚至可以通过指定客户端大小来调整窗体大小.考虑到非客户区域,其实际大小将自动计算.
您将不得不处理屏幕坐标是非常罕见的.如果你想在屏幕上移动一个窗体(窗口),你只需要那些(这也应该是罕见的,因为你不知道用户有什么尺寸的屏幕,你也不应该试着控制她放置窗户的位置).在屏幕坐标中,主监视器的左上角有坐标(0,0).坐标系的其余部分基于virtual screen,它考虑了多监视器配置.
表单的“位置”和“大小”属性为您提供屏幕坐标值.如果需要在客户端和屏幕坐标之间进行映射(转换),可以使用PointToClient和PointToScreen方法.传递这些分别根据屏幕或客户端坐标定义的位置,并将它们转换为其他坐标系.
唯一需要注意的其他复杂因素是Windows使用endpoint-exclusive rectangles.WinForms包装器在其Rectangle结构中保留了该约定.你几乎不必担心这一点,因为一旦你理解它,这真的是一个非常自然的系统.此外,WinForms框架的所有部分和部分都使用约定,因此如果您只是绕过点,大小和矩形,则不太可能遇到麻烦.但需要注意的是.可以这样想:您的客户区域具有矩形{(0,0)×(ClientSize.Width,ClientSize.Height)},如前所述.如果要用纯色填充此矩形,则填充将从点(0,0)延伸到点(ClientSize.Width – 1,ClientSize.Height – 1).