导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

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

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()绘制显示了,所以数据是正确的
...全文
46 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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