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

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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值