首页 > MFC > Picture Control控件显示JPG图像API

Picture Control控件显示JPG图像API

2012年9月7日 发表评论 阅读评论

最近开始着手写一个麻将自动听牌分析器的程序(这里就不介绍了,等我写完了的话,会有详细介绍的。。)

然后遇到一个问题,就是要在MFC的基于对话框的Picture Control空间上显示指定路径的一张JPG图片。

但是呢,Picture控件主要支持的是Bitmap格式的,然后经过上网一阵查找,后来发现是要利用COM里面的一个IPicture的东西。

步骤就是先读取文件,然后。。。诶。。自己看下面的代码,我弄了详细的注释。。不懂Google。。

void CXxxxxDlg::DrawJPG( int nID,char* pic_path )
{
    if (!pic_path)
        return;

    CoInitialize(NULL); // COM 初始化

    CFile file;
    // 读入文件内容
    file.Open(pic_path,CFile::modeRead | CFile::shareDenyNone);
    //获取长度
    DWORD dwSize = DWORD(file.GetLength());
    //给图片分配全局内存
    HGLOBAL hMem = GlobalAlloc( GMEM_MOVEABLE, dwSize );
    //锁定内存
    LPVOID lpBuf = GlobalLock( hMem );
    //读取图片到全局内存当中
    file.Read( lpBuf, dwSize );
    //关闭文件
    file.Close();
    //解锁内存
    GlobalUnlock( hMem );

    //IStream接口指针,用来保存图片流
    IStream* pStream = NULL;
    //图片对象
    IPicture* pPicture = NULL;
    //由HGLOBAL得到IStream,参数TRUE表示释放IStream的同时,释放内存
    HRESULT hr;
    //用全局内存初使化IStream接口指针
    hr = CreateStreamOnHGlobal( hMem, TRUE, &pStream );//ASSERT ( SUCCEEDED(hr) );
    //得到IPicture COM接口对象
    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 );
    //转换MM_HIMETRIC到MM_TEXT像素单位
    CDC* pDC = GetDC();
    pDC->HIMETRICtoDP( &sz ); 

    CRect rect;
    GetDlgItem(nID)->GetWindowRect(&rect);
    GetDlgItem(nID)->GetParent()->ScreenToClient(rect);

    //控件大小变成图片大小
    //GetDlgItem(IDC_PIC1)->MoveWindow(rect.left,rect.top,sz.cx,sz.cy);

    //左上角那个点对齐
    //pPicture->Render(pDC->m_hDC,rect.left,rect.top,sz.cx,sz.cy,
    //    0,nHeight,nWidth,-nHeight,NULL);

    //图片缩放至空间大小
    pPicture->Render(pDC->m_hDC,rect.left,rect.top,rect.Width(),rect.Height(),
            0,nHeight,nWidth,-nHeight,NULL);

    if (pPicture)
        pPicture->Release();
    if (pStream)
        pStream->Release(); 

    CoUninitialize();
}

【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

分类: MFC 标签: , ,