根据位图数据怎么构造位图句柄呢?

everbeing 2010-07-16 09:10:56
我有两段数据
LPBITMAPINFOHEADER lpBMIH;
LPBYTE lpImage;
我得到了lpBMIH 和 lpImage的数据,但怎么根据这个来重新构造一个位图句柄呢?
我用
//构造位图句柄
HBITMAP hBitmap=CreateBitmap(lpBMIH->biWidth,lpBMIH->biHeight,lpBMIH->biPlanes,lpBMIH->biClrUsed,lpImage);
CDC* pDC=GetDC();
CDC dc;
BITMAP bmp;
dc.CreateCompatibleDC(pDC); //构建兼容DC
dc.SelectObject(hBitmap); //选入位图
GetObject(hBitmap,sizeof(BITMAP),&bmp); //得到位图信息
pDC->StretchBlt(m_rtClt.left,m_rtClt.top,m_rtClt.Width(),m-rtClt.Height(),&dc,0,0,bmp.bmWidth,bmp.bmHeight);
//绘图(注:m_rtClt是一个CRect指定的客户去)

可是这样以后一点效果也么有,好像什么也没发生一样
哪个数据 我用::StrechDIBits()绘制显示了,所以数据是正确的
...全文
75 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-07-16
  • 打赏
  • 举报
回复
The CreateDIBitmap function creates a compatible bitmap (DDB) from a DIB and, optionally, sets the bitmap bits.

HBITMAP CreateDIBitmap(
HDC hdc, // handle to DC
CONST BITMAPINFOHEADER *lpbmih, // bitmap data
DWORD fdwInit, // initialization option
CONST VOID *lpbInit, // initialization data
CONST BITMAPINFO *lpbmi, // color-format data
UINT fuUsage // color-data usage
);
hastings 2010-07-16
  • 打赏
  • 举报
回复
我好像回答得文不对题~~~~
hBitmap = CreateDIBitmap (hdc,lpBMIH,CBM_INIT,lpImage,(BITMAPINFO *)lpBMIH,DIB_RGB_COLORS) ;
hastings 2010-07-16
  • 打赏
  • 举报
回复
typedef struct tagBITMAPINFO              // bmi

{

BITMAPINFOHEADER bmiHeader ; // info-header structure

RGBQUAD bmiColors[1] ; // color table array

}

BITMAPINFO, * PBITMAPINFO ;

BITMAPINFOHEADER的地址就是BITMAPINFO的地址..
hastings 2010-07-16
  • 打赏
  • 举报
回复

#define SHOW_NORMAL 1
#define SHOW_CENTER 2
#define SHOW_STRETCH 3
#define SHOW_ISOSTRETCH 4
int ShowDib (HDC hdc, BITMAPINFO * pbmi, BYTE * pBits, int cxClient, int cyClient, int wShow)
{
if(NULL==hdc || NULL==pbmi || NULL==pBits || wShow<SHOW_NORMAL || wShow>SHOW_ISOSTRETCH)
return 0;
int cxDib, cyDib ;
int BltMode, ret ;
if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER))
{
cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;
}
else
{
cxDib = pbmi->bmiHeader.biWidth ;
cyDib = abs (pbmi->bmiHeader.biHeight) ;
}
switch (wShow)
{
case SHOW_NORMAL:
return SetDIBitsToDevice (hdc, 0, 0, cxDib, cyDib, 0, 0,
0, cyDib, pBits, pbmi, DIB_RGB_COLORS) ;

case SHOW_CENTER:
return SetDIBitsToDevice (hdc, (cxClient - cxDib) / 2,(cyClient - cyDib) / 2,
cxDib, cyDib, 0, 0, 0, cyDib, pBits, pbmi, DIB_RGB_COLORS) ;

case SHOW_STRETCH:
BltMode=SetStretchBltMode (hdc, COLORONCOLOR) ;
ret=StretchDIBits (hdc, 0, 0, cxClient, cyClient,
0, 0, cxDib, cyDib,
pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
SetStretchBltMode (hdc, BltMode) ;
return ret;

case SHOW_ISOSTRETCH:
BltMode=SetStretchBltMode (hdc, COLORONCOLOR) ;
if(cxDib*cyClient > cyDib*cxClient)//图更宽
ret=StretchDIBits (hdc,0,
(cyClient-(int)((float)cyDib/(float)cxDib*(float)cxClient))/2,
cxClient, (int)((float)cyDib/(float)cxDib*(float)cxClient) ,
0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
else
ret=StretchDIBits (hdc,
(cxClient-(int)((float)cxDib/(float)cyDib*(float)cyClient))/2, 0,
(int)((float)cxDib/(float)cyDib*(float)cyClient), cyClient,
0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
SetStretchBltMode (hdc, BltMode) ;
return ret;
}
return 0 ;
}
ShowDib (hdc, (BITMAPINFO *)lpBMIH, lpImage, m_rtClt.Width(), m_rtClt.Height(), SHOW_NORMAL)

everbeing 2010-07-16
  • 打赏
  • 举报
回复
呵呵 揭帖了用CreateDIBitmap

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧