首页 / 软件开发 / C++ / 具有多种动态效果的闪屏
具有多种动态效果的闪屏2008-02-26公子雨闪屏的使用在各类软件中很常见,但具有动态效果的却不多见。今天不小心由ACDSee制作的屏保中得到一些灵感并参照了李建湘写的《闪屏图形特技效果的实现》,特提出来与大家探讨,欢迎大家指教。其实我的方法也是采用积木法,但是如果使用随机积木法,我们会发现随着划分的块数的增大,执行时间也会随之增大,因此我采用了步长来控制下一点的位置。首先,新建的类的框架完全照搬《闪屏图形特技效果的实现》,但删去了其中动态闪屏的具体实现代码,全部换成我自己的。增加了一系列参数。int m_nBlockNum; //将图片在X,Y方向均分为多少份
int m_nXStep; //X方向的步长
int m_nYStep; //Y方向的步长,步长决定了下一点的位置
int m_nDelay; //绘制完一组点(m_nBlockNum个)后的延时
BOOL m_bDirection; //表示第一个点从何处开始TRUE:左上,FLASE:右下
为了加快显示速度,采用一组一组的显示,因此在程序中使用了两种步长,一种是组内步长,一种是组外步长,即使用双重for循环。组内循环很简单,只需显示了每个区域后,x,y方向分别增加对应的步长。for ( j=0; j<m_nBlockNum; j++ )
{
if ( x >= m_nBlockNum )
{
x -= m_nBlockNum;
}
if ( y >= m_nBlockNum )
{
y -= m_nBlockNum;
}
dc.StretchBlt(
x*stepx, y*stepy, //目标设备逻辑横、纵坐标
stepx,stepy, //显示位图的像素宽、高度
&MemDC, //位图内存设备对象
x*stepx, y*stepy, //位图的起始横、纵坐标
stepx,stepy, //位图的像素宽、高度
SRCCOPY);
x += m_nXStep;
y += m_nYStep;
}
使用步长,那么我们就应该避免“走到”一个已经显示出来的地方,因此组外步长的控制就很重要,我在实际测试中发现组外步长只能取两个值,才能将图片显示完整。可取值 可取值
(xy) 0 i+1//x,y分别表示外步长,下同
0 否 是
i+1 是 是
造成这种结果,我想应该是算法的原因,如果哪位高手能够找到弥补的方法,请告知一二。图片的分块由图片尺寸决定,如800 X 600的,如要图片能完全显示出来则不应超过200(能被两个尺寸整除)否则StretchBlt()会“吞噬掉一部分像素”。因为StretchBlt()中的参数类型是int,:)但是如果增大分块数,则可以使效果更加细腻,则就看个人取决。(例如当x=0,y=i+1,m_nXStep=1,m_nYStep=200,m_nBlockNum=600时,效果为:1,为图片在垂直方向上三等分,2,至上而下“染色”(恕小弟不知该如何形容,只是看上去象)一次,接着重复步骤2,只是颜色加深,最后再执行一次步骤2,图片完全显示出来)P.S.“染色”次数=m_nBlockNum/m_nYStep(或者m_nBlockNum/m_nXStep)当x=i+1,y=0,m_nXStep=200,m_nYStep=1,m_nBlockNum=600时,效果同上,只是方向由垂直变为水平,但整体效果看上去就象是在打开日本建筑的门!!!大家不妨一试)瀑布效果:x=0,y=i+1,m_nXStep=1,m_nYStep=20,m_nBlockNum=600,m_nDelay=15,程序运行时,只要视线跟着轨迹动,看上去就象瀑布效果)很重要的一点:分块数不要超过图片的x,y方向尺寸的任何一个,否则程序会出错。