百度,GOOGLE了半天,搜了好多代码,但都没尝试成功。吐了吐了,不研究了,赶时间,会的兄弟帮个忙,万分感谢。在VS2005中,新建了MFC项目,用对话框。在对话框中拖了个picture control出来。利用CString储存图片文件的路径,但这图片可能是JPG,GIF,PNG,BMP等各种图片。请麻烦给段代码,我要加在哪里,怎么做才能把图片显示在固定大小的picture control中,也就是说自动缩放。
我连显示都显示不出来,晕。假设
picture control的ID为:IDC_indexPhoto
储存路径的CString为:filename
对话框为:CpictureDlg我究竟应该在哪里加代码才能显示,而且自动缩放显示呢???麻烦详细点

解决方案 »

  1.   

    BOOL CXXDlg::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default

    /*

    CImage img; //JPG / JPEG / GIF / PNG 格式的图片
             HRESULT ret = img.Load(”c:\\1.jpg“); // filename 是要加载的文件名(包含路径) 
             HBITMAP bitmap = img.Detach();         CBitmap bmp = CBitmap::FromHandle(bitmap );

    CRect rect;
    GetClientRect(&rect);
    CDC dc;
    dc.CreateCompatibleDC(pDC);
    CBitmap* pOldBitmap = dc.SelectObject(&bmp );
    int bmw, bmh ;
    BITMAP bmap;
    m_bitmap.GetBitmap(&bmap);
    bmw = bmap.bmWidth;
    bmh = bmap.bmHeight;
    //StretchBlt进行缩放

    pDC->StretchBlt(0, 0, rect.Width(),
    rect.Height(), &dc,
    0, 0,bmw,bmh, SRCCOPY);


    dc.SelectObject(pOldBitmap);
    */
    return TRUE;
    }
      

  2.   

    #include <atlimage.h> CImage img; //JPG / JPEG / GIF / PNG 格式的图片
      HRESULT ret = img.Load(”c:\\1.jpg“); // filename 是要加载的文件名(包含路径)  
      HBITMAP bitmap = img.Detach();    CBitmap bmp = CBitmap::FromHandle(bitmap );
    这一段还是放到另外一个地方初始化后使用吧,不用经常Load
    还有就是不要用picture control,用一般的static control就行了
      

  3.   

    void CxxxDlg::OnPaint()
    {
            CPaintDC paintDC(this);
    ::CoInitialize(NULL);  // COM 初始化
    HRESULT hr;
    CFile file;

    file.Open( "c:\\aa.jpg", CFile::modeRead | CFile::shareDenyNone );  // 读入文件内容
    DWORD dwSize = file.GetLength();
    HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
    LPVOID lpBuf = ::GlobalLock( hMem );
    file.ReadHuge( lpBuf, dwSize );
    file.Close();
    ::GlobalUnlock( hMem ); IStream * pStream = NULL;
    IPicture * pPicture = NULL;

    // 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
    hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream );
    ASSERT ( SUCCEEDED(hr) );

    hr = ::OleLoadPicture( pStream, dwSize, TRUE, IID_IPicture, ( LPVOID * )&pPicture );
    ASSERT(hr==S_OK);

    long nWidth,nHeight;  // 宽高,MM_HIMETRIC 模式,单位是0.01毫米
    pPicture->get_Width( &nWidth );    // 宽
    pPicture->get_Height( &nHeight );  // 高

    ////////原大显示//////
    CSize sz( nWidth, nHeight );
    pDC->HIMETRICtoDP( &sz );  // 转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
    pPicture->Render(paintDC.m_hDC,0,0,sz.cx,sz.cy,
    0,nHeight,nWidth,-nHeight,NULL);

    ////////按窗口尺寸显示////////
    // CRect rect; GetClientRect(&rect);
    // pPicture->Render(paintDC.m_hDC,0,0,rect.Width(),rect.Height(),
    // 0,nHeight,nWidth,-nHeight,NULL); if ( pPicture ) pPicture->Release();// 释放 IPicture 指针
    if ( pStream ) pStream->Release();  // 释放 IStream 指针,同时释放了 hMem

    ::CoUninitialize();
    }
      

  4.   


            CRect rect;
    m_FrameDisplay.GetClientRect(&rect);     //m_FrameDisplay为Picture Control控件变量,获得控件的区域对象 CImage image;       //使用图片类
    image.Load(G_FramePath);   //装载路径下图片信息到图片类
    CDC* pDC = m_FrameDisplay.GetWindowDC();    //获得显示控件的DC
    image.Draw( pDC -> m_hDC,rect);      //图片类的图片绘制Draw函数
    ReleaseDC(pDC);
    未知各位如何解决显示的图片失真问题
      

  5.   


    你好,十分感谢。我用的是VS2005,用的是MFC,但未发现有static control这个控件哦。另外把显示的控件的IDC设置为什么?例如我设置为IDC_PIC
    那么在你的代码中,如何绑定这个IDC_PIC因为我希望让用户输入路径,确认后显示图片。
    用户重新输入别的路径,重新确认,又可再显示新的图片。望再详细一点,谢谢!!
      

  6.   

    请问一下,怎样才能用 CImage 类,我包含 atlimage.h 时说找不到头文件
      

  7.   

    帅哥,你使用我给你说的方法试试看。
    我试过在View的OnDraw中用过。可以。
      

  8.   

    #include "atlimage.h"吗,我这么写的可以
      

  9.   

    用GDI+ 啥都能解决,控件都不用摆,想画哪就画哪