好吧,我设计了一个对话框表单,当用户在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_ | | | | |
| | | | | |______| | | | | |
| | | | | | | | | |
| | | | |_________________| | | | |
| | | |_______________________| | | |
| | |____________________________________| | |
| | | |
| | | |
| |__________________________________________| |
|_________________________________________________|
它将变得如此容易实现并检测那些偏移误差,因为上面总和的组件坐标会更少......
答案 0 :(得分:1)
致电CellRect()
以获取客户端坐标,然后将其转换为屏幕坐标。有几种方法可以做到这一点:
使用TControl::ClientToScreen()
方法:
TRect pos = table->CellRect(Col, Row);
TPoint &tl = pos.TopLeft();
tl = table->ClientToScreen(tl);
TPoint &br = pos.BottomRight();
br = table->ClientToScreen(br);
使用TRect
属性偏移TControl::ClientOrigin
,该属性指定StringGrid客户区左上角的屏幕坐标:
TPoint pt = table->ClientOrigin;
TRect pos = table->CellRect(Col, Row);
::OffsetRect(&pos, pt.x, pt.y);
使用Win32 API MapWindowPoints()
函数(请记住TStringGrid
是一个图形控件,所以它没有自己的窗口,你必须使用它的父窗口),例如:
TRect pos = table->CellRect(Col, Row);
::OffsetRect(&pos, table->Left, table->Top);
::MapWindowPoints(table->Parent->Handle, NULL, (LPPOINT)&pos, 2);