水平百葉窗:將圖象分成若干等份,每次掃描各等份的1象素寬後Sleep一段時間,再掃描下一象素,直到每份的象素都掃描完。
雨滴效果:讀入位圖的最後一行象素,從屏幕的最上端開始移動到象素的實際位置;接著讀入倒數第一行象素,依次類推。
具體步驟如下:
CDC memdc;
CBitmap m_bitmap;
m_bitmap.LoadBitmap(IDB_BITMAP1);
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int width; // 位圖的寬度
int height; //位圖的高度
if(!memdc.GetSafeHdc())
{
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(&m_bitmap);
}
//獲取位圖大小信息
BITMAP bm;
m_bitmap.GetBitmap(&bm);
width=bm.bmWidth;
height=bm.bmHeight;
if(next==2)//水平向左掃描
{
for(int i=0;i<width;i++)
{
pDC->BitBlt(i,0,1,height,&memdc,i,0,SRCCOPY);
Sleep(1);
}
}
else if(next==1)//水平向右掃描
{
for(int i=width-1;i>=0;i--)
{
pDC->BitBlt(i,0,1,height,&memdc,i,0,SRCCOPY);
Sleep(1);
}
}
else if(next==3)//水平百葉窗
{
//每條20象素寬
int num=width/20;
for(int i=0;i<20;i++)
{
//分別掃描每條
for(int j=0;j<num;j++)
{
pDC->BitBlt(j*20+i,0,1,height,&memdc,j*20+i,0,SRCCOPY);
}
Sleep(10);
}
}
else if(next==4)//垂直百葉窗
{
int num=height/20;
for(int i=0;i<20;i++)
{
//分別掃描每條
for(int j=0;j<num;j++)
{
pDC->BitBlt(0,j*20+i,width,1,&memdc,0,j*20+i,SRCCOPY);
}
Sleep(10);
}
}
else if(next==5)//雨滴效果
{
for(int i=height-1;i>=0;i--)
{
for(int j=0;j<i;j++)
{
pDC->BitBlt(0,j,width,1,&memdc,0,i,SRCCOPY);
Sleep(10);
}
}
}
// TODO: add draw code for native data here
}
其它實現細節請參見源代碼。