调色板原理 & 编程
逻辑调色板结构 LOGPALETTE,该结构定义如下:
typedef struct tagLOGPALETTE
{
WORD palVersion; //调色板的板本号,应该指定该值为 0x300;
WORD palNumEntries;//调色板中的表项数,对于灰度图像该值为 256;
PALETEENTRY palPalEntry[1];//调色板中的颜色表项,由于该表项的
数目不一定,所以这里数组长度定义为 1,灰度图像对应的该数组的长度为
256;
} LOGPALETTE;
颜色表项结构 PALETTEENTRY 定义了调色板中的每一个颜色表项的颜色和使
用方式,定义如下:
typedef struct tagPALETTEENTRY
{
BYTE peRed; //R 分量值;
BYTE peGreen; //G 分量值;
BYTE peBlue; //B 分量值;
BYTE peFlags; // 该颜色被使用的方式,一般情况下设为"0";
}PALETTEENTRY;
Windows 系统使用调色板管理器来管理与调色板有关的操作,通常活动窗口
的调色板即是当前系统调色板,所有的非活动窗口都必须按照此系统调色板来显
示自己的颜色,此时调色板管理器将自动的用系统调色板中的最近似颜色来映射
相应的显示颜色。如果窗口或应用程序按自己的调色板显示颜色,就必须将自己
的调色板载入到系统调色板中,
这种操作叫作实现调色板,实现调色板包括两个步骤:
1. 首先将调色板选择到设备上下文中,可以通过 CDC::SelectPalette()
选入设备上下文
2. 然后在设备上下文中实现调色板, 可以通过
CDC::RealizePalette()实现设备调色板。
在实现调色板的过程中,通过在框架类中处理 Windows 定义的消息
WM_QUERYNEWPALETTE 、WM_PALETTECHANGED 及视图类中处理自定义消息
WM_DOREALIZE(该消息在主框架窗口定义如下:#define WM_REALIZEPAL
(WM_USER+101))来实现调色板的操作。当系统需要处理调色板的变化时,将向
程序的主窗口发送 WM_QUERYNEWPALETTE 、WM_PALETTECHANGED,例如当某一窗口
即将激活时,主框架窗口将收到 WM_QUERYNEWPALETTE 消息,通知该窗口将要收
到输入焦点,给它一次机会实现其自身的逻辑调色板;当系统调色板改变后,主
框架窗口将收到 WM_PALETTECHANGED 消息,通知其它窗口系统调色板已经改变,
此时每一窗口都应该实现其逻辑调色板,重画客户区。
评论0