管理多个调色板

使用调色板时,应记住对很多显示来说,屏幕上同时最多只能显示出 256 种颜色。

当应用程序中使用一种以上的彩色调色板时,此项限制就变得非常重要。例如,在单个窗体上,可在图象控件中显示一个 256 色位图,同时在图片框中显示第二个图象。如果这两个图象的逻辑调色板包含的 256 种颜色不完全相同,Windows 就必须决定先将哪一个逻辑调色板的颜色调到硬件调色板中。记住,硬件调色板决定了屏幕上实际显示的颜色。

当 Visual Basic 的应用程序有两个以上的窗体的逻辑调色板互不相同时,也会发生类似的情况。哪个窗体接收到焦点,它的逻辑调色板就控制硬件调色板。这样常会导致显示效果比在 256 色系统下的最优显示要差一些。作为 Visual Basic 程序员,可通过使用 PaletteMode 属性来控制硬件调色板。

PaletteMode 属性

当设计可在 256 色系统下运行的应用程序时,通过设置窗体、用户控件或用户文档的 PaletteMode 属性,能控制 Windows 选择显示颜色的途径(用户控件和用户文档只在专业版和企业版中有效。)。窗体、用户控件或用户文档中含有的所有控件,都要根据 PaletteMode 的设置来显示。下表列出了 PaletteMode 的有效设置:

模式 常数 应用到
Halftone vbPaletteModeHalftone 窗体,用户控件,用户文档
UseZOrder vbPaletteModeUseZOrder 窗体,用户控件,用户文档
Custom vbPaletteModeCustom 窗体,用户控件,用户文档
Container vbPaletteModeContainer 用户控件
None vbPaletteModeNone 用户控件
Object vbPaletteModeObject 含有调色板的ActiveX 设计器

PaletteMode 属性只应用于 256 色的显示。在增强色或真彩色显示中,可通过视频驱动程序分别使用 32,000 色或 16 兆色的调色板,来控制颜色的选择。即使在一个以增强色或真彩色显示的系统中设计程序时,还是要设置 PaletteMode,因为许多用户可能用的是 256 色显示。

PaletteMode 属性可在设计时通过“属性”窗口来设置,也可在运行时通过代码来改变。调色板示例应用程序使用几种不同的 PaletteMode 设置,显示出带有不同调色板图象的显示效果。

注意 对于 Visual Basic 的老版本,PaletteMode 相当于 UseZOrder。

中间色调的 PaletteMode

窗体和用户文档的缺省模式为中间色调。在这种模式下,包含在窗体中的任何控件、图象,或图形方法使用系统中间色调的调色板绘图。

在大多数情况下,中间色调模式是一种很好的选择,因为它在窗体中的图象与其它窗体或图象中使用的颜色之间,提供了折衷办法。当然,它也会导致图象质量的下降。例如,一个具有包含 256 种深度灰色调色板的图象,在显示时可能会丢失某个细节或显示出其它难以预料的颜色。

UseZOrder PaletteMode

零排序是一个相对的排序,它决定窗体中的控件,相互间如何重叠。对于带有焦点的窗体,当它的 PaletteMode 被设置为 UseZOrder 时,总是最顶层控件的调色板享有优先权。这就是说,每当一个新控件成为最顶层时(如:调一个新图象到图片框中),硬件调色板都将重新映射。这常常会引起称为调色板闪烁的副作用:当新颜色显示时,会出现闪烁,在当前窗体和其它任何可见的窗体或应用程序中都是如此。

尽管 UseZOrder 设置提供了最准确的颜色显示,但它速度较慢。而且,这种方法会引起窗体的背景色,或无图象控件的背景色出现抖动。当准确显示一个顶层图象比产生调色板闪烁更重要,或需要保持 Visual Basic 老版本的向下兼容时,将 PaletteMode 设置为 UseZOrde 是最好的选择。

自定义 PaletteMode

如果需要更精确地控制实际显示的颜色,可用 256 色映象定义一个自定义调色板。要实现这一点,需赋值给窗体的 Palette 属性一个 256 色映象(.bmp、.cur、ico、.dib 或 .gif ),并将 PaletteMode 属性设置为 Custom。位图不用很大,甚至一个单独的像素就可以为窗体或图片框定义 256 种颜色。这是因为位图的逻辑调色板能列出 256 种颜色,而不论那些颜色是否全部出现在位图中。

因为有缺省方法,所以使用 RGB 函数定义的颜色也必须存在于位图中。如果此颜色不匹配,它将被映射到逻辑调色板中最接近的匹配色,此逻辑调色板属于由 Palette 属性指定的位图。

要想在运行时设置自定义 PaletteMode,需在 Form_Load 事件中添加下列代码(假定具有所选调色板的图象已经被赋值给名为 Image1 的图象控件):

'将调色板从 Image1 赋值给窗体。
Form1.Palette = Image1.Picture
'使用 Custom 模式。
Form1.PaletteMode = vbPaletteModeCustom

另外,也可使用图片对象来达到相同的效果,而无需另加图象控件:

Dim objPic As Picture 
Set objPic = LoadPicture(App.Path & "\Pastel.bmp ")
'将图片对象的调色板赋值给窗体。
Form1.Palette = objPic
'使用 Custom 模式。
Form1.PaletteMode = vbPaletteModeCustom

当希望在应用程序中,自始至终保持同一个调色板时,自定义 PaletteMode是最佳的选择。

注意 在不能使用任何 256 色图形的情况下,使用“Custom PaletteMode”也可增强应用程序的性能。如果将窗体的 PaletteMode 设置为自定义的,并将 Palette 属性置为空,则该窗体就能快速装入,因为不会发生调色板匹配的问题。

详细信息 关于图片对象的详细信息,请参阅本章后面的“使用图片对象”。

其它调色板模式

创建用户控件时还有两种可用的附加 PaletteMode 设置:Container 和 None。Container 模式将用户控件和所包含其它控件的调色板,在运行时映射为容器(窗体或用户文档)的环境调色板。如果该容器没有提供环境调色板,则调用中间色调模式。因为事先不知道用户控件会在何处被调用,所以该模式可以避免控件与其它调色板处理方法发生冲突。

None 模式所做的正如可预料的那样:它清除所有的调色板处理。当创建一个不显示图象或图形的用户控件时,通过清除处理调色板信息的附加表头,将 PaletteMode 设为 None,可提高性能。

使用相关调色板颜色

当为 256 色显示设计时,有些颜色可能会出现抖动。这可能使文本或其他的图形元素难于辨认。通过指定一个相关调色板颜色,Visual Basic 能够在以更高的颜色深度精确地显示颜色的同时,显示 256 色中某种指定颜色的最近似的非抖动颜色。

要强制 Visual Basic 对一个给定的属性使用最近似的单色而不是抖动的颜色,可以在该颜色属性的高位字节放置一个 2,例如,要强制一个窗体的背景色为纯浅橙色,可以使用下面的代码:

Private Function PaletteRGB(RGB As Long) As Long
 PaletteRGB = &H02000000 Or RGB
End Function

如果在设计时设置下面的属性:

Form1.BackColor = &H00C0E0FF&    '抖动的浅橙色

并且添加下列代码到 Form_Click 事件中:

Private Sub Form_Click()
   Form1.BackColor = PaletteRGB(Form1.BackColor)
End Sub

在运行时单击该窗体,其背景色将改变为单色而不是抖动的阴影。现在,它所使用的是来自于 halftone 调色板的最近似的颜色。如果系统运行的颜色深度高于 256 色,可能就看不到这种效果。