|
位图的显示,大家都比较熟悉,网上介绍的也比较多。通过位图加载时的某些参数的变化,可以达到一些特效效果,如雨滴、百叶窗效果等。 其实现途径主要是利用双缓冲加载位图和BitBlt这个函数参数的变化,这个方法在EVC和VC的各个平台都可以应用,具有通用性。 下面是代码演示,注意这段代码可以单独封装起来。
CDC memdc; CBitmap m_bitmap; int width; // 位图的宽度 int height; //位图的高度
//得到位图 m_bitmap.LoadBitmap(IDB_BITMAP2);
//获得绘图环境资源 CDC *pDC = new CClientDC(this); if(!memdc.GetSafeHdc()) { memdc.CreateCompatibleDC(pDC); memdc.SelectObject(&m_bitmap); } //获取位图大小信息 BITMAP bm; m_bitmap.GetBitmap(&bm); width=bm.bmWidth; height=bm.bmHeight;
pDC->Rectangle(0,0,width,height);
//水平向左扫描 for(int i=0;i<width;i++) { pDC->BitBlt(i,0,1,height,&memdc,i,0,SRCCOPY); Sleep(1); }
//水平向右扫描 for(int i=width-1;i>=0;i--) { pDC->BitBlt(i,0,1,height,&memdc,i,0,SRCCOPY); Sleep(1); }
//水平百叶窗 //每条20象素宽 int num=width/20; for(int i=0;i<20;i++) { //分别扫描每条 for(int j=0;j<num+1;j++) { pDC->BitBlt(j*20+i,0,1,height,&memdc,j*20+i,0,SRCCOPY); Sleep(1); } Sleep(1); }
//垂直百叶窗 int num=height/20; for(int i=0;i<20;i++) { //分别扫描每条 for(int j=0;j<num+1;j++) { pDC->BitBlt(0,j*20+i,width,1,&memdc,0,j*20+i,SRCCOPY); Sleep(1); } Sleep(1); }
//雨滴效果 { 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(1); } Sleep(1); }
m_bitmap.DeleteObject(); memdc.DeleteDC(); delete pDC;
如果要实现从右向左的挤压特殊效果,必须要用定时器来实现。下面是定时器中的具体实现代码 Bimp_width是位图的宽,Bimp_high是位图的高。m_memdc是位图资源设备,在位图加载时获取,可参照第一部分的代码。
CDC *pDC = new CClientDC(this);
pDC->BitBlt(0, 0, Bimp_width - m_nLeftPos, Bimp_high, &m_memdc, m_nLeftPos, 0, SRCCOPY); pDC->BitBlt(Bimp_width - m_nLeftPos, 0, m_nLeftPos, Bimp_high, &m_memdc, 0, 0, SRCCOPY);
m_nLeftPos += 5;//步长 if(m_nLeftPos >= Bimp_width) { m_nLeftPos = 0; } else { SetTimer(Event_Image, 40, NULL); } delete pDC;
|