electObject(&bmp);
bmp.DeleteObject();
mode=1;
counter=0;
SetTimer(1,200,NULL);
onrun=1;
}
9:使用ClassWizard为CPatternDemoDlg加入WM_TIMER的消息响应函数OnTimer(),并在其中添加如下代码:
if(mode==1)
{
if(counter>7)
{
mode=2;
counter=0;
return;
}
pdc->SelectObject(&brush[counter]);
pdc->BitBlt(0,0,100,100,&memDC,0,0,0x000C0324);
counter++;
}
if(mode==2)
{
if(counter>7)
{
mode=3;
counter=0;
return;
}
if(counter==0)
{
bmp.LoadBitmap(IDB_BMPSOURCE2);
memDC.SelectObject(&bmp);
bmp.DeleteObject();
}
pdc->SelectObject(&brush[counter]);
pdc->BitBlt(0,0,100,100,&memDC,0,0,0x00AC0744);
counter++;
}
if(mode==3)
{
if(counter>7)
{
memDC.DeleteDC();
bmp.DeleteObject();
KillTimer(1);
onrun=0;
return;
}
pdc->SelectObject(&brush[counter]);
pdc->BitBlt(0,0,100,100,NULL,0,0,0x00A000C9);
counter++;
}
9:在CPatternDemoDlg::CpatternDemoDlg()中加入:
onrun=0;
10: 使用ClassWizard为CPatternDemoDlg加入WM_DESTORY的消息响应函数OnDestory(),并在其中添加如下代码:
memDC.DeleteDC();
KillTimer(1);
编译运行该项目,可以看到第一幅图象从背景中渐渐的浮现出来,随后,又渐渐地隐入第二幅图象之中,接着,第二幅图象又慢慢地消失于背景中。
动画法:
这种方法是利用直接操作位图的数据来实现的,可以实现像素颜色的平滑变化,视觉效果可以做的很好,因此,这种方法在屏保中的应用非常多。
首先,我们必须了解bmp图形的结构。一个bmp图形由两个部分组成,即文件头和数据区,文件头存放bmp图形的大小、格式等信息,数据区存放bmp图形各个像素的颜色信息。对于24位真彩色的bmp来说,文件头的大小为54个字节,前14个字节对应VC中定义的BITMAPFILEINFO结构,后40个字节对应BITMAPINFOHEADER结构。我们把bmp数据区的数据读出,经过一定的运算,再利用WIN32API::StretchDIBits()函数直接输出到显示DC上,就可以实现一些特技效果。
下面让我们分步去实现一个全屏幕的演示
程序:
1:生成一个基于对话框的项目,命名为F1:
2:删除F1Dlg.h、F1Dlg.h和F1.cpp中与其相关的所有代码。
3:在项目中添加一个基类为generic Cwnd的新类,命名为CW.
4:为CW类添加如下私有成员变量:
//////////////////////
UINT y_offset;
UINT x_offset;
UINT stage;
BYTE* p3;
BYTE * p2;
BYTE * p1;
BITMAPINFOHEADER header;
HGLOBAL hlb1;
HGLOBAL hlb2;
HGLOBAL hlb3;
UINT start;
UINT counter;
////////////////////////
并在W.h的顶部加入宏定义 #define BMP_SIZE 192000
5:为CW添加Create()虚函数,WM_CREATE,WM_TIMER,WM_PAINT,WM_DESTORY,WM_LBUTTONDOWN的消息句柄,接受缺省的函数名称。
6:删除CW::Create()中的原有代码,用以下