MFC 繪製透明位圖的方法

1、GDI

    步驟1)創建內存兼容DC

        HDC hBitmapDC = CreateCompatibleDC(hDC);
        HBITMAP hBitmap = CreateCompatibleBitmap(hDC, rt.Width(), rt.Height());
        SelectObject(hBitmapDC,hBitmap);

    步驟2)在內存DC中繪圖

        FillRgn(hBitmapDC, (HRGN)rgn, (HBRUSH)m_pGdiBrush);

        Rectangle(hBitmapDC, 0, 0, 100, 100);
        ...

    步驟3) 半透明混合

        BLENDFUNCTION bf;
        bf.BlendOp = AC_SRC_OVER;
        bf.BlendFlags = 0;
        bf.AlphaFormat = 0;
        bf.SourceConstantAlpha = 50;
        AlphaBlend(hDC,rt.left,rt.top,rt.Width(),rt.Height(),hBitmapDC,0,0,rt.Width(),rt.Height(),bf); 

 

2、GDI+

    步驟1) 創建半透明畫刷

        m_pBrush = new SolidBrush(Color(128, GetRValue(clrMask), GetGValue(clrMask), GetBValue(clrMask))); // 透明度 128

    步驟2)使用畫刷繪圖

         Graphics graphics(hDC);
         graphics.FillPolygon(&m_pBrush, pts, 3, FillModeAlternate);

 

效率: GDI+  >  GDI。

使用GDI+繪圖簡單而高效,所以推薦使用GDI+。

 

 3、Direct Draw

    此方法比較複雜,沒有對Direct Draw有一定的瞭解,不推薦此方法。

    代碼比較多,不做列舉,需要注意的地方有:

使用Direct Draw時,注意,繪製半透明多邊形的時候,因爲牽涉到已有的圖像數據,所以會對繪圖頁面原有的圖像進行讀取操作。如果當前繪製頁面開闢在顯存中的時候,對顯存的讀操作會導致整個渲染流水線的暫停,從而嚴重影響程序的效率,此時,繪製半透明多邊形就會變得異常的慢。這時候需要將繪製頁面從顯存中更改至內存中。或者在內存中創建一個過度頁面,繪製完成後再往顯存頁面上貼圖。效率會有顯著提升,實測:提升30~40倍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章