Windows窗体的坐标系在哪里停止和启动?

Nul*_*ark 5 vb.net winforms

我正在使用VB.NET编写一个使用碰撞检测的Windows窗体运行的游戏.为了实现这一点,我必须能够理解定位系统.我知道窗体坐标从左上角开始,不包括底边或右边.但坐标开始和停止的数量是多少?(我的意思是左上角坐标是什么,几乎是右下角坐标是什么)

Cod*_*ray 5

坐标系统取决于您是在谈论客户坐标还是屏幕坐标.这是一个基本的Windows UI管理器,WinForms包装器遵循相同的模式.

当您处理客户端坐标时,原点(左上角)点具有坐标(0, 0).总是.范围由表单的宽度和高度定义,可分别通过Me.ClientSize.Width和访问Me.ClientSize.Height.因此,客户端矩形是:
{ (0, 0)x (ClientSize.Width, ClientSize.Height)},也可以使用该ClientRectangle属性进行检索.

客户区的独特之处在于它排除了表单的非客户区域 - 边框,标题栏和其他依赖于系统的属性.

          
          (图片摘自JoseMenendezPóo关于创建Aero ToolStrip 的文章)

您不必担心计算这些尺寸(也不应该,因为它们可能会发生变化).您只需在客户端坐标中工作,框架将负责其余部分.在父窗体上定位子对象(如控件)时使用客户端坐标,甚至可以通过指定客户端大小来调整窗体大小.考虑到非客户区域,其实际大小将自动计算.

您将不得不处理屏幕坐标是非常罕见的.如果你想在屏幕上移动一个窗体(窗口),你只需要那些(这也应该是罕见的,因为你不知道用户有什么尺寸的屏幕,你也不应该试着控制她放置窗户的位置).在屏幕坐标中,主监视器的左上角有坐标(0, 0).坐标系的其余部分基于虚拟屏幕,该屏幕考虑了多监视器配置.

          

表单LocationSize属性为您提供屏幕坐标值.如果您需要映射客户和屏幕坐标之间(转换),也有PointToClientPointToScreen方法.传递这些分别根据屏幕或客户端坐标定义的位置,并将它们转换为其他坐标系.

唯一需要注意的其他复杂因素是Windows使用端点专用矩形.WinForms包装器在其Rectangle结构中保留了该约定.你几乎不必担心这一点,因为一旦你理解它,这真的是一个非常自然的系统.此外,WinForms框架的所有部分和部分都使用约定,因此如果您只是绕过点,大小和矩形,则不太可能遇到麻烦.但需要注意的是.可以这样想:您的客户区域有矩形{ (0, 0)× (ClientSize.Width, ClientSize.Height)},正如我们之前看到的那样.如果要用纯色填充此矩形,则填充将从一点延伸到另一(0, 0)(ClientSize.Width - 1, ClientSize.Height - 1).