|
位圖的顯示,大家都比較熟悉,網(wǎng)上介紹的也比較多。通過位圖加載時的某些參數(shù)的變化,可以達(dá)到一些特效效果,如雨滴、百葉窗效果等。 其實現(xiàn)途徑主要是利用雙緩沖加載位圖和BitBlt這個函數(shù)參數(shù)的變化,這個方法在EVC和VC的各個平臺都可以應(yīng)用,具有通用性。 下面是代碼演示,注意這段代碼可以單獨封裝起來。

CDC memdc;
CBitmap m_bitmap;
int width; // 位圖的寬度
int height; //位圖的高度

//得到位圖
m_bitmap.LoadBitmap(IDB_BITMAP2);

//獲得繪圖環(huán)境資源
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;
如果要實現(xiàn)從右向左的擠壓特殊效果,必須要用定時器來實現(xiàn)。下面是定時器中的具體實現(xiàn)代碼 Bimp_width是位圖的寬,Bimp_high是位圖的高。m_memdc是位圖資源設(shè)備,在位圖加載時獲取,可參照第一部分的代碼。
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;
|