2009-02-08 47 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

相關問題