2013-04-12 6 views
6

昨日はVS 2010からVS 2012に切り替えて、これ以外はすべてがうまくいくように見えました。VS 2012に切り替わりましたが、フォームのサイズが正しく変更されませんか?

フォーム上にボタンを置くと、フォームの幅が拡大され、追加のコントロールが表示されます。ボタンをもう一度押すと、幅を狭めてコントロールを非表示にします。これはVS 2010でうまくいきましたが、VS 2012でデバッグするときにはうまくいきますが、プロジェクトを公開またはコンパイルしてボタンをクリックすると.exeを開くとすぐに、 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 = ">>"; 

    } 
+0

Shift + F5を押すとどうなりますか? –

+0

@ofstreamお返事ありがとうございます。私が従うかどうかわからない?デバッグ中にすべてうまく動作し、必要な動作をします。私がプログラムを公開し、コンパイルされたファイルを開くとき、それは何をすべきかをしていないときです。デバッグ中にshift + f5を押してデバッガを停止しました – Nabbic

+0

公開されたものの設定ファイルをチェックして、公開されていることを確認してください。 – AaronLS

答えて

12

フォームの幅は、長時間188ピクセルではありませんでした。今VS2012で、Windowsはついにそれについて横たわっていません。

エアロの太いウィンドウの境界線が問題になっています。この機能がVistaに導入されたとき、彼らは極端なアプリケーションの問題でした。これらの2つのピクセルがマウスで激しくぶつかってしまうので非常に必要です。しかし、アプリケーションがウィンドウを作成する方法とは大きく矛盾します。 CreateWindow()関数の特定のウィンドウサイズ、外部サイズ、nWidthおよびnHeight引数を要求します。しかし、本当に重要なのは、クライアント領域のサイズです。境界内のウィンドウの一部です。マイクロソフトが何もしていないと、古いアプリケーションはクライアント領域が小さすぎてしまいます。それは非常に悪く見える、ウィンドウの内容はもう収まりません。フォームの下部または右側に向かう制御は、例えば完全には表示されない。

だから、気の利いたことに、エアロは脂肪の余分な幅でウィンドウを大きくします。そして、アプリケーションがウィンドウのサイズを要求するとき、それはそれが同じ追加された幅で小さいことを卑劣に言う。アプリは、それがXP上で持っていたのと同じウィンドウサイズでまだ動いているよりも良く分からない。これはかなりうまくいくが、理想的ではない。たとえば、ウィンドウの端が適切にそろえられるようにするのは困難です。

Aeroがウィンドウサイズに関係するかどうかは、EXEヘッダーに記録されているターゲットオペレーティングシステムに基づいています。 Vistaのバージョン番号である6.00より前のバージョンを確認すると、EXEがfat border機能について知らないレガシープログラムであるとみなされます。だから、嘘をつく必要がある。あなたは長い間、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プロパティを使用してください。安定したClientSizeプロパティと、本当に気になるものです。しかし、そのプロパティにも注意してください。ビデオアダプタが1インチあたり96ドット以上に設定されているマシンでは、フォームが再スケーリングされる可能性があります。 Vistaとそれ以降では非常にアクセス可能な別の機能です。サイズを変更すると、DPIの設定に応じてClientSizeが比例して変更されます。

真の修正点は、代わりにブールフィールドを使用してウィンドウの状態を追跡することです。また、非表示にするコントロールの位置に基づいてClientSizeプロパティを設定します。だからおおよそ:

このコードのsomeControlは、コントロールの名前に置き換えてください。

関連する問題