なぜ右アンカーコントロールを持つ私のBorland C ++ Builderの5つのフォームはVista上で正しく表示されないのですか?

StackOverflow https://stackoverflow.com/questions/525517

質問

は、ソリューションを探して小さな年齢を過ごしたし、今私は、これはスタックオーバーフローのために文書化するのが良いでしょう考え出し、それを発見しました。だから私の答えは、この質問の後に右に従います。

私は、Borland C ++ Builderの5これはおそらく、また、デルファイの同等のバージョンに適用される使用していました。私は、TPanel上のTButtonでフォームを持っていました。ボタンはakRight、akBottomに設定しました。 XPおよび以前のWindowsでは、すべてが大丈夫でした。 Vistaでは、エアロを使用して、ボタンが右にすぎ4個のピクセルが登場しました。アンカーは正常に動作し続けます。

別の例はakTop、akRight、akLeftを有しTComboBox有する形態でした。コンボは、Vista上で幅が広すぎる4つのピクセルを登場ます。

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)他のWindowsバージョンで、それを維持しながら、それはVista上で正しい動作が発生します。

これは誰かに役立ちます願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top