我在用MFC编写一个程序,以单文档为基础,功能是从文件读取.jpg格式的图片并将它显示在客户区.主要代码如下:我声明的变量有:
CString m_str; //存路径名
IStream* m_pstrm; //将图片读入内存时的流指针
IPicture* m_IpPic; 此函数作用是将图片读入内存(使用文件对话框取得路径):
void CTest_picture2View::OnShowfile() 
{
CFileDialog dlg(TRUE,"jpg","*.jpg",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
                      "JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||",NULL);if(dlg.DoModal()==IDOK)
{m_str=dlg.GetPathName();
}
CFile file;
CFileStatus fstatus;
LONG cb;
if(m_str.GetLength()<=0){return;} 
if(file.Open(m_str,CFile::modeRead)==FALSE)
{
file.Close();
return;
}
if(file.GetStatus(m_str,fstatus)==FALSE)
{
file.Close();
return;
}
cb=fstatus.m_size; 
HGLOBAL hglobal=GlobalAlloc(GMEM_MOVEABLE, cb);  // GMEM_MOVEABLE表示活动的   
LPVOID pvData =GlobalLock(hglobal);  //锁定内存对象
if(hglobal!=NULL)
{
 if(pvData!=NULL)
   {
file.ReadHuge(pvData,cb);
GlobalUnlock(hglobal);CreateStreamOnHGlobal(hglobal,TRUE,&m_pstrm);
if(FAILED(OleLoadPicture(m_pstrm,cb,TRUE,IID_IPicture,(LPVOID*)&m_IpPic)))   
{return;}
Invalidate();
}
}
// TODO: Add your command handler code here
}下面函数的作用是在客户区显示图片:
void CTest_picture2View::OnDraw(CDC* pDC)
{CTest_picture2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
        CRect rc;
rc.SetRect(0,0,0,0);
GetClientRect(&rc);
long hmWidth,hmHeight;
m_IpPic->get_Width(&hmWidth);
m_IpPic->get_Height(&hmHeight);
m_IpPic->Render(*pDC, rc.left, rc.top, rc.Width(), rc.Height(),
0, hmHeight, hmWidth, -hmHeight, NULL);// TODO: add draw code for native data here
}此程序的主要问题是m_IpPic->get_Width(&hmWidth)函数和m_IpPic->getHeight(&hmHeight)函数的使用.编译、链接时没问题,就是在运行时系统报错。将上述两函数注掉后报错消失,但无法显示图片。望众高手指点错误所在,万分感谢。

解决方案 »

  1.   

    需要用个变量判断是否已经读取,比如:
    if (m_lpPic) //初始化为NULL
    {
    CRect  rc;  
    GetClientRect(&rc);  
    long  hmWidth,hmHeight;  
    m_IpPic->get_Width(&hmWidth);  
    m_IpPic->get_Height(&hmHeight);  
    m_IpPic->Render(*pDC,  rc.left,  rc.top,  rc.Width(),  rc.Height(),  
    0,  hmHeight,  hmWidth,  -hmHeight,  NULL);  
    }
      

  2.   

    应当用什么函数初始化COM库的IPicture型指针m_IpPic呢?望高手赐教
      

  3.   

    我不太明白gdi+应当如何使用?
      

  4.   

    另外我在网上看到过一些关于MFC显示.jpg格式图片的例子 但基本都是在对话框中显示 我想知道在客户区中显示图片与在对话框中显示有什么不同?