问题
我设计了一个对话框窗体,当用户在TStringGrid组件上选择某些单元格(单选,而不是多选)时,就会调用它。
此对话框窗体将位于其中一个选定单元格的中心。
但这并没有发生:(
可能的解决方案=我想要的
我想要得到单元格的屏幕位置,即绝对屏幕坐标,而不是通过CellRect()
获得的。
我在做什么
为了计算单元格的中心,我目前必须通过这种方式对以下组件的坐标求和:
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;
然后将对话框居中:
dialog->Left = (pos->Left + pos->Right)/2 - dialog->Width/2;
dialog->Top = (pos->Top + pos->Bottom)/2 - dialog->Height/2;
由于一些未知的原因,Col和Row在对话框的正确位置添加了一个偏移量,因此大的Col和Row值将对话框位置设置为正确位置的很大距离(选定单元格的中心)。
___screen________________________________________
| |
| ___form___________________________________ |
| | | |
| | | |
| | ___panel____________________________ | |
| | | | | |
| | | ___frame_______________ | | |
| | | | | | | |
| | | | | | | |
| | | | ___table_________ | | | |
| | | | | | | | | |
| | | | | _cell_ | | | | |
| | | | | |______| | | | | |
| | | | | | | | | |
| | | | |_________________| | | | |
| | | |_______________________| | | |
| | |____________________________________| | |
| | | |
| | | |
| |__________________________________________| |
|_________________________________________________|
如果我有表格或选定单元格的屏幕位置
它将变得非常容易实现和检测这些偏移误差,因为上面的和上将有更少的分量坐标。
发布于 2013-06-05 02:06:56
调用CellRect()
获取客户端坐标,然后将它们转换为屏幕坐标。有几种方法可以做到这一点:
TControl::ClientToScreen()
方法:TRect pos =table->CellRect(列,行);TPoint &tl = pos.TopLeft();tl = table->ClientToScreen(tl);TPoint &br = pos.BottomRight();br =使用TControl::ClientOrigin
属性table->ClientToScreen(br);
OffsetRect pt = TPoint ->ClientOrigin;TRect pos =table->CellRect(列,行);::OffsetRect(&pos,pt.x,pt.y);
MapWindowPoints()
函数(请记住TStringGrid
是一个图形控件,所以它没有自己的窗口,必须使用它的父窗口),例如:TRect pos =表->单元格(列,行);::OffsetRect(&pos,表->左,表->顶部);::MapWindowPoints(表->父->句柄,NULL,()&pos,2);
https://stackoverflow.com/questions/16906882
复制相似问题