C技巧(使用內(nèi)存DC加載并顯示JPG圖片)

字號:

在VC6中顯示JPG圖片,采用了內(nèi)存DC緩存的方法刷新,但死活刷不出來,查了一下午才明白(沒辦法,很少用GDI,使用IPicture::Render函數(shù)向DC上貼圖時,若DC是一個內(nèi)存DC,一定要先SelectObject一個CBitmap,內(nèi)存DC沒有Bitmap是畫不出來的!
    另外,IPicture是COM庫,需要注意初始化COM,
    CMYApp::InitInstance() 里使用 CoInitialize(NULL);
    CMYApp::ExitInstance() 里使用 CoUninitialize();
    下面貼出顯示JPG圖片到DC的函數(shù),來自網(wǎng)上,考試大整理了下,還可顯示GIF圖片的第一禎圖片,這里未用到。
    /*************************************************
    Function : ShowJPG
    Description : 在DC上按圖片原始尺寸顯示JPG圖片
    Calls :
    Called By :
    Parameter : [CDC* pDC] --- DC
    : [CString strPath] --- 要顯示的圖片路徑,建議全路徑
    : [int x] --- DC上顯示的X位置
    : [int y] --- DC上顯示的Y位置
    : [bool OriginalSize] --- 是否按圖片原始尺寸顯示,false時將按DC大小縮放
    Return : bool --- 是否成功
    Author : Unknown
    Date : 2008-10-24
    Modify :
    *************************************************/
    bool ShowJPG(CDC* pDC,CString strPath, int x, int y, bool OriginalSize)
    {
    IStream *pStm;
    CFileStatus fstatus;
    CFile file;
    LONG cb;
    //打開文件并檢測文件的有效性
    if (file.Open(strPath, CFile::modeRead) &&
    file.GetStatus(strPath,fstatus) &
    ((cb = fstatus.m_size) != -1))
    {
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
    LPVOID pvData = NULL;
    if (hGlobal != NULL)
    {
    pvData = GlobalLock(hGlobal);
    if (pvData != NULL)
    {
    file.ReadHuge(pvData, cb);
    GlobalUnlock(hGlobal);
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
    }
    }
    }
    else
    {
    return false;
    }
    //打開文件結(jié)束
    //顯示JPEG圖片
    IPicture *pPic;
    //load image from file stream
    if(SUCCEEDED(OleLoadPicture(pStm, fstatus.m_size, TRUE,IID_IPicture, (LPVOID*)&pPic)))
    {
    if (OriginalSize) //圖片原始大小顯示
    {
    long nWidth = 0, nHeight = 0; // 寬高,MM_HIMETRIC 模式,單位是0.01毫米
    pPic->get_Width( &nWidth ); // 寬
    pPic->get_Height( &nHeight ); // 高
    CSize sz( nWidth, nHeight );
    pDC->HIMETRICtoDP( &sz ); // 轉(zhuǎn)換 MM_HIMETRIC 模式單位為 MM_TEXT 像素單位
    pPic->Render(pDC->m_hDC, 0, 0, sz.cx, sz.cy,
    0, nHeight, nWidth, -nHeight, NULL);
    }
    else
    {
    OLE_XSIZE_HIMETRIC hmWidth;
    OLE_YSIZE_HIMETRIC hmHeight;
    pPic->get_Width(&hmWidth);
    pPic->get_Height(&hmHeight);
    //get image height and width
    double fX,fY;
    fX = (double)pDC->GetDeviceCaps(HORZRES) * (double)hmWidth /
    ((double)pDC->GetDeviceCaps(HORZSIZE) * 100.0);
    fY = (double)pDC->GetDeviceCaps(VERTRES) * (double)hmHeight /
    ((double)pDC->GetDeviceCaps(VERTSIZE) * 100.0);
    //use render function display image
    //按圖片原始大小顯示
    if(FAILED(pPic->Render(*pDC,x,y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
    {
    pPic->Release();
    return false;
    }
    }
    if ( pStm ) pStm->Release(); // 釋放 IStream 指針
    if ( pPic ) pPic->Release(); // 釋放 IPicture 指針
    }
    else
    {
    return false;
    }
    return true;
    }