我們經常在AboutBox中顯示一幅關於公司或自己訊息的位圖,有沒有想過讓這幅位圖有更酷的效果?比如加上淡入淡出效果?只要有了這個CAlphaCtrl控件就可以輕松實現。
CAlphaCtrl是從CStatic繼承而來。使用時只要把CalphaCtrl加入窗體,然後調用LoadAlphaBitmap(UINT uID, int iTimer)函數就可以實現位圖的淡入淡出。其中uID是位圖的資源ID,iTimer是位圖顯示時間間隔,值愈小顯示愈快。
下面就來說一說CalphaCtrl是如何實現的。關鍵的一個實現函數是一個win32 API: AlphaBlend,此函數可以實現圖像的透明顯示,相關的參數和資料請自行參閱MSDN,值得注意的是使用此函數時要鏈接到msimg32.lib庫。
第一步,我們先在CalphaCtrl類中增加幾個Data Member:CBitmap Bmp;
BOOL bCanPaint; UINT nBmpID; int nTimer;
第二步,在CalphaCtrl類中增加一個Member Function:
void AlphaDisplay(CDC &pDC, CClientDC &dc, BLENDFUNCTION& rBlendProps, int width, int heigh, byte nLevel)
{
//nLevel是透明度,0表示不顯示,255則完全顯示
rBlendProps.SourceConstantAlpha = nLevel;
AlphaBlend( dc.m_hDC, 0, 0, width, heigh, pDC.m_hDC, 0, 0,
width, heigh, rBlendProps );
}
第三步,增加一個名為tdDisplay的全局函數,此函數為一個線程函數,用於位圖的顯示。
UINT tdDisplay(LPVOID lpParam)
{
CAlphaCtrl* AlphaCtrl = (CAlphaCtrl*)lpParam; CClientDC dc(AlphaCtrl);
CDC pDC;
pDC.CreateCompatibleDC(&dc);
pDC.SelectObject(&AlphaCtrl->Bmp); BLENDFUNCTION rBlendProps;
rBlendProps.BlendOp = AC_SRC_OVER;
rBlendProps.BlendFlags = 0;
rBlendProps.AlphaFormat = 0; BITMAP bmInfo;
::GetObject( AlphaCtrl->Bmp.m_hObject, sizeof(BITMAP), &bmInfo );
INT nWidth, nHeigh;
nWidth = bmInfo.bmWidth;
nHeigh = bmInfo.bmHeight;AlphaCtrl->SetWindowPos(NULL, 0, 0, nWidth, nHeigh, SWP_NOMOVE);
int i = 0;
while(i <= 255)
{
AlphaCtrl->AlphaDisplay(pDC, dc, rBlendProps, nWidth, nHeigh, i);
i += 5;
Sleep(AlphaCtrl->nTimer);
}
AlphaCtrl->bCanPaint = 1; //Make OnPaint Word
AfxEndThread(0);
return 0;
}
第四步,現在萬事俱備,加上初始化函數:
BOOL LoadAlphaBitmap(UINT uID, int iTimer)
{
int i = Bmp.LoadBitmap(uID);
if(i)
{
AfxBeginThread(tdDisplay, this);
nBmpID = uID;
nTimer = iTimer;
return 1;
}
else
{
TRACE("Load Bitmap Failed\n");
return 0;
}
return 1;
}
最後,執行程序,打開你的對話框看一看那幅很酷的位圖!