图形显示特技算法


作者 浙江大学 王向伟


下载源代码


   
水平百叶窗:将图象分成若干等份,每次扫描各等份的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

}   

其它实现细节请参见源代码。