2009-02-08 89 views
1

花了一小段时间寻找解决方案,现在找到了它,我认为这将是很好的文件堆栈溢出。所以我的答案会在这个问题之后。为什么我的Borland C++ Builder 5窗体右键控件在Vista上显示不正确?

我使用的是Borland C++ Builder 5.这可能也适用于Delphi的等效版本。我在TPanel上有一个TButton的表单。该按钮被设置为akRight,akBottom。在XP和以前的Windows上,一切都很好。在Vista上,使用Aero时,按钮距离右边4个像素点。锚定继续正常工作。

另一个例子是一个带有akTop,akRight,akLeft的TComboBox的窗体。 Vista上的组合显示过宽4个像素。

返回Vista上的“经典”外观使所有内容都显示正确。

回答

4

我尝试过的第一件事并没有奏效:我猜想这个问题与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; 

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

在窗体的生命周期的不同时间点,添加了一个公制的调试代码,输出窗体的宽度,按钮的宽度,按钮的左边,窗体的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)上。

希望这有助于某人。

+0

我有一个模糊的内存(可能不正确),旧版本的Delphi只存储了窗体的宽度和高度。这意味着在Windows上使用不同的窗口框架设置运行时,表单可能会重新创建错误的大小 - 并且包含2000/XP的自定义版本,因为您可以在显示设置中更改该窗体。 Delphi的较新版本将ClientWidth和ClientHeight(窗口框架内的大小)流化,消除了这个问题。看起来你找到了解决方案!但最强大的解决方案是升级到更新的版本...... D5是什么,十到十二岁? – 2013-04-03 13:54:53

相关问题