使用调色板时,应记住对很多显示来说,屏幕上同时最多只能显示出 256 种颜色。
当应用程序中使用一种以上的彩色调色板时,此项限制就变得非常重要。例如,在单个窗体上,可在图象控件中显示一个 256 色位图,同时在图片框中显示第二个图象。如果这两个图象的逻辑调色板包含的 256 种颜色不完全相同,Windows 就必须决定先将哪一个逻辑调色板的颜色调到硬件调色板中。记住,硬件调色板决定了屏幕上实际显示的颜色。
当 Visual Basic 的应用程序有两个以上的窗体的逻辑调色板互不相同时,也会发生类似的情况。哪个窗体接收到焦点,它的逻辑调色板就控制硬件调色板。这样常会导致显示效果比在 256 色系统下的最优显示要差一些。作为 Visual Basic 程序员,可通过使用 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。
窗体和用户文档的缺省模式为中间色调。在这种模式下,包含在窗体中的任何控件、图象,或图形方法使用系统中间色调的调色板绘图。
在大多数情况下,中间色调模式是一种很好的选择,因为它在窗体中的图象与其它窗体或图象中使用的颜色之间,提供了折衷办法。当然,它也会导致图象质量的下降。例如,一个具有包含 256 种深度灰色调色板的图象,在显示时可能会丢失某个细节或显示出其它难以预料的颜色。
零排序是一个相对的排序,它决定窗体中的控件,相互间如何重叠。对于带有焦点的窗体,当它的 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 色,可能就看不到这种效果。