您希望移动控件使其不超出窗体的边界。使用左边框,跟踪边框很容易:
if (PointToClient(p).X >= 0){/*код*/ }
但是当我尝试这样做时:
int w = ActiveForm.Size.Width;
if (PointToClient(p).X <= w){/*код*/ }
该元素仍然超出了右边界。也就是说Size.Width,它不是窗体的右边框。
对此,问题是:如何确定正确的边界?
您希望移动控件使其不超出窗体的边界。使用左边框,跟踪边框很容易:
if (PointToClient(p).X >= 0){/*код*/ }
但是当我尝试这样做时:
int w = ActiveForm.Size.Width;
if (PointToClient(p).X <= w){/*код*/ }
该元素仍然超出了右边界。也就是说Size.Width,它不是窗体的右边框。
对此,问题是:如何确定正确的边界?
作为答案,我可以提供一个简单的“在额头上”,但仍然是SLN 形式的解决方案。
在那里,一个面板只是在窗体上运行,从窗体的边缘和顶部面板开始,检查控件(面板)的坐标是否超出设置的边界。
代码本身:
您的问题更多是关于数学而不是编程。但是因为缺一不可,我会详细写的。
去。控件在窗体上的位置和窗体在屏幕上的位置由左上角的位置和属性
Control.Location(下图中红点)设置。剩余角的位置可以通过将属性中设置的控件的长度和/或宽度添加Control.Size到坐标来计算Control.Location。这样,为了让控件始终完全保持在父控件(窗体也是控件)的边界内,坐标值
Control.Location不应该超出图中绿色区域的边界。这个区域的大小很容易根据控件和父控件的大小计算出来。它仍然只考虑一点。控件可以具有特定的边框样式,这对于窗体尤其重要。该属性
Control.Size设置控件的外部尺寸,因此如果您使用它们来确定可用的绘图区域,则子控件将落在框架或表单标题下。这不是你想看到的结果。考虑到控件、框架、标题等的设计尺寸,定义了该属性Control.ClientSize,其中包含可用于绘制子元素的区域的实际尺寸(仔细阅读图中的标题)。正确确定了右边界。您只是检查一个特定点的可见性 - 控件的左上角。
此外,检查也不严格,捕获超出右边界的一个像素(因为坐标在 0 ≤ x < (width) 范围内,因为从零开始计数)。
最后,检查元素左边框相对于零的位置以及右边框相对于表单宽度的位置是有意义的。