系统调色板

【勇芳软件工作室】汉化HomePreviousNext

Windows为使用调色板的每个设备维护【系统调色板】.系统调色板包含当前可由设备显示或绘制的所有颜色的颜色值。除了查看系统调色板的内容之外,应用程序不能直接访问系统调色板。相反,Windows可以完全控制系统调色板,只允许通过使用逻辑调色板进行访问。

应用程序可以使用GetSystemPaletteEntries功能查看系统调色板的内容。此函数检索一个或多个条目的内容,直到系统调色板中的条目总数。总数总是等于由GetDeviceCaps函数返回的SIZEPALETTE值的数字,并且与任何给定逻辑调色板的最大大小相同。

虽然应用程序不能直接在系统调色板中更改颜色,但在实现逻辑调色板时可能会导致更改。要实现调色板,Windows将检查每个请求的颜色,并尝试在系统调色板中找到包含精确匹配的条目。如果Windows找到匹配的颜色,它将逻辑调色板索引映射到相应的系统调色板索引。如果Windows找不到完全匹配,则在映射索引之前,将所请求的颜色复制到未使用的系统调色板条目。如果所有系统调色板条目都在使用中,Windows将逻辑调色板索引映射到其颜色与请求的颜色最接近匹配的系统调色板条目。一旦设置了此映射,应用程序就无法覆盖它。例如,应用程序不能使用系统调色板索引来指定颜色;只允许使用逻辑调色板索引。

创建逻辑调色板时,应用程序可以通过将PALETTEENTRY结构的peFlags成员设置为所选值来修改索引的映射方式。例如,PC_NOCOLLAPSE标志指示Windows立即将所请求的颜色复制到未使用的系统调色板条目,而不管系统调色板条目是否已经包含该颜色。此外,PC_EXPLICIT标志指示Windows将逻辑调色板索引映射到明确给定的系统调色板索引。(应用程序在PALETTEENTRY结构的低位字中给出系统调色板索引。)

调色板可以通过为SelectPalette功能中的【bForceBackground参数分别指定TRUE或FALSE来实现为背景调色板或前景调色板。一次只能有一个前台调色板。如果窗口是当前活动窗口或当前活动窗口的后代,则可以实现前景调色板。否则调色板被实现为背景调色板,而不管【bForceBackground】参数的值。前景调色板的关键属性是,当实现时,它可以覆盖系统调色板中的所有条目(静态条目除外)。Windows通过在系统调色板中将所有不是静态的条目标记为未实现前景调色板,从而消除所有使用的条目,从而实现此目的。对于背景调色板实现,系统调色板上不会发生预处理。前景调色板设置所有可能的非静态颜色。背景调色板只能设置一些尚待开放的内容,并以先到先得的方式确定优先级。通常,应用程序使用实现自己的个人调色板的子窗口的背景调色板。这有助于最小化系统调色板发生的更改次数。

未使用的系统调色板条目是不保留且不包含静态颜色的任何条目。保留的条目被明确标记为PC_RESERVED值。当应用程序实现调色板动画的逻辑调色板时,将创建这些条目。静态颜色条目由Windows创建并对应于默认调色板中的颜色。可以使用GetDeviceCaps函数来检索NUMRESERVED值,该值指定为静态颜色保留的系统调色板条目数。

由于系统调色板具有有限数量的条目,因此为给定设备选择和实现逻辑调色板可能会影响与同一设备的其他逻辑调色板相关联的颜色。这些颜色的变化在显示器上发生时特别显着。应用程序可以确保在每次使用之前重置调色板,为其当前选择的逻辑调色板使用合理的颜色。应用程序通过调用UnrealizeObjectRealizePalette函数来重置调色板。使用这些功能使Windows将逻辑调色板中的颜色重新映射为系统调色板中的合理颜色。