VC位图的特效

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( 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;

你可能感兴趣的:(VC位图的特效)