typedef struct _VMRALPHABITMAP {
DWORD dwFlags; //指明从哪儿获取位图
HDC hdc; //指定的设备上下文DC。如果指定为NULL,则位图是从一个DirectDraw surface上获取。
LPDIRECTDRAWSURFACE7 pDDS; // 指向 DirectDraw surface的一个指针。如果指定为NULL则,位图是从GDI DC中获取。
RECT rSrc; //指明源矩形
NORMALIZEDRECT rDest; //指定目标矩形
FLOAT fAlpha; //指定alpha混合值,必须有一个在0.0到1.0之间的值(含) 。
COLORREF clrSrcKey; //指定需要取消图片的背景颜色
} VMRALPHABITMAP;typedef struct _VMRALPHABITMAP *PVMRALPHABITMAP;
dwFlags应为以下值
VMRBITMAP_DISABLE (0x00000001) | 现在不需要位图 |
VMRBITMAP_HDC (0x00000002) | 从HDC中获取位图 |
VMRBITMAP_ENTIREDDS (0x00000004) | 从整个DirectDraw surface获取位图.当这个被指定时, 指定rSrc没有用. |
VMRBITMAP_SRCCOLORKEY (0x00000008) | clrSrcKey 值可用,当在混合运算渲染位图时,这个值将被用到 |
VMRBITMAP_SRCRECT (0x00000010) |
HRESULT CVMRPlayMovive::BlendApplicationImage(HWND hwndApp) { LONG cx, cy; HRESULT hr; RECT rc={0}; hr = pWC->GetNativeVideoSize(&cx, &cy, NULL, NULL); if (FAILED(hr)) return hr; HINSTANCE hInstance = (HINSTANCE)GetWindowLong(m_hwnd,GWL_HINSTANCE); HBITMAP hbm = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP3)); //加载位图 BITMAP bm; HBITMAP hbmOld; HDC hdc = GetDC(hwndApp); HDC hdcBmp = CreateCompatibleDC(hdc); ReleaseDC(hwndApp, hdc); GetObject(hbm, sizeof(bm), &bm); hbmOld = (HBITMAP)SelectObject(hdcBmp, hbm); VMRALPHABITMAP bmpInfo; ZeroMemory(&bmpInfo, sizeof(bmpInfo) ); bmpInfo.dwFlags = VMRBITMAP_HDC; bmpInfo.hdc = hdcBmp; g_nBitmapWidth = bm.bmWidth; g_nImageWidth = bm.bmWidth / NUM_IMAGES_IN_BITMAP; SetRect(&rc,0,0,g_nBitmapWidth, bm.bmHeight); bmpInfo.rSrc = rc; // rDest specifies the destination rectangle in composition space (0.0f to 1.0f) bmpInfo.rDest.left = (float)(cx - g_nImageWidth) / (float)cx - EDGE_BUFFER; bmpInfo.rDest.top = (float)(cy - bm.bmHeight) / (float)cy - EDGE_BUFFER; bmpInfo.rDest.right = 1.0f - EDGE_BUFFER; bmpInfo.rDest.bottom = 1.0f - EDGE_BUFFER; g_rDest = bmpInfo.rDest; g_rSrc = bmpInfo.rSrc; g_fBitmapCompWidth = (float)g_nImageWidth / (float)cx; bmpInfo.fAlpha = 0.0; SetColorRef(bmpInfo); hr = pBMP->SetAlphaBitmap(&bmpInfo); if (FAILED(hr)) Msg(TEXT("SetAlphaBitmap FAILED! Bitmap operations will fail. hr=0x%x\r\n"), hr); // Clean up GDI resources DeleteObject(SelectObject(hdcBmp, hbmOld)); DeleteObject(hbm); DeleteDC(hdcBmp); // If setting the alpha bitmap succeeded, update its parameters if (SUCCEEDED(hr)) { SetRect(&rc, 0, 0, g_nImageWidth, bm.bmHeight); bmpInfo.rSrc = rc; g_rSrcSingle = rc; bmpInfo.dwFlags = VMRBITMAP_SRCRECT | VMRBITMAP_SRCCOLORKEY; bmpInfo.fAlpha = TRANSPARENCY_VALUE; hr = pBMP->UpdateAlphaBitmapParameters(&bmpInfo); if (FAILED(hr)) Msg(TEXT("UpdateAlphaBitmapParameters FAILED! hr=0x%x\r\n"), hr); } return hr; } void CVMRPlayMovive::SetColorRef(VMRALPHABITMAP& bmpInfo) { bmpInfo.clrSrcKey = RGB(255, 0, 0); bmpInfo.dwFlags |= VMRBITMAP_SRCCOLORKEY; }