2011-08-08 48 views
3

我正在嘗試製作組框控件的文本顏色和背景。我正在使用對話框和Win32。爲了說明我的問題,我創建了一個具有重現問題所需的最低代碼的項目。如何在Win32中對組框控件進行着色?

如果我們進行對話並將某種位圖作爲背景,我們可以很容易地看到組框控件的真實顏色。默認情況下,沒有任何壓倒一切的它看起來就像這樣:

http://localhostr.com/file/ItBy6DF/no%20override.png

我將嘗試設置文本顏色爲白色,文本背景透明,下面的代碼:

case WM_CTLCOLORSTATIC: { 
    HDC hDC = (HDC)wParam; 
    SetTextColor(hDC, RGB(255, 255, 255)); 
    SetBkMode(hDC, TRANSPARENT); 
    return (INT_PTR)GetStockObject(HOLLOW_BRUSH); 
} 

我測試使用和不使用視覺樣式的外觀通過改變清單來啓用:

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
    processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

使用視覺樣式,對話框如下所示:

http://localhostr.com/file/hyJOhsj/theming.png

背景改變爲不可接受的純色依賴對話框的背景是什麼。此外,文字顏色未能更改。隨着視覺造型禁用,對話框如下這樣:

http://localhostr.com/file/8nVzn7t/no%20theming.png

的文本顏色已經改變和透明度的工作,但該組框的矩形顯示即使在文本。

我已經上傳了項目here給任何有興趣測試的人。

我讀過這個網站上的其他類似問題,似乎表明也許這是不可能的,沒有子類或ownerdrawing。我不介意子類化,但我正在檢查沒有更好的方法來做到這一點。如果唯一的辦法是繼承,我會很樂意知道應該重寫的內容(可能是WM_PAINT)。我在網上找到了創建自己的組框控件的示例,但有些似乎受到z順序問題的困擾。因此,使用子類化,是否適合處理WM_NCHITTEST?同樣,如果我使用SetWindowLong()切換所有者繪製樣式,然後控制子類以獲取WM_DRAWITEM消息,是否還有什麼我應該注意的?我應該如何處理視覺風格等?

+0

我相信你需要自己繪製主題API –

+0

@David Heffernan:鑑於我希望它能夠支持經典主題和視覺樣式,只需使用GDI函數(如ArcTo等)就可以接受。?是否有可能擁有組合框控件,或者我應該在對話框的WM_PAINT中執行它? –

+0

我懷疑你需要單獨的代碼爲經典和主題 –

回答

1

您是否嘗試爲WM_CTLCOLORSTATIC返回hBrBackground而不是GetStockObject(HOLLOW_BRUSH)?

0

這是一個古老的問題,但有人可能會尋找答案。要使組框文本的背景與窗口背景相同,請在SetBkMode函數中將TRANSPARENT更改爲OPAQUE

相關問題