私が試した最初のことはうまくいきませんでした。問題は、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 で報告された境界線の異なるサイズを使用して、フォームの初期幅が修正されます。他の Windows バージョン (および「クラシック」な外観の Vista) で保持しながら、Vista で正しい動作を引き起こします。
これが誰かに役立つことを願っています。