|
在VB中制作调色板动画
|
|
邮编:100085 北京2855信箱41分箱 王秀英
实现调色板动画主要有以下几个步骤: 1.创建自己定义的逻辑调色板; 2.将这个自定义的逻辑调色板选入要进行操作的设备环境中; 3.在这个设备环境中利用逻辑调色板中的颜色来绘制图形; 4.周期性地改变逻辑调色板中的颜色值,并使其立即反映到系统调色板中。
API函数有: CreatePalette:创建一个逻辑调色板,并返回该调色板的句柄; SelectPalette:将一个逻辑调色板选入一个设备环境中; RealizePalette:将新选入到设备环境中的调色板映射到系统调色板中; AnimatePalette:不仅改变逻辑调色板中的颜色,还直接改变系统调色板的颜色,所以每次改变所选的颜色,不必调用RealizePalette函数。
Type PALETTEENTRY peRed As Byte peGreen As Byte peBlue As Byte peFlags As Byte End Type 该结构用来定义调色板项,前三个字段分别设置红、绿、兰三原色的值,取值为0~255;最后一个字段为一个标志位,取值为Windows定义的常数,见下面的常数部分。
palVersion As Integer palNumEntries As Integer palPalEntry(4) As PALETTEENTRY End Type 该结构用来定义逻辑调色板。其中第一个字段包含一个常数,为十六进制的300,表示为&H300;第二个字段指定新调色板中的调色板项的数量;第三个字段是PALETTEENTRY结构的一个数组。
Const PC_RESERVED = &H1 该常数的含义为:调色板中只有标记为PC_RESERVED的项才能被AnimatePalette函数修改,该标记还禁止其它窗口将它们的逻辑调色板映射到保留的颜色项,这将把颜色变化的影响限制在活动窗口中。
在VB中新建一个工程,在其默认的Form1窗体上放两个CommandButton控件,分别将起Name属性设为CmdStart和CmdEnd;放一个Picture控件,将其Name属性设为Pict1,将其FillStyle属性设为0;放一个Timer控件,将其Interval属性设为1000,Enabled属性设为False,然后将下面代码放入窗体的代码窗口中:
Private Declare Function CreatePalette Lib "gdi32" (lpLogPalette As LOGPALETTE) As Long Private Declare Function RealizePalette Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function AnimatePalette Lib "gdi32" (ByVal hPalette As Long, ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteColors As PALETTEENTRY) As Long
peRed As Byte peGreen As Byte peBlue As Byte peFlags As Byte End Type
palVersion As Integer palNumEntries As Integer palPalEntry(4) As PALETTEENTRY End Type
Dim newPal As LOGPALETTE '定义逻辑调色板
Timer1.Enabled = False Unload Me End Sub
Timer1.Enabled = True End Sub
newPal.palVersion = &H300 newPal.palNumEntries = 4
newPal.palPalEntry(0).peGreen = &H0 newPal.palPalEntry(0).peBlue = &H0 newPal.palPalEntry(0).peFlags = PC_RESERVED
newPal.palPalEntry(1).peGreen = &HFF newPal.palPalEntry(1).peBlue = &H0 newPal.palPalEntry(1).peFlags = PC_RESERVED
newPal.palPalEntry(2).peGreen = &H0 newPal.palPalEntry(2).peBlue = &HFF newPal.palPalEntry(2).peFlags = PC_RESERVED
End Sub
Dim Dummy As Long Dim iCount As Integer Dim X As Integer, Y As Integer
Dummy = RealizePalette(Pict1.hdc) '实现这个新选入的逻辑调色板,即将其映射到 '系统调色板上
X = X + (Pict1.ScaleWidth - 10) / 3 Pict1.FillColor = &H1000000 Or iCount '将颜色的最高位设为1表示最后两位数是调色 '板的索引号,而不是红颜色的数值,这样就会使用索引号指定的调色板项的颜色。 Pict1.Circle (X, Y), (Pict1.ScaleWidth - 70) / 6, &H1000000 Or iCount Next iCount End Sub
Dim iCount As Integer
newPal.palPalEntry(iCount).peRed = newPal.palPalEntry(iCount - 1).peRed newPal.palPalEntry(iCount).peGreen = newPal.palPalEntry(iCount - 1).peGreen newPal.palPalEntry(iCount).peBlue = newPal.palPalEntry(iCount - 1).peBlue Next iCount newPal.palPalEntry(0).peRed = newPal.palPalEntry(3).peRed newPal.palPalEntry(0).peGreen = newPal.palPalEntry(3).peGreen newPal.palPalEntry(0).peBlue = newPal.palPalEntry(3).peBlue
|