使用调色板制作动画

调色板在现代图形处理中可能已经过时,但在某些特定场合,它仍然发挥着作用。本文将介绍如何将调色板与动画结合,制作出吸引眼球的效果。虽然代码简单,但可以根据个人需求进行调整,使其更加强大和实用。

在闲暇之余,编写了这段代码。非常喜欢Codeproject.com,只是遗憾发现它太晚了。

使用代码

使用这段代码非常简单:

  1. 将两个类文件添加到项目中,分别是 "PalAnimClass.h" 和 "PalAnimClass.cpp"。
  2. 调用它的公共方法 Init() 来完成初始化。
  3. 频繁调用它的 UpdateDate() 方法。每30毫秒调用一次这个函数。可以更改这个值并根据计算机进行调整。由于没有将窗口句柄传递到类中,因此必须使用另一个计时器来循环它。

类定义

以下是类的定义:

C++ class PalAnimClass { public: BOOL GetDirection(); BOOL SetType(int nType); BOOL SetDirect(BOOL dir); BOOL SetColor(int r, int g, int b); BOOL SetSize(int iWidth, int iHeight); void UpdateData(HDC hdc); BOOL Init(); PalAnimClass(); virtual ~PalAnimClass(); private: BOOL m_bDirection; int m_nKind; HBRUSH hBrush; void DrawBackground(HDC hdc, int type); void TimerRoutine(HPALETTE hPalette); HPALETTE CreatePal(); RECT rt; HPALETTE hPalette,hOldPal; int m_nHeight; int m_nWidth; LOGPALETTE *plp; int m_r,m_g,m_b; int i,j; };

原理

调色板动画的原理非常简单,总共只有三个步骤:

  1. 创建一个调色板。这个调色板是特殊的,稍后会讨论。
  2. 使用刚刚创建的调色板中的颜色绘制形状。
  3. 改变调色板条目的值。

非常简单,不是吗?让开始实现它。

创建特殊调色板

以下是创建调色板的代码:

C++ HPALETTE PalAnimClass::CreatePal() { HPALETTE hPalette; if (hPalette) ::DeleteObject (hPalette); plp=(LOGPALETTE *)malloc(sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*64); plp->palVersion = 0x300; plp->palNumEntries = 64; for (int i=0; i<64; i++) { plp->palPalEntry[i].peRed = m_r * sin(PI*i/64); plp->palPalEntry[i].peGreen = m_g * sin(PI*i/64); plp->palPalEntry[i].peBlue = m_b * sin(PI*i/64); plp->palPalEntry[i].peFlags = PC_RESERVED; } hPalette = ::CreatePalette(plp); return hPalette; }

现在使用刚刚创建的调色板绘制背景。请记住使用刚刚创建的调色板中的颜色。这一步很简单,如下所示:

hBrush = CreateSolidBrush(PALETTEINDEX(min(64*sin(PI*j/64), 64*sin(PI*i/64))));

使用 PALETTEINDEX 或 PALETTERGB 来使用新调色板中的颜色。这里的正弦函数很多,这只是个数学问题。可以很好地理解它。在背景中绘制形状后,现在让去改变调色板的值。代码片段如下:

改变调色板值

void PalAnimClass::TimerRoutine(HPALETTE hPalette) { PALETTEENTRY temp; for (j=0; j<3; j++) { if (m_bDirection) { temp = plp->palPalEntry[0]; for (i=0; i<64; i++) plp->palPalEntry[i] = plp->palPalEntry[i+1]; plp->palPalEntry[63] = temp; } else { temp = plp->palPalEntry[63]; for (i=63; i>0; i--) plp->palPalEntry[i] = plp->palPalEntry[i-1]; plp->palPalEntry[0] = temp; } } AnimatePalette(hPalette, 0, 64, plp->palPalEntry); }

AnimatePalette 函数替换指定逻辑调色板中的条目。

备注

应用程序可以通过调用 GetDeviceCaps 函数并指定 RASTERCAPS 常量来确定设备是否支持调色板操作。AnimatePalette 函数只更改在 LOGPALETTE 结构的 palPalEntry 成员中设置了 PC_RESERVED 标志的条目。如果给定的调色板与活动窗口关联,则调色板中的颜色会立即被替换。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485