首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何获取某个组件的屏幕位置

如何获取某个组件的屏幕位置
EN

Stack Overflow用户
提问于 2013-06-03 22:29:01
回答 1查看 1.8K关注 0票数 1

问题

我设计了一个对话框窗体,当用户在TStringGrid组件上选择某些单元格(单选,而不是多选)时,就会调用它。

此对话框窗体将位于其中一个选定单元格的中心。

但这并没有发生:(

可能的解决方案=我想要的

我想要得到单元格的屏幕位置,即绝对屏幕坐标,而不是通过CellRect()获得的。

我在做什么

为了计算单元格的中心,我目前必须通过这种方式对以下组件的坐标求和:

代码语言:javascript
运行
AI代码解释
复制
TRect pos;

pos = table->CellRect(Col,Row);

pos.Left += form->Left + panel->Left + frame->Left + table->Left;
pos.Right += pos->Left;

pos.Top += form->Top + panel->Top + frame->Top + table->Top;
pos.Bottom += pos->Top;

然后将对话框居中:

代码语言:javascript
运行
AI代码解释
复制
dialog->Left = (pos->Left + pos->Right)/2 - dialog->Width/2;
dialog->Top = (pos->Top + pos->Bottom)/2 - dialog->Height/2;

由于一些未知的原因,Col和Row在对话框的正确位置添加了一个偏移量,因此大的Col和Row值将对话框位置设置为正确位置的很大距离(选定单元格的中心)。

代码语言:javascript
运行
AI代码解释
复制
 ___screen________________________________________
|                                                 |
|   ___form___________________________________    |
|  |                                          |   |
|  |                                          |   |
|  |   ___panel____________________________   |   |
|  |  |                                    |  |   |
|  |  |   ___frame_______________          |  |   |
|  |  |  |                       |         |  |   |
|  |  |  |                       |         |  |   |
|  |  |  |  ___table_________    |         |  |   |
|  |  |  | |                 |   |         |  |   |
|  |  |  | |       _cell_    |   |         |  |   |
|  |  |  | |      |______|   |   |         |  |   |
|  |  |  | |                 |   |         |  |   |
|  |  |  | |_________________|   |         |  |   |
|  |  |  |_______________________|         |  |   |
|  |  |____________________________________|  |   |
|  |                                          |   |
|  |                                          |   |
|  |__________________________________________|   |
|_________________________________________________|

如果我有表格或选定单元格的屏幕位置

它将变得非常容易实现和检测这些偏移误差,因为上面的和上将有更少的分量坐标。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-05 02:06:56

调用CellRect()获取客户端坐标,然后将它们转换为屏幕坐标。有几种方法可以做到这一点:

  1. 使用TControl::ClientToScreen()方法:

TRect pos =table->CellRect(列,行);TPoint &tl = pos.TopLeft();tl = table->ClientToScreen(tl);TPoint &br = pos.BottomRight();br =使用TControl::ClientOrigin属性table->ClientToScreen(br);

  • offset ,该属性指定StringGrid工作区左上角的StringGrid屏幕坐标:

OffsetRect pt = TPoint ->ClientOrigin;TRect pos =table->CellRect(列,行);::OffsetRect(&pos,pt.x,pt.y);

  • 使用Win32接口MapWindowPoints()函数(请记住TStringGrid是一个图形控件,所以它没有自己的窗口,必须使用它的父窗口),例如:

TRect pos =表->单元格(列,行);::OffsetRect(&pos,表->左,表->顶部);::MapWindowPoints(表->父->句柄,NULL,()&pos,2);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16906882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档