实现MFC打开JPEG图像的源代码

 void CMyBMPView::OnDraw(CDC* pDC)

{
CMyBMPDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
/*
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
// CBitmap Bitmap;
HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, pDoc->m_PicPath,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
CBitmap Bitmap;
Bitmap.Attach(hBitmap);
// Bitmap.LoadBitmap(IDB_MYBITMAP);
CBitmap *pOldBitmap = MemDC.SelectObject(&Bitmap);
BITMAP bm;
Bitmap.GetObject(sizeof(BITMAP),&bm);
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
*/
::CoInitialize(NULL);  // COM 初始化
    HRESULT hr;
    CFile file;
    
    file.Open( pDoc->m_PicPath, CFile::modeRead | CFile::shareDenyNone );  // 读入文件内容
    DWORD dwSize = file.GetLength();
    HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
    LPVOID lpBuf = ::GlobalLock( hMem );
    file.ReadHuge( lpBuf, dwSize );
    file.Close();
    ::GlobalUnlock( hMem );
    IStream * pStream = NULL;
    IPicture * pPicture = NULL;
    
    // 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
    hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream );
    ASSERT ( SUCCEEDED(hr) );
    
    hr = ::OleLoadPicture( pStream, dwSize, TRUE, IID_IPicture, ( LPVOID * )&pPicture );
    ASSERT(hr==S_OK);
    
    long nWidth,nHeight;  // 宽高,MM_HIMETRIC 模式,单位是0.01毫米
    pPicture->get_Width( &nWidth );    // 宽
    pPicture->get_Height( &nHeight );  // 高
    
    原大显示//
    CSize sz( nWidth, nHeight );
    pDC->HIMETRICtoDP( &sz );  // 转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
    pPicture->Render(pDC->m_hDC,0,0,sz.cx,sz.cy,
        0,nHeight,nWidth,-nHeight,NULL);
        
    按窗口尺寸显示
//    CRect rect;    GetClientRect(&rect);
//    pPicture->Render(pDC->m_hDC,0,0,rect.Width(),rect.Height(),
//        0,nHeight,nWidth,-nHeight,NULL);
    if ( pPicture ) pPicture->Release();// 释放 IPicture 指针
    if ( pStream ) pStream->Release();  // 释放 IStream 指针,同时释放了 hMem
    
    ::CoUninitialize();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值