窗体在屏幕上的位置(FMX,Win32)

时间:2018-12-11 03:38:52

标签: firemonkey c++builder

我想知道我的表格在屏幕上的位置。我已经看过位置属性(例如this-> Top,this-> Left等),但它们似乎不符合要求。我希望能够确定表单距屏幕顶部/底部和屏幕左侧/右侧的距离。

我正在使用C ++ Builder和FMX构建Win32应用程序。

谢谢,鲁斯

enter image description here

更新1:事实证明,我真正需要的是找到相对于整个桌面(而不仅仅是主显示器)的坐标(X,Y)。桌面跨越多台显示器。

2 个答案:

答案 0 :(得分:1)

您的表单TopLeft属性应该为您提供相对于活动桌面左上角的位置,但是您可能还需要使用ClientToScreen / ScreenToClient。似乎很难在FMX中获得精确的偏移量。

void __fastcall TForm1::MoveToTopLeft()
{
    TPointF cli(0.0, 0.0);
    TPointF sp = ClientToScreen(cli);

    Left -= sp.x;
    Top = 0;
}

该解决方案有些不对称...

答案 1 :(得分:0)

基于Ted和David的输入,我将以下代码组合在一起。如果表单的左边缘靠近桌面的左边缘(在errX像素以内),它将弹出一条消息。如果窗体工作区的顶部边缘靠近桌面的顶部边缘(错误像素内),它将弹出一条消息。不漂亮,但能说明问题。

void __fastcall TForm1::Button4Click(TObject *Sender)
{

int dWidth = Screen->DesktopWidth;
int dLeft = Screen->DesktopLeft;
int dRight = dWidth + dRight;  // deskLeft is 0 if primary monitor is most left monitor
int dTop = Screen->DesktopTop;
int errX = 10;  // within 10 pixels is fine enough
int errY = 40; // remember 30 or so pixels for caption bar
TPointF cli(0.0, 0.0);
TPointF sp = ClientToScreen(cli); //sp holds the coordinates for top left of form client area
ShowMessage("X = " + FloatToStr(sp.x) + "\nY = " + FloatToStr(sp.y));  //show coordinates of top/left of form client area

if (dLeft < 0) {  //negative value
 if ((abs(dLeft)-abs(sp.x)) < errX) {
  ShowMessage("Within " + IntToStr(errX) + " pixels of left edge."); // or further left of edge
 }
}
else {
 if ((dLeft + sp.x)< errX) {
  ShowMessage("Within " + IntToStr(errX) + " pixels of left edge."); // or further left of edge
 }
}

if (sp.x > 0) {  // no need to test the negative case
 if ((dRight-sp.x) < errX) {
  ShowMessage("Within " + IntToStr(errX) + " pixels of right edge."); // or further right of edge
 }
}

if ((dTop + sp.y)< errY) {
 ShowMessage("Within " + IntToStr(errY) + " pixels of top edge.");
}

}

无论哪个监视器是主要监视器,此代码都有效。

更新1:当显示器未沿其上边缘对齐时,此代码会出现问题。在下面的图片中,监视器1和3的顶部对齐。 2没有。在此的示例DesktopTop返回-876。因此,David提出的“显示器”技巧似乎是可行的方法-在C ++中是“显示器”。例如TRect myR = Screen->Displays[0].BoundsRect;获取显示0的矩形,然后int theTop = myR.top;查找此特定显示的顶部。

enter image description here

谢谢,鲁斯