我在 dll 中有一个实用程序函数,可将我的表单置于主机应用程序屏幕的中心。我正在使用 RAD Studio XE2。我必须手动完成,因为主机应用程序是非 VCL 并且 TForm 的表单放置参数无法正常工作。下面的代码有效。这两个函数都声明为静态的,并且我之前已将 Application 句柄属性设置为主机应用程序。
void MyClass::GetAppCenter(POINT * pos) {
RECT Rect;
GetWindowRect(Application->Handle, &Rect);
pos->x = (Rect.left + Rect.right) / 2;
pos->y = (Rect.top + Rect.bottom) / 2;
}
void MyClass::PlaceForm(TForm * f) {
POINT pos;
GetAppCenter(&pos);
for (int i = 0; i < Screen->MonitorCount; i++) {
TRect r = Screen->Monitors[i]->WorkareaRect;
if (r.Contains(pos)) {
f->Left = (r.Left + r.Right) / 2 - f->Width / 2;
f->Top = (r.Top + r.Bottom) / 2 - f->Height / 2;
return;
}
}
}
我最初的 GetAppCenter 代码改用了 Rect * 并返回了正确的值,但是当我设置 f->Left 时抛出了访问冲突异常。谁能解释为什么?
// original version
void OasisUtils::GetOasisCenter(POINT * pos) {
RECT *Rect;
GetWindowRect(Application->Handle, Rect);
pos->x = (Rect->left + Rect->right) / 2;
pos->y = (Rect->top + Rect->bottom) / 2;
delete Rect; // tried with and without this
}