2011-03-28 112 views
0

在我們的一個應用程序中,我們希望使用自定義顏色,並且在很多情況下基本忽略標準窗口調色板(例如,將WindowText設置爲藍色而不是黑色)。我認爲要做到這一點只是創建一個邏輯調色板,並使用SelectPalette和RealizePalette將其應用於應用程序,但我找不到使用這些調色板的好例子。這可能嗎?可以使用邏輯調色板來代替系統調色板嗎?

回答

3

你所要求的將是GetStockObject的倒數(好吧,嚴格來說,還有幾個函數需要像GetSysColor這樣的索引也是相關的)。但是,沒有這樣的函數來設置每個進程的這些函數(除非你想去系統範圍,SetSysColors,你的問題似乎排除)。你最好的選擇 - 也是最簡單的方法 - 就是在你的進程中掛鉤這些函數(Windows爲你做了copy-on-write部分,因此可以將它掛在gdi32.dll佔用的內存中)並返回你自己的對象(刷子,字體,筆,顏色)。嘗試確保在應用程序完成後清理GDI對象。這正是你要求的東西,但不一定是在Delphi中實現效果的最簡單方法。 編輯:大衛Heffernan指出,關於掛鉤的建議不考慮主題。他是對的。所以也許這不是最好的方法。

但是,考慮到您使用的是Delphi,可能最容易推導出您想要自定義的VCL類(實用於控件和表單)。或者,您可以使用RTTI遍歷表單的元素並根據需要修改元素(統一地和按照控件類型)。

如果您的應用程序只需要它在應用程序中的某些控件,WM_CTLCOLOREDIT和朋友我更容易的方法。

無論哪種方式:請考慮可用性和應用程序的UX(用戶體驗),通常是更好的,如果應用程序使用熟悉的控制元件,款式,顏色...

+2

+1特別針對「無論哪種方式」的評論。這是我的系統,我選擇了主題。 – 2011-03-29 01:18:08

+1

即使你鉤住GetStockObject和GetSysColor,主題API又如何呢?如果你真的想這樣做,那麼你應該皮膚你的應用程序。但它會破壞你的應用程序的可用性。 – 2011-03-29 08:13:23

+0

@David:真實點。甚至沒有考慮主題API。 – 0xC0000022L 2011-03-29 12:45:50

2

這些日子你爲什麼需要使用調色板?只要使用RGB值即可。

調色板可追溯到8位(及更低)彩色設備的日期。現在我們已經全部轉移到了16位顏色和最近的32位顏色,他們已經成爲了一個遺蹟。

+5

調色板不能幫助。您應該編輯您的問題,以說明您在此評論中所說的內容。 – 2011-03-28 23:42:12

1

湯姆,你問因爲VCL中的某些控件可以更容易地完成,而不是其他控件。對於更徹底的解決方案,您可能對Delphi的主題化或皮膚解決方案感興趣。這將幫助您實現不僅自定義的顏色,而且完全自定義的外觀。

德爾福有各種主題和蒙皮系統。你所談論的方法(你稱之爲「邏輯調色板」實際上是Windows系統的顏色方案)歸結爲鉤住Windows GetSysColor函數,並且幾乎沒有你希望的那麼好。

相反,嘗試了徹底的解決辦法:Skins(顯示的鏈接是SpTbxLib皮膚) enter image description here

順便說一句,有些人討厭皮膚的應用程序(見其他問題,評論)等任何皮膚功能,您實現應該有一個OFF開關。還有些人視力有限,依靠windows高對比度主題工作。想想那些不得不使用你建立的人的人。

+0

因爲此應用程序使用其他不能剝皮的組件,剝皮並不好。高對比度不是決定方案的問題,用戶是無論如何整天都在使用計算機的專業人士(有限市場)。 – 2011-04-01 15:31:10

+0

我還沒遇到很多「不能」被剝皮的組件。那些不能的,可能使用OpenGL,DirectX API或GDI +。任何簡單的舊GDI都可能被剝皮。 – 2011-04-01 15:42:05

+0

我們有德爾福5.找到皮膚控制,將與這個古董工作,除非我想去海盜,幾乎是不可能的,這不是我的選擇。 – 2011-04-01 17:13:05