Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 397, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

VC位图的特效

位图的显示,大家都比较熟悉,网上介绍的也比较多。通过位图加载时的某些参数的变化,可以达到一些特效效果,如雨滴、百叶窗效果等。
其实现途径主要是利用双缓冲加载位图和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(00, 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, 00, SRCCOPY);

m_nLeftPos 
+= 5;//步长
if(m_nLeftPos >= Bimp_width)
{
    m_nLeftPos 
= 0;
}
else
{
    SetTimer(Event_Image, 
40NULL);
}
delete pDC;

posted on 2008-04-18 15:25 Benjamin 阅读(1011) 评论(0)  编辑 收藏 引用 所属分类: VC


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理