我想知道我的表格在屏幕上的位置。我已经看过位置属性(例如this-> Top,this-> Left等),但它们似乎不符合要求。我希望能够确定表单距屏幕顶部/底部和屏幕左侧/右侧的距离。
我正在使用C ++ Builder和FMX构建Win32应用程序。
谢谢,鲁斯
更新1:事实证明,我真正需要的是找到相对于整个桌面(而不仅仅是主显示器)的坐标(X,Y)。桌面跨越多台显示器。
答案 0 :(得分:1)
您的表单Top
和Left
属性应该为您提供相对于活动桌面左上角的位置,但是您可能还需要使用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;
查找此特定显示的顶部。
谢谢,鲁斯