2011-05-19 59 views
1

我試圖在開始菜單欄上方的主屏幕右下角放置一個固定的工具窗口。 我使用下面的代碼C#WinForms - Real(包括非客戶端)FixedToolWindow高度和寬度

this.Top = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height; 
this.Left = Screen.PrimaryScreen.WorkingArea.Right - this.Width; 

形式對齊屏幕邊緣到客戶端矩形,所以我看到非客戶底部邊緣滲到開始菜單欄和右非客戶端邊緣滲入第二臺顯示器

我需要得到完整形式的寬度和高度,包括所有的非客戶邊界

我注意到它工作時的形式是SizableToolWindow但與FixedToolWindow

謝謝大家!

+0

您的代碼似乎是完美的在這裏工作。你從哪裏來的? – 2011-05-19 19:25:32

+0

我使用的是Windows 7的W /航空,我叫上顯示的代碼,並調整其大小。 – Joe 2011-05-19 20:42:33

+0

我剛剛意識到,它只發生在FormBorderStyle是FixedToolWindow時,它工作正常,當它是SizableToolWindow – Joe 2011-05-19 20:43:31

回答

1

漢斯得到這個答案正確的,但張貼作爲,而不是一個答案評論。

答案就在這裏: https://social.msdn.microsoft.com/Forums/windows/en-US/af2608c1-1159-444f-bb21-b2cf0228f1c1/strange-issues-with-formborderstyle-on-vista-between-fixed-and-sizable-modes?forum=winforms - 漢斯帕桑特5月19日21:07

從網站複製:與FormBorderStyle在Vista上固定和相當大的模式之間

奇怪的問題

問題:

問題在於所有類型的固定邊界樣式,如FixedDialog,Fixed3D,FixedSingle和FixedToolWindow。它不會發生在相當大的人身上。就像我說的,這個問題也只發生在Vista上。 假設您有一個具有任何固定邊框樣式的表單,並將起始位置設置爲0,0。這裏你想要的是將表單捕捉到屏幕的左上角。如果表單邊框樣式是可選擇的選項之一,如果它是固定的,那麼這種方式就可以很好地工作,而且,表單將在屏幕工作區域的左側和頂部之外稍微偏離一點。 更奇怪的是,表單的位置並沒有改變,它是0,0,但表單的幾個像素被繪製在工作屏幕區域之外。 我在XP上測試過它並沒有發生,問題在於Vista特定。在XP上,唯一的區別是邊框的大小在任何樣式之間都有所改變。但是表單總是完全捕捉到位置0,0。 如果可能,沒有找到在工作區域外繪製多少像素,然後將其添加到表單位置,是否有解決此問題的方法或解決方法?

答:

的問題是具體到航空,當你把它關掉它不會發生。它是那些着名的應用程序兼容修復程序之一。當你P /調用GetWindowRect()時,Windows實際上對你是謊言。它提供了窗口的位置和大小,從客戶區域相對的,如果它是在Windows的早期版本上運行,像XP的窗口會有。

這可以確保舊的程序仍然在某種程度上表現可以預見,他們將有自己的所有重要客戶區在相同的位置,即使他們有很多胖邊界。但有時會像你的情況那樣阻礙你。

爲了解決這個問題,你要說服Vista中,你是真正意識到Vista中是如何工作的。這需要修補.exe標頭。啓動Visual Studio命令提示符,導航到你的build目錄,然後輸入以下命令:

EDITBIN /subsystem:windows,6.0 yourprogram.exe

+0

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/af2608c1-1159-444f-bb21-b2cf0228f1c1/是完整的鏈接,將工作。 – Josh 2012-03-18 08:13:06

2

Bounds屬性會給你一個Rectangle從中你可以得到完整的大小。

該控件的邊界包括非客戶端元素,如滾動條,邊框,標題欄和菜單。

Documentation

+0

不起作用,邊界與高度相同並且寬度 – Joe 2011-05-19 20:37:33

0

是的,從漢斯評論正確地告訴我們,爲什麼窗體的.Height.Width是不正確的。我認爲以下內容應該能夠爲您提供真實的高度和寬度,無論Aero是否啓用。

(in the code for a Form) 

[DllImport("dwmapi.dll", PreserveSig = false)] 
public static extern bool DwmIsCompositionEnabled(); 

// When Aero is enabled, and our FormBorderStyle is FixedToolWindow, 
// Windows will lie to us about our size and position. 
public bool AeroIsMessingWithUs() 
{ 
    bool ret = false; 

    // check for other Fixed styles here if needed 
    if (FormBorderStyle == System.Windows.Forms.FormBorderStyle.FixedToolWindow) 
    { 
     if (Environment.OSVersion.Version.Major >= 6 && DwmIsCompositionEnabled()) 
     { 
      // Aero is enabled 
      ret = true; 
     } 
    } 
    return ret; 
} 

public int MyWindowHeight() 
{ 
    int height = Height; 
    if (AeroIsMessingWithUs()) 
    { 
     // there are actually 5 more pixels on the top and bottom 
     height += 10; 
    } 
    return height; 
} 

public int MyWindowWidth() 
{ 
    int width = Width; 
    if (AeroIsMessingWithUs()) 
    { 
     // there are 5 more pixels on the left and right 
     width += 10; 
    } 
    return width; 
}