今天捣鼓下 COLORREF
这玩意儿,顺手记录一下过程。
起因是搞一个小工具,想改个界面元素的颜色,结果发现它要的不是咱们平时说的“红色”、“绿色”,也不是那种“#FF0000”的代码,而是这个叫 COLORREF
的东西。具体来说,就是一个函数参数,类型标明是 COLORREF
。
一开始有点懵,这串数字是啥玩意儿?看着像是一串十六进制的数字,比如 0x00FF0000
这种。查下资料,,原来是Windows里头表示颜色的老方法,就是把红(R)、绿(G)、蓝(B)三个颜色的值塞到一个32位的整数里头。
关键是它的顺序有点怪,不是咱们直觉上的RGB,好像是蓝绿红(BGR)的顺序,具体来说,最低那个字节存的是蓝色(Blue)的值,中间字节存的是绿色(Green),再高一点的字节存的是红色(Red)。最高那个字节好像没用,一般是0。比如纯红色,RGB是(255, 0, 0),那对应的 COLORREF
数值(十六进制)反而是 0x000000FF
这样子。如果是纯绿色 (0, 255, 0),那就是 0x0000FF00
。纯蓝色 (0, 0, 255) 就是 0x00FF0000
。
搞明白这个就好办。我一般是这样做的:
- 先用取色工具或者网页啥的,找到我想要的颜色的RGB值。比如说,我想要一个特定的灰色,RGB值可能是 (128, 128, 128)。
- 然后用Windows提供的一个宏,叫
RGB(r, g, b)
,这个特别方便。直接把红、绿、蓝三个值(0到255之间)填进去,它就能自动帮你算好那个COLORREF
数值。像刚才那个灰色,就是RGB(128, 128, 128)
,它内部会帮你组合成0x00808080
。 - 把这个用
RGB
宏算出来的值,填到那个需要COLORREF
类型参数的地方就行。我的那个小工具界面颜色就这么改成功。
实践中的一些发现:
有时候看别人的代码或者一些老的库、老的例子,会直接写死一些 COLORREF
值,像 0x000000
(黑色), 0xFFFFFF
(白色), 0x0000FF
(红色), 0x00FF00
(绿色), 0xFF0000
(蓝色)。看得多大概也能猜出来是啥颜色,或者反推它的RGB值。
我还看到过定义一个颜色数组的,像这样:
COLORREF MyColors[] = { 0x000000FF, 0x0000FF00, 0x00FF0000 };
这就是存红、绿、蓝三个颜色值,用的时候直接从数组里取,比如 MyColors[0]
就是红色。
虽然现在很多新框架都用更方便的颜色表示法,比如直接用颜色名字字符串,或者 CSS 那种 #RRGGBB 格式,但在一些比较底层的Windows编程,或者维护一些旧项目,或者用一些比较老的图形库的时候,还是会碰到这 COLORREF
。
COLORREF
就是个数值,代表BGR颜色。知道它的原理和怎么用 RGB
宏转换,用起来也没那么复杂。这回折腾也算是又熟悉一下这老伙计,以后再碰到就不会手忙脚乱。