2017-05-03 66 views
2

我試圖正確處理背景顏色在一個動態生成的屬性表在動態生成的屬性頁在win32 api中使用MFC(雖然我希望我的問題是一般的,並不限於MFC,但由於我的代碼和例子使用它,反正它與我的問題密切相關)。如何在屬性頁面中獲得正確的背景和控制顏色?

因此,我們有:

CPropertySheet

包含多個

CPropertyPage

我產生任何頁面的動態內容 - 使用自定義對話框定義語言的文件資源 - 所有無關緊要 - 在給定頁面內創建控件及其座標列表,並調整頁面大小以適應它們。這個邏輯運作得很好。

但是,不起作用的是每個頁面的控件和背景使用對話框的默認顏色/畫筆繪製。

我試過很多方法來試圖強制它使用白色/畫筆,硬編碼的屬性表/頁會。

有兩個重要的部分,以這樣的:

  1. 頁面背景
  2. 控制(頁)背景

#1,我已經試過:

  • 從父窗口類獲取背景畫筆(它是對話框bkgrd)(如果我這樣做並要求選項卡控件,則也是如此)
  • 變化的屬性頁(生成頁面即PropertySheet::AddPagePreCreateWindow不是由框架調用)

#2使用WS_EX_TRANSPARENT,我已經試過:

  • 覆蓋OnWndMsg/WM_CTLCOLORSTATIC將該請求轉發給(A)父級(工作表)和(B)到選項卡控件(這是首先要的是白色)。

但是,任何時候我使用上面的任何一個「請求背景/轉發請求」上鍊到表單或選項卡控件 - 我得到對話框背景顏色,從來沒有白色我會期望。

使用Spy64,我可以看到,對於一個完全硬編碼屬性表/頁 - 這是唯一可辨識的區別我可以看到的是,在AddPage(或它的道德等價物)創建的對話窗口有WS_CHILD代替礦具有WS_POPUP (其餘的樣式看起來是相同的,例如WS_VISIBLE|DS_3DLOOK|DS_FIXEDSYS|DS_SETFONT|DS_CONTROLWS_EX_CONTROLPARENT

因此,除了WS_CHILD之外,我看不出與我創建的內容以及從標準資源(即硬編碼)正常工作的另一個屬性表不同。

我也不知道這是怎麼回事 - 因爲轉發像ctrlcolor消息沒有正確響應 - 並要求窗口背景顏色類似沒有 - 那麼它是如何在一個標準的情況下控件和頁面的背景顏色以白色出現,而不是對話框背景?

任何意見或幫助將不勝感激 - 我有種運行的想法......

+2

'WS_EX_TRANSPARENT'幾乎沒用,它所做的只是改變不同窗口的繪製順序。它實際上並沒有使任何透明。 –

回答

0

原來我的舊代碼已經定義的ON_WM_ERASEBKGND處理器 - 並刪除(和我所有的上述嘗試)使其工作。

所以,簡單地做任何事都是正確的答案。 D'哦!

我在這裏留下我的恥辱,以防其他人在此旅行! [哎呦!]

(不過有興趣,如果任何人有更深入地瞭解這一機制框架下如何運作)

3

當視覺樣式在Windows XP中添加他們真的想炫耀這項新功能,因此他們做了選項卡背景漸變(真正拉伸的圖像),而不是單一的顏色,這在舊的應用程序中做了自定義繪圖與對話框刷作爲背景的問題。

正因爲如此,只有具有comctl32 v6清單的應用程序纔有了新面貌,但出現了問題;舊的propertysheet外殼擴展會加載到新的應用程序(包括資源管理器)中,並且事情看起來是錯誤的。

要解決此問題,他們還需要您(或您的UI框架)撥打EnableThemeDialogTexture(.., ETDT_ENABLETAB)以獲得正確的標籤頁外觀。

好像事情不夠複雜,有一個undocumented requirement,你還需要一個按鈕或頁面上的靜態控件!

如果您有自定義控件,如果它們部分透明,則必須在繪製時調用DrawThemeParentBackground

+0

Win 8/10中的這一切仍然如此嗎?我的應用程序使用v6清單,並在XP中正確顯示主題(或直到去年我們放棄支持)。硬編碼對話框只有一個UGLY白色背景(在我看來,MS再次愚蠢,使用白色,因爲EDIT控件看起來像白色,主題或不是白色)。與2015年相同 - 只是白色。 UGOS :( – Mordachai