6

昨日、VS 2010 から VS 2012 に切り替えましたが、これ以外はすべてうまくいったようです。

フォームにボタンがあり、押すとフォームの幅が広がり、追加のコントロールが表示されます。ボタンをもう一度押すと、幅が狭まり、これらのコントロールが非表示になります。これはすべてVS 2010でうまく機能し、VS 2012でデバッグするときにもうまく機能しますが、プロジェクトを公開またはコンパイルして.exeを開くとすぐに、ボタンをクリックすると幅が5のように追加されます100以上必要です。もう一度クリックすると、必要に応じて 372 に変更され、すべてのコントロールが表示されます。もう一度クリックしてコントロールを非表示にすると、コントロールが部分的に非表示になります (188 + 謎の 5 に移動します) これがすべて理にかなっており、必要なプロセスを実行するより良い方法があることを願っています。

これが私が現在取り組んでいるコードで、2010 年から 2012 年に切り替えても何も変更していません。実際、2010 年にこの同じソリューションを開いて公開すると、すべて正常に動作します。

    private void button1_Click(object sender, EventArgs e)
    {
        if (this.Width == 188)
        {
            this.Width = 372;
            this.Height = 540;
            progressBar.Value = 100;
            copied_status.Text = ("Output View Enabled");
        }
        else
        {
            progressBar.Value = 100;
            copied_status.Text = ("Output View Disabled");
            this.Width = 188;
            this.Height = 540;
        }

        if (this.Width == 372)
        {
            button1.Text = "<<";
        }
        else
            button1.Text = ">>";

    }
4

1 に答える 1

12

フォームの幅が長い間 188 ピクセルになっていません。VS2012 では、Windows はついにそれについて嘘をつくのをやめました。

問題となっているのは、Aero の太いウィンドウ枠です。この機能が Vista で導入されたとき、これらは appcompat の極端な問題でした。これらの 2 つのピクセルはマウスでヒットするのが難しくなるため、非常に必要です。ただし、アプリケーションがウィンドウを作成する方法とは大幅に互換性がありません。CreateWindow() 関数の特定のウィンドウ サイズ、外側のサイズ、nWidth および nHeight 引数を要求します。しかし、本当に重要なのはクライアント領域のサイズ、つまりウィンドウの枠内の部分です。マイクロソフトが何もしなかったとしたら、古いアプリケーションのクライアント領域は小さすぎたでしょう。これは非常に見栄えが悪く、ウィンドウのコンテンツが収まりません。たとえば、フォームの下部または右側にあるコントロールは完全には表示されません。

そのため、こっそりと、Aero は太い境界線の余分な幅だけウィンドウを大きくします。また、アプリがウィンドウ サイズを尋ねると、こっそりと、追加された同じ幅だけ小さいと表示されます。アプリは、XP で使用していたのと同じウィンドウ サイズでまだ実行されていることを認識していません。これはかなりうまく機能しますが、正確には理想的ではありません。たとえば、ウィンドウの端をその嘘に正しく合わせるのが難しい。

Aero がウィンドウ サイズについて嘘をつくかどうかは、EXE ヘッダーに記録されているターゲット オペレーティング システムに基づいています。Vista のバージョン番号である 6.00 よりも古いバージョンが表示されると、EXE は太枠の機能を認識していないレガシー プログラムであると見なされます。だから嘘をつく必要があります。長い間、ターゲット バージョン番号を 4.00 に設定して実行してきました。これは、プログラムをビルドするときに .NET コンパイラによって書き込まれます。で見ることができますdumpbin.exe /headers yourapp.exe

これは、VS2012 と .NET 4.5 で最終的に変更されました。XP では使用できない .NET バージョンです。コンパイラは最終的に、XP は過去のものであり、Aero をサポートするバージョンの Windows で実行するという難しい仮定を立てることができます。そのため、EXE ヘッダーのターゲット Windows バージョンを 6.00 に設定します。これに対応して、Aero はウィンドウ サイズについてうそをつくことをやめます。偽物ではなく、本物を手に入れましょう。

したがって、迅速な修正は、ターゲットの .NET フレームワークのバージョンを 4.0 に変更することです。それはXPで利用できるので、また嘘をつくでしょう.

もちろん、コードを修正することをお勧めします。Size、Width、または Height プロパティは使用しないでください。必然的に境界線とキャプションのサイズに依存します。代わりに ClientSize プロパティを使用してください。これは安定したものであり、本当に気にかけているものです。ただし、そのプロパティにも注意してください。ビデオ アダプタが 96 ドット/インチ以上に設定されているマシンでフォームを実行すると、フォームのサイズが変更される場合があります。Vista以降で非常にアクセスしやすいもう1つの機能。再スケーリングは、ClientSize を DPI 設定に比例して変更します。

本当の解決策は、ウィンドウの状態を追跡する代わりに bool フィールドを使用することです。非表示または表示するコントロールの位置に基づいて ClientSize プロパティを設定します。大まかに:

private bool enlarged;

private void button1_Click(object sender, EventArgs e)
{
    enlarged = !enlarged;
    int width = someControl.Left - 5;
    if (enlarged) width = someControl.Right + 5;
    this.ClientSize = new Size(width, this.ClientSize.Height);
}

このコードの someControl をコントロールの名前に置き換えます。

于 2013-04-13T01:08:26.703 に答える