您的位置:首页 > 其它

对话框显示图像的简单方法

2015-09-21 17:02 423 查看
1、获取图像的内存数据

2、调用BufferToHBITMAP()函数,将图像数据转为HBITMAP

3、在OnDraw里面,利用双缓冲,贴图像数据

详细说明:

1、利用FILE来打开图像文件,利用下面函数获取文件大小。再用fread,将图像文件读取到内存中。

long Getlength( FILE *fp )
{
long cur_pos;
long len;

//取得当前文件流的读取位置
cur_pos = ftell( fp );
//将文件流的读取位置设为文件末尾
fseek( fp, 0, SEEK_END );
//获取文件末尾的读取位置,即文件大小
len = ftell( fp );
//将文件流的读取位置还原为原先的值
fseek( fp, cur_pos, SEEK_SET );

return len;
}


2、
HBITMAP BufferToHBITMAP(char* pBMPBuffer,int& nbmW,int& nbmH,CWnd* pWnd)

{

HBITMAP   hShowBMP;

LPSTR     hDIB,lpBuffer = pBMPBuffer;

LPVOID    lpDIBBits;

BITMAPFILEHEADER     bmfHeader;

DWORD                bmfHeaderLen;

bmfHeaderLen = sizeof(bmfHeader);

strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);

if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;

hDIB = lpBuffer + bmfHeaderLen;

BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;

BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;

nbmW = bmiHeader.biWidth;

nbmH = bmiHeader.biHeight;

lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;

CClientDC dc(pWnd);

hShowBMP = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,

&bmInfo,DIB_RGB_COLORS);

return hShowBMP;

}


3、OnDraw函数里面的实现:

if (NULL == m_pBMPBuffer)
{
return;
}

if (NULL == m_hBitmap)
{
m_hBitmap = BufferToHBITMAP(m_pBMPBuffer,m_nbmW,m_nbmH,this);
}

HBITMAP OldBitmap;
CDC MemDC;

MemDC.CreateCompatibleDC(pDC);
OldBitmap=(HBITMAP)MemDC.SelectObject(m_hBitmap);
CBitmap* pBitmap = CBitmap::FromHandle(m_hBitmap);

if(m_nbmW == 0 || m_nbmH == 0)
{
return;
}

CRect rect;
GetClientRect(&rect);

::SetStretchBltMode (pDC->m_hDC, HALFTONE);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,m_nbmW,m_nbmH,SRCCOPY);
MemDC.SelectObject(OldBitmap);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对话框 图像显示