2013-07-05 22 views
2

通常,標準控件使用的大多數顏色都可以從GetSysColor獲得,我運行了所有常量(0-30)的所有COLOR_測試,並將其與組框邊框的顏色進行比較,他們匹配。我使用XP,並且組框邊框的顏色爲0xD0D0BF獲取組框邊框的系統顏色

如何獲取用於繪製組框邊框的系統顏色?

回答

3

使用「經典」主題(在XP上,或以前版本的Windows中唯一的主題),組框邊框不是單一的顏色。它實際上是一條「蝕刻」線,由兩條不同顏色的線組成。每種顏色都有COLOR_*值,但您不想嘗試以這種方式重新創建線條。相反,使用GDI的DrawEdge函數和EDGE_ETCHED標誌。

但是,如果啓用了主題,則組框邊框實際上是單一顏色,並且該顏色因所選主題而異。無法使用GetSysColor檢索主題顏色,因爲它們沒有對應的COLOR_*值。在構思主題之前,該API是發明了。相反,有一套全新的主題API。你在這裏感興趣的是GetThemeColor,但爲了使用它,你還需要OpenThemeDataCloseThemeData

棘手的部分是搞清楚要傳遞給OpenThemeData函數的內容。 This question可能有幫助。 A組框控件實際上是一種特殊類型的按鈕控制的,所以你想要的風格是:

  • 類:BUTTON
  • 部分:BP_GROUPBOX
  • 國:GBS_NORMAL(也可能是GBS_DISABLED
  • 物業編號: TMT_BORDERCOLOR ???

請確保您的代碼在主題被禁用時具有適當的後備支持!使用函數在運行時動態確定並選擇適當的繪圖代碼路徑。


編輯:上的XP虛擬機經過一番測試,我無法找到合適的TMT_*屬性ID指定要得到一個組框的邊框正確的顏色。我不確定那是怎麼回事。但是你可以得到繪製您使用DrawThemeBackground功能邊界:

HTHEME hTheme = OpenThemeData(grpBox->m_hWnd, L"Button"); 
DrawThemeBackground(hTheme, hDC, BP_GROUPBOX, GBS_NORMAL, &rcArea, NULL); 
CloseThemeData(hTheme); 

不幸的是,這並沒有告訴你如何得到的顏色值本身。

+0

感謝您經過這麼多努力來研究這個答案(即使我已經將它標記爲答案!)。 – Matt

+0

顯然沒有直接的方法來獲得顏色。我列舉了所有'TMT_ *'值,並且它們中的_none_與組合框實際使用的值相匹配。 TMT_BORDERCOLORHINT可能會關閉。 –

+0

問題可能在於它不是單一顏色。例如,如果它是一個漸變。如果'TMT_BORDERCOLORHINT'接近,那可能是解釋。也有助於解釋爲什麼它被稱爲「提示」。 –