1、有關IPicture加載圖片後直接Render到內存DC的問題(HBITMAP轉換IPicture)
Picture的方法get_Handle可以直接得到圖片的句柄
IPicture *pIPicture;
HBITMAP hBitmap;
...
pIPicture->get_Handle((OLE_HANDLE *)&hBitmap);
2、CBitmap 轉換 HBITMAP
CBitmap m_bitMap;
HBITMAP m_hBitMap;
m_bitMap.LoadBitmap(IDB_BITMAP);
m_hBitMap=(HBITMAP)m_bitMap.GetSafeHandle();
3、HBITMAP轉換 CBitmap
CBitmap cbMMyBitmap;//用來顯示動畫的位圖
HBITMAP hMMyHBitmap;//用來顯示動畫的位圖的句柄
BITMAP bMMyBitmapInfo;//位圖信息
cbMMyBitmap.Attach(hMMyHBitmap);
cbMMyBitmap.GetBitmap(&bMMyBitmapInfo);
4、DrawDibDraw和AlphaBlend
一:這兩個函數都是繪制 DIB 的。
我在使用過程中發現這兩個函數對於 32 位的位圖,Alpha通道不能正確顯示。就是說,該透明的地方不透明。
說明一下,位圖沒有問題的,用看圖軟件或PS之類的都可以正確顯示。
我想問一下,是我的原因還是這兩個函數本來就不支持32位位圖?
ps.顯示32位位圖可以用AlphaBlend實現的,但是這個函數是繪制場景裡的 DDB 的。由於我想顯示的是 DIB,不想轉來轉去的,所以這個函數先不考慮。
二:StretchDIBits 或 DrawDibDraw 就沒法顯示帶透明屬性的圖片
要顯示帶透明屬性的圖片只能用別的方法 例如 GDI+
5、
回答(1)
CBitmap::GetBitmap
回答人:軟界網友
回答(2)
每個成員變量都賦值。
回答人:軟界網友
回答(3)
CBitmap::GetBitmap是把CBitmap的信息賦給BITMAP結構
我問的是BITMAP賦給CBitmap
回答人:軟界網友
回答(4)
創建CBitmap對象時,采用BITMAP指定信息
回答人:軟界網友
回答(5)
是用構造函數嗎?
CBitmap::CBitmap(BITMAP bitmap)好像沒有這個構造函數
回答人:軟界網友
回答(6)
CBitmap::FromHandle(HBITMAP hBitmap )
回答(7)
HBITMAP CreateBitmapIndirect(
CONST BITMAP *lpbm // bitmap data
);
6、用GDI實現位圖透明顯示
下面是實現中幾個關鍵的地方:
[cpp]
//////////////////////////////////////////////////////////////////////////
////把位圖bmpFile的特定矩形區域rtWant上的所有像素的數據讀取到緩沖區pBuf中
int CChildView::GetPixFromBmp(CString fileName,CRect rtWant,BYTE *pBuf)
{
BITMAPINFOHEADER headInfo;
ZeroMemory(&headInfo,sizeof(headInfo));
int imageHeight;
int imageWidth;
CFile file;
file.Open(fileName, CFile::modeRead);
file.Seek(14, CFile::begin);
file.Read(&headInfo, 40); ///-- 從文件中讀去位圖的BITMAPINFOHEADER信息
imageWidth = headInfo.biWidth;
imageHeight = headInfo.biHeight;
if(headInfo.biBitCount!=32)
{
MessageBox(fileName+"不是32位位圖");
}
for(int i=0;i<rtWant.Height();i++)
{
file.Seek(54+(imageHeight- rtWant.bottom+i)*imageWidth*headInfo.biBitCount/8+rtWant.left*headInfo.biBitCount/8,CFile::begin);
file.Read(pBuf+i*rtWant.Width()*headInfo.biBitCount/8,rtWant.Width()*headInfo.biBitCount/8);
}
file.Close();
return 0;
}
//////////////////////////////////////////////////////////////////////////
//// pDesBuf:目的表面緩沖區,W,H--目的表面的寬和高
//// pSrcBuf: 源表面緩沖區
//// pRetBuf:結果保存到這個緩沖區中,與pDesBuf兼容
//// rtBlend:源表面緩沖區與目的表面緩沖區進行alpha混合的矩形區域
//// alpha : 需要透明的百分比,0---完全透明,1 -- 完全不透明
void CChildView::MyBlend(BYTE* pDesBuf,BYTE* pSrcBuf,BYTE* pRetBuf,CRect rtBlend,int W,int H,float alpha)
{
memcpy(pRetBuf,pDesBuf,W*H*4);
for(int i=0;i<rtBlend.Height();i++)
{
for(int j=0;j<rtBlend.Width();j++)
{
long posDesPix = ((H-rtBlend.bottom+i)*W+rtBlend.left+j)*4;
long posSrcPix = (i*rtBlend.Width()+j)*4;
pRetBuf[posDesPix+0] = BYTE(pDesBuf[posDesPix+0]*(1-alpha) + pSrcBuf[posSrcPix+0]*(alpha));
pRetBuf[posDesPix+1] = BYTE(pDesBuf[posDesPix+1]*(1-alpha) + pSrcBuf[posSrcPix+1]*(alpha));
pRetBuf[posDesPix+2] = BYTE(pDesBuf[posDesPix+2]*(1-alpha) + pSrcBuf[posSrcPix+2]*(alpha));
pRetBuf[posDesPix+3] = BYTE(pDesBuf[posDesPix+3]*(1-alpha) + pSrcBuf[posSrcPix+3]*(alpha));
}
}
}
{
///-- 設置位圖的BITMAPINFOHEADER信息
ZeroMemory(&m_headInfo,sizeof(m_headInfo));
m_headInfo.biSize = sizeof(m_headInfo);
m_headInfo.biPlanes = 1;
m_headInfo.biBitCount = 32; // 24
m_headInfo.biCompression = BI_RGB;
m_headInfo.biWidth = m_rtShow.Width();
m_headInfo.biHeight = m_rtShow.Height();
m_headInfo.biSizeImage = m_nLen;
}
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
StretchDIBits(m_MemDC.GetSafeHdc(),0,0,m_rtShow.Width(),m_rtShow.Height(),
0,0,m_rtShow.Width(),m_rtShow.Height(),(void*)m_pCurrBuf,(BITMAPINFO*)&m_headInfo,NULL,SRCCOPY);
dc.BitBlt(m_rtShow.left,m_rtShow.top,m_rtShow.Width(),m_rtShow.Height(),
&m_MemDC,0,0,SRCCOPY);
}