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倍。