65.9K
CodeProject 正在变化。 阅读更多。
Home

创建简单的调色板动画

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.22/5 (10投票s)

2009 年 12 月 26 日

CPOL

3分钟阅读

viewsIcon

32142

downloadIcon

928

向您展示如何用调色板创建简单的动画

PalAnimDemoSrc

引言

本文演示了如何使用调色板创建动画。 众所周知,调色板已经过时了,但是仍然有很多地方会用到它。 如果您对调色板不太了解,请在线搜索以了解更多信息。 在您的项目中添加一些动画非常酷,它可以吸引其他人的眼球。 当然,这段代码非常简单。 您可以根据需要以任何方式更改它,使其更有用和更强大。

背景

我没什么事可做,所以我写了这段代码。 我喜欢 Codeproject.com,但我觉得我发现它太晚了。

Using the Code

使用这段代码非常容易

  1. 将两个类文件添加到您的项目,“PalAnimClass.h”和“PalAnimClass.cpp”。
  2. 调用其 public 方法 Init() 来完成初始化。
  3. 现在,经常调用其 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():应传入三个参数,它们是 REDGREENBLUE 颜色。 它们的范围均为 0~255,就像宏 RGB 一样。
  • SetSize() 用于设置动画的大小。 默认大小为 300X300。
  • Init() 用于初始化。

原理

调色板动画的原理其实很简单。 总共只有三个步骤。

  1. 创建一个调色板。 这个调色板很特别,我们稍后会讨论它。
  2. 用我们刚刚创建的调色板中的颜色绘制形状。
  3. 我们更改 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 帮助我进步!^.^

© . All rights reserved.