【问题标题】:place panel in rectangle with screen coordinates将面板放置在具有屏幕坐标的矩形中
【发布时间】:2021-09-20 03:51:58
【问题描述】:

如何让面板使用我绘制的矩形点的相同坐标? 例如,假设我用

绘制一个矩形的点
SetCursorPos(200, 200); // top left
SetCursorPos(200, 400); // top right
SetCursorPos(400, 400); // bottom right
SetCursorPos(200, 400); // bottom left
SetCursorPos(300, 300); // center

然后我创建一个面板,并给它相同的尺寸

panel.Size = new Size(200, 200);

现在我想将面板准确定位在矩形的位置。

这是我遇到问题的地方。 我一直在尝试实现这一目标,但没有成功。 我试过了……

Control control = panel;
Point point control.PointToClient(new Point(200 + 8, 200 + 32)); // the additions make up for the fact that PointToClient and PointToScreen are out by those pixels

当我定位面板时,这会显示面板的正确坐标。

panel.Location = new Point(point.X, point.Y);

之前:位置点 0,0

之后:

(0) 左上角 - 200,200

(1) 中心 - 300,300

定位点 200,200

矩形:(200, 200)-(400, 400) 尺寸:{Width=200, Height=200}

无论如何,面板总是偏移。

我尝试移动锚点,但这无济于事。

panel.Anchor = (AnchorStyles.Left | AnchorStyles.Top);

...我也试过了

ClientToScreen(panel.Handle, ref point);

...无济于事。

问题是否与父母(表单)的相对位置有关?我需要做什么才能简单地重新定位面板以使其与我的矩形对齐?

【问题讨论】:

  • 您将 Point 设置为 Panel Client 区域。您需要面板的父级(表单)。锚点无关紧要。 -- 这些添加弥补了 PointToClient 和 PointToScreen 被这些像素所淘汰的事实:什么? -- 如果您的应用程序在具有 High-Dpi 显示器的机器上运行,则您的应用程序需要具有 DpiAware,否则无论如何都会得到错误的坐标。
  • 谢谢吉米。这有帮助。
  • 嗨@Jimi,我花了一天时间试图用另一个面板完成这项工作。我想我一定是在做一些不同的事情,所以我使用了上一个面板中的相同代码,它没有做同样的事情,而是被抵消了。为什么会这样?
  • 不同的父母?我无法验证您的设置。
  • 同一个父级。我只是想把第二个面板放在第一个面板旁边。两者都在同一个父级(表单)上。所以在我的图像中,第一个面板适合矩形。第二个面板也有一个位置。

标签: c# winforms


【解决方案1】:

我想出了一个方法来得到我想要的。 我使用父母的左上角,然后从我想要放置的孩子的左上角减去它。然后使用该位置的结果值。

panel.Location = new Point(panel.Left - parent.Left, panel.Top - parent.Top);

这样,我总是知道对象相对于其父对象的位置。

结果

编辑: 我再次尝试 Jimi 的建议,它确实有效。 (问题出在我的坐标上。)

Control control = form; // not panel
Point point control.PointToClient(new Point(200, 200)); 
panel.Location = point;

再次感谢吉米。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多