程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 位圖的淡入淡出顯示

位圖的淡入淡出顯示

編輯:關於VC++

我們經常在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;
    }

最後,執行程序,打開你的對話框看一看那幅很酷的位圖!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved