2013-04-12 54 views
6

我昨天從VS 2010切換到VS 2012,除此之外,所有人似乎都很順利。切換到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 = ">>"; 

    } 
+0

如果按Shift + F5會發生什麼情況? –

+0

@ofstream嗨,感謝您的回覆。不確定我關注?在調試時一切正常,並按照它應該的方式行事。當我發佈程序並打開編譯的文件時,它不應該做它應該做的。我在調試時打了shift + f5,它只是停止了調試器 – Nabbic

+0

只是瘋狂的猜測,但檢查發佈的配置文件,確保它已發佈。 – AaronLS

回答

12

表單的寬度在很長一段時間內還沒有達到188像素。現在用VS2012,Windows終於停止說謊了。

問題是Aero中的胖窗口邊框。在Vista中引入該功能時,他們是一個極端的appcompat問題。非常必要,因爲那兩個像素很難用鼠標擊中。但與應用程序創建窗口的方式大相徑庭。它要求CreateWindow()函數的特定窗口大小,外部大小,nWidth和nHeight參數。但真正重要的是客戶區域的大小,即邊界內窗口的部分。如果微軟沒有做到這一點,那麼舊的應用程序將會以一個太小的客戶區域結束。這看起來很糟糕,窗口內容不再適合了。例如,不會完全顯示錶單底部或右側的控件。

因此,偷偷摸摸地,Aero通過胖邊框的額外寬度使窗口變大。而當應用程序要求窗口大小時,它簡單地說它是由相同的添加寬度縮小的。該應用程序不知道比它仍然運行在XP上的窗口大小還要好。這工作相當好,但並不完全理想。很難讓窗口邊緣與該謊言正確對齊。

Aero是否會隱藏窗口大小是基於EXE頭中記錄的目標操作系統。當它看到一個早於6.00的版本,即Vista版本號時,那麼它會認爲你的EXE是一個不知道fat border功能的傳統程序。所以需要撒謊。您已經將目標版本號設置爲4.00很長一段時間,它在編譯您的程序時由.NET編譯器編寫。你可以用dumpbin.exe /headers yourapp.exe看到它。

這最終在VS2012和.NET 4.5中發生了變化。這是一個在XP中不可用的.NET版本。編譯器最終可以很難假設XP是歷史記錄,並且您將在支持Aero的Windows版本上運行。因此,它將EXE頭中的目標Windows版本設置爲6.00。相應地,航空現在將停止躺在窗戶的大小。你會得到真實的,而不是假的。

因此,一個快速解決方案是將目標.NET框架版本更改爲4.0。這在XP上可用,所以你會再次撒謊。

當然最好修復你的代碼。切勿使用大小,寬度或高度屬性,它們將不可避免地取決於邊框和標題大小。改用ClientSize屬性,這是穩定的和你真正關心的。但是,對於該屬性也要小心,當其視頻適配器設置爲每英寸96點以上的機器上運行時,表單可能會重新調整大小。另一個功能在Vista中可以使用。縮放按比例按DPI設置更改ClientSize。

真正的解決方法是使用布爾字段來代替窗口狀態。並根據您要隱藏或顯示的控件的位置設置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替換爲您的控件的名稱。