2017-01-23 80 views
0

我有一個應用程序在工作,它是用VS2008在VB.Net winforms中編寫的。它最近更新到VS2015;但是,一些幻像邊界已經開始出現在用戶界面上。大多數控件/用戶界面都是自定義控件,但希望這裏的某個人可能會對2015年爲什麼現在出現這些內容有所瞭解。(我在2008年編寫了相同的代碼,並且邊框不在那裏)。WinForms幻影邊框

下面的屏幕截圖顯示了在操作中的「幻影邊框」。

UI Phantom Borders

這可能是很難看到的,但在文字左側的淺灰色線是「幻影邊界」。雖然在這種情況下這看起來不是什麼大問題,但在整個用戶界面上的情況要嚴重得多,所有其他控件的功能都差不多。

希望有人有一些想法,因爲我是新鮮的!

我試過了 - 禁用控件中的所有邊界,然後禁用(以確保沒有緩存狀態)。檢查用戶控件上的所有屬性以確保我不會丟失屬性。

+0

我會在衆目lim lim之下宣佈你的應用程序是DPI Aware。在VS2015中開始一個新的Winform項目。轉到項目菜單 - >項目屬性 - <應用程序選項卡 - >查看窗口設置按鈕以打開app.manifest文件。將''塊中包含'dpiAware'標記的塊複製到舊應用程序中。 – TnTinMn

+0

@TnTinMn有趣的想法!我明天去看看。您是否大致瞭解這些設置的dpi識別時間?我發現最奇怪的是,如果我構建它,它將在win7和win10上呈現相同的效果,而不僅僅是10.必須承認這是一個相當令人困惑的問題。 –

+0

DPI認知度一直是回到XP的移動目標。在[編寫DPI-Aware桌面和Win32應用程序](https://msdn.microsoft.com/zh-cn/)中介紹了一個很好的摘要表。COM/EN-US /庫/ dn469266(V = vs.85)的.aspx#high_dpi_tutorial)。最有可能的罪魁禍首是在Vista中啓動的DPI虛擬化,但監視器需要幾年時間才能更換,以便問題變得明顯。 – TnTinMn

回答

0

典型。提出問題,然後出現答案。

問題是由於在基本用戶控件中覆蓋了「OnPaintBackground」方法。

看起來像Windows 10/vs2015(不知道該公式的哪個元素)改變了像素計算的方式。

其中基礎控件將獲得背後形式的背景圖像,爲用戶控件執行手動「透明度」時,大小將在寬度和/或高度上爲1像素太小。

(即創建的幻象邊界)之前的代碼:

Dim srcRec As Rectangle = Bounds 
srcRec.Offset(backgroundSource.Origin) 
e.Graphics.DrawImage(backgroundSource.BackgroundImage, 0, 0, srcRec, GraphicsUnit.Pixel) 

正如你所看到的,它抓住了控件的大小,然後獲取其背後的背景部分,並提請該圖像作爲自己的背景。

改正的代碼(即擺脫幻象邊界):

Dim srcRec As Rectangle = Bounds 
srcRec.Width +=1 
srcRec.Height +=1 
srcRec.Offset(backgroundSource.Origin) 
e.Graphics.DrawImage(backgroundSource.BackgroundImage, -1, -1, srcRec, GraphicsUnit.Pixel) 

這似乎解決問題,隱藏幻象邊界和正確渲染UI。

謝謝任何​​至少看到這個問題的人!從我無法分享的代碼庫中總結問題是很困難的。希望這可以幫助未來的其他人。