创建简单的调色板动画






4.22/5 (10投票s)
向您展示如何用调色板创建简单的动画

引言
本文演示了如何使用调色板创建动画。 众所周知,调色板已经过时了,但是仍然有很多地方会用到它。 如果您对调色板不太了解,请在线搜索以了解更多信息。 在您的项目中添加一些动画非常酷,它可以吸引其他人的眼球。 当然,这段代码非常简单。 您可以根据需要以任何方式更改它,使其更有用和更强大。
背景
我没什么事可做,所以我写了这段代码。 我喜欢 Codeproject.com,但我觉得我发现它太晚了。
Using the Code
使用这段代码非常容易
- 将两个类文件添加到您的项目,“PalAnimClass.h”和“PalAnimClass.cpp”。
- 调用其
public
方法Init()
来完成初始化。 - 现在,经常调用其
UpdateDate()
。我每 30 毫秒调用一次此函数。 您可以更改该值并调整您的计算机。 因此,没有窗口句柄传递到该类中,因此我们必须使用另一个计时器来循环它。 让我们看一下该类的定义
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;
};
只找到几个 public
方法。
GetDirection()
用于获取移动方向。 实际上,它是一种BOOL
日期类型,表示向左或向右,向内或向外的移动。 我们使用此方法来获取移动的值,并使用另一种方法SetDirect()
来设置新值。SetType()
用于设置动画的类型。 动画类型的范围是 0~6。 确保不要越界。SetColor()
:应传入三个参数,它们是RED
、GREEN
、BLUE
颜色。 它们的范围均为 0~255,就像宏 RGB 一样。SetSize()
用于设置动画的大小。 默认大小为 300X300。Init()
用于初始化。
原理
调色板动画的原理其实很简单。 总共只有三个步骤。
- 创建一个调色板。 这个调色板很特别,我们稍后会讨论它。
- 用我们刚刚创建的调色板中的颜色绘制形状。
- 我们更改
paletteentry
的值。
很简单,不是吗? 让我们开始实现它。
创建一个特殊的调色板
HPALETTE PalAnimClass::CreatePal()
{
HPALETTE hPalette;
if(hPalette)
::DeleteObject (hPalette);
plp=(LOGPALETTE *)malloc(sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*64);
plp->palVersion =0x300; //Always 0x300
plp->palNumEntries =64;//We only use 64 so no need change to var
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; //This is very important!Must be
// PC_RESERVED. That is why I always say that it's a special palette.
}//If peFlasg is not this value, AinamatePalette() will not get the result we want!
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) //m_bDirecton is a BOOL data structure to
//decide whether the palletteentry move to left or to right
{ //here just a shift oporation,we take the last to first or
//take first to last
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); //here it is very important to
// alter the physical device's data.
}
AnimatePalette
函数替换指定逻辑调色板中的条目。
BOOL AnimatePalette(
HPALETTE hpal, // handle to logical color palette
UINT iStartIndex, // first entry in logical palette
UINT cEntries, // count of entries in logical palette
CONST PALETTEENTRY *ppe // pointer to first replacement
);
备注
应用程序可以通过调用 GetDeviceCaps
函数并指定 RASTERCAPS
常量来确定设备是否支持调色板操作。
AnimatePalette
函数仅更改在 LOGPALETTE
结构的相应 palPalEntry
成员中设置了 PC_RESERVED
标志的条目。
如果给定的调色板与活动窗口相关联,则调色板中的颜色将立即被替换。
现在开始。 轮到你了,尝试编写更有趣的代码。 对我的缺点感到抱歉。 有任何问题,请将我添加到您的 ICQ 聊天中。
关注点
我发现我变得越来越有耐心和效率。 感谢大家的帮助! 再次感谢! CodeProject 帮助我进步!^.^