打印预览中用StretchDIBits显示bmp图像但显示速度非常慢(用的是MM_TWIPS映射模式),显示一幅大约3 * 6 cm的图片耗时差不多要一秒多,但在其他地方用同样的函数显示却非常快。不只是何原因,还望高手指点!

解决方案 »

  1.   

    用 GDIplus 吧,又快又簡單。
      

  2.   

    #define HIMETRIC_INCH 2540
    LPPICTURE gpPicture;
    void ShowPicture(CDC* pDC,CString m_strBRoute,int x,int y,int width,int height)
    {
    HANDLE hFile = CreateFile(m_strBRoute, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    _ASSERTE(INVALID_HANDLE_VALUE != hFile); // 取得文件大小
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    _ASSERTE(-1 != dwFileSize);
    LPVOID pvData = NULL;
    //根据文件大小分配内存
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    _ASSERTE(NULL != hGlobal);
    pvData = GlobalLock(hGlobal);
    _ASSERTE(NULL != pvData);
    DWORD dwBytesRead = 0;
    //读取文件并存入全局内存
    BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
    _ASSERTE(FALSE != bRead);
    GlobalUnlock(hGlobal);
    CloseHandle(hFile);
    LPSTREAM pstm = NULL;
    // 通过全局内存创建 IStream* 的指针
    HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
    _ASSERTE(SUCCEEDED(hr) && pstm);
    //通过图形文件创建IPicture 对象
    if (gpPicture)
    gpPicture->Release();
    hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
    _ASSERTE(SUCCEEDED(hr) && gpPicture);
    pstm->Release();
    HDC hdc;
    hdc=pDC->GetSafeHdc();
    if (gpPicture)
    {
    // 取得图片的宽和高
    long hmWidth;
    long hmHeight;
    gpPicture->get_Width(&hmWidth);
    gpPicture->get_Height(&hmHeight);
    //宽高转换为象素
    int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
    int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);
    RECT rc;
    GetClientRect(&rc);/*取得客户区*/
    gpPicture->Render(hdc, x,y, (int)height*hmWidth/hmHeight,height, 0, hmHeight, hmWidth, -hmHeight, &rc);
    /*显示图片*/
    }}