2011-03-28 75 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