zoukankan      html  css  js  c++  java
  • VC 中BMP、JPG、GIF图像的显示

    用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);
    }

     
  • 相关阅读:
    解决调用未定义 swoole_async_readfile函数问题
    7000字 Redis 超详细总结笔记总 | 收藏必备!
    C/C++语言编程修养
    glib 队列
    sprintf 详解
    json 需替换 特殊字符串
    glib 关系
    glib 简介
    gprof 代码效率测量
    glib 树
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/2422348.html
Copyright © 2011-2022 走看看