C#winform控件的各种坐标获取
一、窗体
- 绿色边框框住的区域:屏幕
- 橙色边框框住的区域:窗体
- 黄色边框框住的区域:窗体工作区
1.边框
窗体的FormBorderStyle可以设置以下的值,每个值导致窗体的边框的宽度不一样,但是可以发现的是左、右、下边框的宽度是一样的:
//
// 摘要:
// 指定窗体的边框样式。
[ComVisible(true)]
public enum FormBorderStyle
{
//
// 摘要:
// 无边框。
None = 0,
//
// 摘要:
// 固定的单线边框。
FixedSingle = 1,
//
// 摘要:
// 固定的三维边框。
Fixed3D = 2,
//
// 摘要:
// 粗、 固定的对话框样式边框。
FixedDialog = 3,
//
// 摘要:
// 可调整大小的边框。
Sizable = 4,
//
// 摘要:
// 不是可调整大小工具窗口边框。 在任务栏中或在用户按 ALT + TAB 时出现的窗口中未显示工具窗口。 虽然窗体,用于指定 System.Windows.Forms.FormBorderStyle.FixedToolWindow
// 通常不显示在任务栏中,您必须确保 System.Windows.Forms.Form.ShowInTaskbar 属性设置为 false, ,因为其默认值是
// true。
FixedToolWindow = 5,
//
// 摘要:
// 可调整大小的工具窗口边界。 在任务栏中或在用户按 ALT + TAB 时出现的窗口中未显示工具窗口。
SizableToolWindow = 6
}
可以通过ClientSize获取工作区的大小,即窗体除边框外的大小
Size clientSize = this.ClientSize; //获取窗体工作区的大小
int left = (this.Size.Width - clientSize.Width) / 2; //左右的边框长度
int top = (this.Size.Height - clientSize.Height) - left; //下边框和左右边框长度一样
各窗体模式下的边框宽度如下:
2.坐标
窗体的坐标,即Location属性,是窗体左上角(不是工作区的左上角)相对于屏幕而言的。屏幕左上角是原点,原点往右为X的正方向,往下为Y的正方向。
二、相对坐标
1.PointToClient
将指定屏幕点的位置计算成工作区坐标
Control.PointToClient(p2);
p2坐标是相对于屏幕,即屏幕左上角原点(0,0)的坐标;假如Control相对于屏幕原点的坐标为 p1;Control.PointToClient(p2) 的结果为 p2 - p1。即以p1为原点时p2的坐标(坐标系和窗体的一致)
PS:如果Control为Form时,p1为Form工作区相对于原点的坐标,而不是Location。
2.PointToScreen
将指定工作区点的位置计算成屏幕坐标
Control.PointToScreen(p2);
p2坐标是相对于屏幕,即屏幕左上角原点(0,0)的坐标;假如Control相对于屏幕原点的坐标为 p1;Control.PointToScreen(p2) 的结果为 p2 + p1。即以屏幕原点为原点p1和p2的叠加
PS: 如果Control为Form时,p1为Form工作区相对于原点的坐标,而不是Location。
三、获取坐标
1.相对于屏幕
Control.PointToScreen(new Point(0,0)); //获取控件相对于屏幕原点的绝对坐标
PS:如果Control为Form时,是指工作区相对于屏幕的坐标。Form相对于屏幕的坐标就是Location
2.相对于控件
//Control1相对于Control2的坐标
Control2.PointToClient(Control1.PointToScreen(new Point(0,0)));
3.相对于窗体
Control.FindForm().PointToClient(Control.PointToScreen(new Point(0,0)));