2023年7月18日发(作者:)
仅以512×512的.bmp格式的图像为例.在VC++6.0下建立一个基本对话框的工程Special,在对话框加入如下图所示的控件:
其中图像控件的ID号是IDC_IMAGE,“特殊效果”按钮的ID是IDOK,“退出”按钮的ID是IDCANCEL.可以在Special::OnInitDialog()函数中对各个控件的位置和大小及对话框的大小进行重新排列:
SetWindowPos(NULL,100,100,600,600,0);//改变对话框的大小为600×600
GetDlgItem(IDC_IMAGE)->MoveWindow(0,0,512,512,FALSE);
//控件大小和图像大小设置成一致的,即512×512
GetDlgItem(IDOK)->MoveWindow(30,522,80,30,FALSE);
GetDlgItem(IDCANCEL)->MoveWindow(120,522,60,30,FALSE);
载入位图资源(一幅512×512的位图),其ID记为IDB_BITMAP1,按照以下方式读取和显示:
CBitmap bitmap;
tmap(IDB_BITMAP1);
CWnd* pwnd=GetDlgItem(IDC_IMAGE);
CDC* dc=pwnd->GetDC();
CDC MemDC;
CompatibleDC(dc);
Object(&bitmap);
CRect rect;
pwnd->GetClientRect(&rect);
dc->BitBlt(0,0,(),(),&MemDC,0,0,SRCCOPY);//显示位图
Object();
dc->DeleteDC();
DC();
pwnd->ReleaseDC(dc);
pwnd->ReleaseDC(&MemDC);
在后面的特效处理中只要把“//显示位图”那一行的代码作相应的改变即可.
1 水平交错效果
原理:将内存设备情境对象中的位图数据拆分成奇、偶扫描线两部分,其中奇数条扫描线由上往下移动,偶数条扫描线则由下往上移动,且两者同时进行。屏幕上的效果为分别由上下两端出现的较淡栅栏图形,逐渐相互靠近,直至整个位图完全清楚。垂直交错效果的实现原理与之类似。用下面的代码替换“//显示位图”那一行的代码.
int i,j;
for(i=0;i<=512;i+=2)
{
j=i;
while(j>0)
{
dc->StretchBlt(0,j-1,512,1,&MemDC,0,512-(i-j-1),512,1,SRCCOPY);
dc->StretchBlt(0,512-j,512,1,&MemDC,0,i-j,512,1,SRCCOPY);
j-=2;
}
Sleep(10);
}
2 雨滴效果
原理:将内存设备情境对象中位图数据的最后一条扫描线,顺序地从目标设备中待显示位图的第一条扫描线所在位置移动至最后一条处,并保留此条扫描线在屏幕上移动时留下的轨迹。接着再把MemDC中位图数据的倒数第二条扫描线,顺序地从目标设备中待显示位图的第一条扫描线所在位置移动至倒数第二条处。其余的扫描线依此类推。用下面的代码替换“//显示位图”那一行的代码.
int i,j;
for(i=0;i<=512;i++)
{
for(j=0;j<=512-i;j++)
{
dc->StretchBlt(0,j,512,1,&MemDC,0,512-i,512,1,SRCCOPY);
}
Sleep(10);
}
3 百叶窗效果
原理:将内存设备情境对象中的位图数据分成若干组,然后分别从第一组到最后一组进行搬移,第一次搬移每组中第一条扫描线到目标设备中待显示位图的相应位置,第二次搬移每组中第二条扫描线,接着第三条、第四条扫描线。用下面的代码替换“//显示位图”那一行的代码.
int i,stepi,j;
stepi=512/10;
for(i=0;i<=stepi;i++)
{
for(j=0;j<10;j++)
{
dc->StretchBlt(0,j*stepi+i,512,1,&MemDC,0,j*stepi+i,512,1,SRCCOPY);
}
Sleep(20);
}
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689610035a270356.html
评论列表(0条)