在花小的年纪寻找解决方案,现在已经发现了它,我想这将是很好的记录堆栈溢出。所以,我的回答将遵循这一问题之后。

我使用Borland C ++生成器5。这可能也适用于的Delphi相当于版本。我有一个表格上TPanel一个TButton。该按钮被设置为akRight,akBottom。在XP和之前的Windows,一切都很好。在Vista系统中使用的Aero,按钮出现4个像素太远的权利。锚定继续正常工作。

另一个例子是与TComboBox其具有akTop,akRight,akLeft的形式。组合出现4个像素过宽在Vista。

返回在Vista上的“经典”的外观使一切看起来正常。

有帮助吗?

解决方案

我试过了没有工作的第一件事就是:我猜到了,这个问题曾与在Vista上较宽的窗口边框做。我想通VCL UpdateAnchorRules不知何故被不正确地计算由于设计宽度,在Vista窗口的实际宽度之间的差异。综观VCL源,很明显,改变所述锚将导致UpdateAnchorRules再次调用和(希望)正确地计算,因为它现在必须形式的可用的实际宽度。

我添加

TAnchors t = BlahBtn->Anchors;
t >> akRight;
BlahBtn->Anchors = t;
t << akRight;
BlahBtn->Anchors = t;

我的窗体构造函数。

没有喜悦。的行为是完全不受影响。

我想这可能是在这个过程中太早,所以移动相同代码到FormShow方法,同样没有成功。作为最后的尝试,我改变形式不再有akRight为按钮的设计和改变的代码

TAnchors t = BlahBtn->Anchors;
t << akRight;
BlahBtn->Anchors = t;

...这太失败 - 行为完全不受影响,除此之外,我打破了按钮对XP的情况下定位的形式保存的大小(这是我的注册表中读出,并适用于形式FormShow)不是默认值。

已经加入的调试代码输出形式的宽度,所述按钮的宽度,左按钮的公吨,表单的寿命期间的形式,等等。在各点的ClientRect,我发现这个问题。出于某种原因(可能仍然窗口边界相关的 - 我没能搞清楚的原因是),VCL与宽度打开窗户4个像素低于它应有的水平。宽度得到了校正,此后不久,而是由该点,锚定(和UpdateAnchorRules)已经固定在按钮4的像素的定位太远到右侧。

定盘:

void __fastcall TFooBarDlg::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);
    int i = GetSystemMetrics(SM_CXSIZEFRAME);
    Params.Width=Params.Width+(2*(i-4));
}

此校正的形式的初始宽度,利用边界的不同尺寸由Vista的报道。它会导致在Vista上正确的行为,同时保留它在其他Windows版本(和Vista与“经典”的样子)。

希望这有助于某人。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top