我想请问如何在picture控件中载入一幅jpg格式的图片,另外如何让图片缩小到picture的显示大小.最好能给出一个代码,谢谢了.

解决方案 »

  1.   

    用StretchBlt函数,能够自动缩放
    将你要显示的图片缩小到,你的picture控件中
      

  2.   

    StretchBlt函数能给出一个代码吗??
      

  3.   

    m_picHDesDC = pDC->m_hDC;
    m_picHSrcDC = CreateCompatibleDC(m_picHDesDC);
    m_picHBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), 
    m_picAndVideoFilePath[i], //图片路径
    IMAGE_BITMAP, 
    0, 
    0, 
    LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    GetObject(m_picHBitmap, sizeof BITMAP, &m_picBmp);
    SelectObject(m_picHSrcDC, m_picHBitmap);

    rctt = getPictureRect(m_iPicAndVideoStart[i], m_iPicAndVideoWidth[i]);  //自己写的函数,获取要显示图片的矩形,当然可以用GetClientRect(控件ID)获得
    m_picAndVideoRect.push_back(rctt);
    pDC->FillSolidRect(&rctt, RGB(255, 255, 255));
    if (m_picAndVideoActive[i])
    {
    pDC->SelectObject(&m_pictureActivePen);
    pDC->MoveTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].top);
    pDC->LineTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].bottom);
    pDC->MoveTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].bottom);
    pDC->LineTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].bottom);
    pDC->MoveTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].bottom);
    pDC->LineTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].top);
    pDC->MoveTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].top);
    pDC->LineTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].top);
    }
    else
    {
    pDC->SelectObject(&m_picNotActiveBrush);
    pDC->FrameRect(&rctt, &m_picNotActiveBrush);
    }                   //有关图片信息
    int p_hight = rctt.Height();           
    int bmp_width = m_picBmp.bmWidth;
    int bmp_hight = m_picBmp.bmHeight;
    double proportion = bmp_width / bmp_hight;
    double temp = p_hight * proportion;


    ::SetStretchBltMode(m_picHDesDC,STRETCH_HALFTONE); 
    if (int(temp) <= rctt.Width())
    ::StretchBlt(m_picHDesDC, rctt.left + 1, rctt.top + 1, int(temp), rctt.Height() - 2,  m_picHSrcDC, 0, 0, m_picBmp.bmWidth, m_picBmp.bmHeight, +SRCCOPY);
    else 
    ::StretchBlt(m_picHDesDC, rctt.left + 1, rctt.top + 1, rctt.Width(),  rctt.Height() - 2, m_picHSrcDC, 0, 0, m_picBmp.bmWidth, m_picBmp.bmHeight, +SRCCOPY);
    ::DeleteObject(m_picHBitmap);
    }

    ::DeleteObject(m_picHSrcDC);
      

  4.   

    而把Jpg格式转化成bmp格式的函数如下:
    HBITMAP   CMyClass::ImageLoad(LPCTSTR   szFile,   HBITMAP   hRet)   
      {   
      LPPICTURE   gpPicture;   
      HANDLE   hFile   =   ::CreateFile(szFile,   GENERIC_READ,   0,   NULL,   OPEN_EXISTING,   0,   NULL);   
      ASSERT(INVALID_HANDLE_VALUE   !=   hFile);   
        
      DWORD   dwFileSize   =   ::GetFileSize(hFile,   NULL);   
      ASSERT(-1   !=   dwFileSize);   
        
      LPVOID   pvData   =   NULL;   
      HGLOBAL   hGlobal   =   ::GlobalAlloc(GMEM_MOVEABLE,   dwFileSize);   
      ASSERT(NULL   !=   hGlobal);   
        
      pvData   =   ::GlobalLock(hGlobal);   
      ASSERT(NULL   !=   pvData);   
        
      DWORD   dwBytesRead   =   0;   
      BOOL   bRead   =   ::ReadFile(hFile,   pvData,   dwFileSize,   &dwBytesRead,   NULL);   
      ASSERT(FALSE   !=   bRead);   
      ::GlobalUnlock(hGlobal);   
      ::CloseHandle(hFile);   
        
      LPSTREAM   pstm   =   NULL;   
      HRESULT   hr   =   ::CreateStreamOnHGlobal(hGlobal,   TRUE,   &pstm);   
      ASSERT(SUCCEEDED(hr)   &&   pstm);   
        
      hr=::OleLoadPicture(pstm,   dwFileSize,   FALSE,   IID_IPicture,   (LPVOID   *)&gpPicture);   
      ASSERT(SUCCEEDED(hr)   &&   gpPicture);   
      pstm->Release();   
        
      OLE_HANDLE   picHandle;   
      gpPicture->get_Handle(&picHandle);   
      HDC   hdc   =   ::CreateCompatibleDC(NULL);   
      ASSERT(hdc);   
      ::SelectObject(hdc,   (HGDIOBJ)   picHandle);   
        
      hRet   =   (HBITMAP)::GetCurrentObject(hdc,   OBJ_BITMAP);   
      DeleteDC(hdc);   
        
      return   hRet;   
      }   
    只要用该函数替代上文的LoadIamge即可,该函数的第一个参数是文件路径