2012-08-23 82 views
1

在從Button派生的自定義控件中,ButtonRenderer.DrawButton()繪製處於各種狀態的按鈕。ButtonRenderer使用不同於16位中的按鈕的背景顏色

當Windows中的顯示設置設置爲32位的顏色深度時,一切都很好,但一旦它設置爲16位,顏色與常規的WinForms按鈕之一不匹配,在我的用戶界面中,這並不是我想要的。

我已經使用這樣的最小示例代碼複製了這個。

protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     Rectangle rect = new Rectangle(10, 10, 250, 120); 
     ButtonRenderer.DrawButton(e.Graphics, rect, PushButtonState.Normal); 

     rect = new Rectangle(300, 300, 250, 120); 
     ControlPaint.DrawButton(e.Graphics, rect, ButtonState.Normal); 
    } 

這給這個...

Rendered Buttons

我敢肯定,你都會注意兩個「按鈕」由DrawButton方法繪製的具有比標準按鈕顏色要略淺,和窗體背景(我沒有改變,並保持默認爲「控制」)... 如果你足夠的縮放,你可以看到它是正確的背景顏色和另一個更亮的顏色交替像素.. 。

我發現了這個問題,因爲我們的用戶正在使用遠程桌面(RDP)連接到我們的應用程序。強制遠程桌面設置爲32位解決了這個問題,但我認爲它會對性能產生影響,並且我們的一些用戶正在海外工作,而且在相對較慢的寬帶鏈路上工作......因此,強制執行32位是我寧願避免的選項。 它也發生在PC前面,通過將顯示設置設置爲16位顏色。

你有什麼想法嗎?是ButtonRenderer和ControlPaint類的某種錯誤,還是有辦法解決這個問題? (我使用.Net 4.0)。

+0

只是爲了簡化 - ButtonRenderer.DrawButton在內部調用ControlPaint.DrawButton使它們等價調用。 –

+0

@JohnArlen - 如果用戶啓用了Windows主題(如XP的Luna等),ButtonRenderer調用在ControlPaint調用繪製時繪製考慮Windows主題,而不考慮主題(即看起來像經典)。 –

回答

1

ControlPaint.DrawButton是Win32的DrawFrameControl的一個包裝。

它呈現爲一個位圖,然後將位圖繪製到您的圖形顯示上下文中。顏色抖動/逼近發生在該位圖層。我跑出來的時候,進一步的實驗,不過......

如果你只是打電話DrawFrameControl自己,所有的作品:

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] 
public static extern bool DrawFrameControl(IntPtr hDC, ref RECT rect, int type, int state); 

[StructLayout(LayoutKind.Sequential)] 
public struct RECT 
{ 
    public int left; 
    public int top; 
    public int right; 
    public int bottom; 

    public RECT(Rectangle r) 
    { 
     this.left = r.Left; 
     this.top = r.Top; 
     this.right = r.Right; 
     this.bottom = r.Bottom; 
    } 
} 

protected override void OnPaint(PaintEventArgs e) 
{ 
    if (Application.RenderWithVisualStyles) 
     ButtonRenderer.DrawButton(.....) 
    else 
    { 
     var rect = new RECT(new Rectangle(10, 110, 100, 100)); 
     DrawFrameControl(e.Graphics.GetHdc(), ref rect, 4, 0x10 | (int)ButtonState.Normal); 
    } 

    base.OnPaint(e); 
} 

編輯:添加可選的調用主題

+0

謝謝。這確實有效,雖然它不支持ButtonRenderer這樣的主題。事實上,顏色抖動,即使它可以正確顯示在第一位看起來像在我的框架中的錯誤? –

+1

添加一個支票的主題,並做到這一點或其他方式......編輯上面的樣式與上面的一樣。 –

+0

謝謝,這是一個很好的解決方法,雖然即使按鈕是主題,ButtonRenderer.DrawButton按鈕也會抖動,看起來不像正常的主題控件...您是否也認爲它是有問題的.Net庫中的一個錯誤如果是這樣,我可以嘗試報告它? –

相關問題