rainbowzc

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
用VB的picture控件显示BMP、JPG、GIF很方便,但是在VC、MFC下却不能直接显示,于是我参考网上的例子写了一个图片显示函数,希望能方便大家的使用。
    Windows提供了一个显示BMP、JPG、GIF的标准方法,你只需要实例化IPicture以及它的调用就可以,通过OleLoadPicture函数函数从流中读取图片并创建该图片的IPicture对象:
  OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
它在MSDN里的定义如下:
STDAPI OleLoadPicture(
  IStream * pStream,
               //Pointer to the stream that contains picture's data
  LONG lSize,  //Number of bytes read from the stream
  BOOL fRunmode,
               //The opposite of the initial value of the picture's
               // property
  REFIID riid, //Reference to the identifier of the interface
               // describing the type of interface pointer to return
  VOID ppvObj  //Address of output variable that receives interface
               // pointer requested in riid
);

以下是显示我在对话框CNewFormDlg中的一个图像显示函数DisplayPic,使用它可以在一个控件上显示一幅图片,该函数可以显示BMP、JPG和GIF文件,参数如下:
char *lpImageFile 图像文件名
HWND hWnd  要显视对象句柄
int nScrWidth  显示宽度
int nScrHeight  显示高度

HRESULT CNewFormDlg::DisplayPic(char *lpImageFile, HWND hWnd, int nScrWidth, int nScrHeight)
{
    HDC hDC_Temp=::GetDC(hWnd);

    IPicture *pPic;
    IStream *pStm;

    BOOL bResult;

    HANDLE hFile=NULL;
    DWORD dwFileSize,dwByteRead;

    //打开硬盘中的图形文件
    hFile=CreateFile(lpstrFile,GENERIC_READ,
    FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

    if (hFile!=INVALID_HANDLE_VALUE)
    {
        dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数

        if (dwFileSize==0xFFFFFFFF)
            return E_FAIL;
    }
    else
    {
        return E_FAIL;
    }

    //分配全局存储空间
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    LPVOID pvData = NULL;

    if (hGlobal == NULL)
    {
        AfxMessageBox("图形文件分配出错.");
        return E_FAIL;
    }

    if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
    {
        AfxMessageBox("内存块锁定出问题");
        return E_FAIL;
    }

    ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区

    GlobalUnlock(hGlobal);

    if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStm) != S_OK)
    {
        AfxMessageBox("流初始化失败");
        return E_FAIL;
    }

    //装入图形文件
    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);

    if(FAILED(bResult))
    {
        AfxMessageBox("图形文件装载出错.");
        return E_FAIL;
    }

    OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
    OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
    pPic->get_Width(&hmWidth);
    pPic->get_Height(&hmHeight);

    //将图形输出到屏幕上
    bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
    0,hmHeight,hmWidth,-hmHeight,NULL);

    CloseHandle(hFile);//关闭打开的文件
   
    pPic->Release();
    // Free memory.
    GlobalFree(hGlobal);

    if (SUCCEEDED(bResult))
    {
        return S_OK;
    }
    else
    {
        AfxMessageBox("图形文件装载出错.");
        return E_FAIL;
    }
}
调用如下:
void CNewFormDlg::OnButton2()
{
 HWND m_hWnd;
 GetDlgItem(IDC_STATIC_VIEW,&m_hWnd);
 DisplayPic("F://图片//水晶//Crystal521.jpg",m_hWnd,500,500);
}

 
posted on 2006-06-29 15:51  ct  阅读(341)  评论(0编辑  收藏  举报