2010-04-09 67 views
1

我有一個傳統的WinForms應用程序,我希望跨會話保存窗口的位置和大小。在FormClosing和Load事件中,我一直使用GetWindowPlacementSetWindowPlacement。我得到的問題是,在更高的DPI設置(如中等,125%的尺寸)時,尺寸不斷膨脹。我將以一定的大小調用SetWindowPlacement,但是當調用GetWindowPlacement時,即使窗口大小一直相同,這些數字也會增加25%。在表單中保存可調整大小的元素的大小時存在同樣的問題。GetWindowPlacement/SetWindowPlacement無法在WinForms中工作以獲得較高的DPI

現在這工作正常,如果我創建一個新的WinForms項目:即使在更高的DPI運行,大小保持穩定。我猜測這個項目還有一些遺留設置,或者一些神祕的表單設置讓它變得糟糕,但我無法找到位置。

我在兩個項目上都撥打了IsProcessDPIAware,兩者都是true。有誰知道可能是什麼原因造成的?

回答

1

我發現這個問題的窗體的.resx文件設置:

<data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing"> 
    <value>5, 13</value> 
</data> 

當這是目前,VS會自動改變AutoScaleBaseSize爲 DPI工作,但沒有其他人的。對於其他人來說,表格會不斷增長或縮小。

在設計器屬性面板中選擇AutoScaleMode = Font會導致VS啓動並「更新」字體縮放設置。現在它適用於所有DPI。

1

聽起來就像你以某種方式觸發縮放,如表單的AutoScaleMode屬性所選。兩個項目之間的區別是AutoScaleDimensions屬性,可在Designer.cs文件中看到。

不確定爲什麼這會導致問題,但Form類已經在內部使用GetWindowPlacement(),RecreateHandleCore()和UpdateWindowState()方法。爲了獲得真正的幫助,我假設你需要在某處發佈一個repro項目。

+0

+1提示AutoScaleMode。 – RandomEngy 2010-04-09 17:21:15