【发布时间】:2017-01-28 20:35:20
【问题描述】:
我想将表单定位在屏幕的左上角。
我尝试过this.Location = new Point(0,0),但窗口位于 (7,0) - 窗口顶部位于屏幕顶部,但左侧距离屏幕边缘 7 个像素。
我创建了新的 WinForms 应用程序进行测试并仅添加了以下代码:
private void Form1_Load(object sender, EventArgs e)
{
Point p = new Point(0, 0);
WindowState = FormWindowState.Maximized;
Debug.WriteLine("\nMaximized");
Debug.WriteLine("Location: " + Location);
Debug.WriteLine("Size: " + Size);
Debug.WriteLine("PointToScreen(0,0): " + PointToScreen(p));
WindowState = FormWindowState.Normal;
Location = p;
Debug.WriteLine("\nNormal");
Debug.WriteLine("Location: " + Location);
Debug.WriteLine("Size: " + Size);
Debug.WriteLine("PointToScreen(0,0): " + PointToScreen(p));
Debug.Write("\nScreen.PrimaryScreen.WorkingArea: ");
Debug.WriteLine(Screen.PrimaryScreen.WorkingArea);
}
输出是:
Maximized
Location: {X=-8,Y=-8}
Size: {Width=1936, Height=1056}
PointToScreen(0,0): {X=0,Y=23}
Normal
Location: {X=0,Y=0}
Size: {Width=300, Height=300}
PointToScreen(0,0): {X=8,Y=31}
Screen.PrimaryScreen.WorkingArea: {X=0,Y=0,Width=1920,Height=1040}
为什么Location = new Point(0,0) 不在 (0,0) 上定位表单?
这是由于我的系统上的某些问题吗?我有Win10和VS2015。任务栏在底部,我的桌面左侧什么都没有。
为了将它定位在(0,0)上,我实际上必须将它定位在(-7,0)上。此外,报告的最大化表单宽度比屏幕宽度大 16 个像素。我知道由于窗口边缘、标题栏等原因,客户区大小和表单大小之间存在差异,但事实并非如此。当表单最大化时,没有左右边缘(客户区宽度=桌面宽度),但表单宽度为+16px。表格的 4 边各有 +8px,但 Y 位置没问题。为什么 Y 位置可以,而 X 位置不行?
【问题讨论】:
-
您将位置设置为
0,0,而Debug.WriteLine显示Location: {X=0,Y=0}。所以有什么问题?还有PointToScreen(0,0): {X=8,Y=31}也可以,就是窗体客户区0,0点的屏幕坐标。 -
我之前在 Win10 或 8.1 上没有注意到这个定位问题。如果我不得不猜测,我会说观察到的问题是无法再禁用的桌面窗口管理器组合的结果。需要调查的新事物。谢谢。 :)
-
问题是,就像我写的那样,窗口的位置(实际上,就是我能看到的)是右侧 7 个像素。注意客户端坐标 (8,31) - X 为 8,因为窗口位置为 7,加上窗口边缘的 1 个像素,Y 为 31,因为标题栏。这就是为什么当我将位置设置为 (-7,0) 时,窗口就在角落里。所以,客户端坐标没问题——客户端矩形真的从 (8,31) 开始。表单坐标不正确 - 表单位置真的 (7,0),而不是它所说的 (0,0)。
标签: c# .net forms winforms location