在一个图像处理工程中,在XXXView.cpp文件头中已经 #include "dib.h"。OnDraw函数如下:
void CXXXView::OnDraw(CDC* pDC)
{
CXXXDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if( pDoc->m_pDib )
{
pDib = pDoc->m_pDib;//得到pDib指针作为全局的指针 lpDIBBits = pDib->GetDibData();
lWidth = pDib->GetWidth();
lLinebits = WIDTHBYTES( 8*lWidth );
lHeight = pDib->GetHeight();
SetScrollSizes(MM_TEXT, CSize(lLinebits, lHeight));
pDib->Draw(pDC->m_hDC, 0, 0, lLinebits, lHeight, 
0, 0, lLinebits, lHeight, DIB_RGB_COLORS, SRCCOPY); }
调试在GetDibData()报错,CDIB类中的该函数描述为:
unsigned char* CDib::GetDibData() const
{
    return m_pDibData;
}
调试模式下的值为:
pDoc:0x00431520
pDoc->m_pDib:0x00000000
是否说明m_pDib并没有所对应内存空间?

解决方案 »

  1.   

    你查查pDoc->m_pDib,跟踪当图片打开时,pDoc->m_pDib的变化情况,我觉得你应该一看文档里与pDoc->m_pDib载入图片相关的代码,还要看载入图片调用了CDib哪些函数来载入图片的,因为图象根本没有成功,建议跟踪这个线索调试
      

  2.   

    pDoc->m_pDib:0x00000000
    说明你加载DIB就失败了。
      

  3.   

    该怎么解决m_pDib的问题呢?
    DIB.cpp主要的函数如下
    #include "stdafx.h"
    #include "Dib.h"
    const unsigned int GROWBYTES = 1024;//IMPLEMENT_DYNAMIC(CDib,  CObject)CDib::CDib()
    {
    Init();
    }CDib::CDib(const char* pszDibFileName)
    {
    Init();
        LoadFile(pszDibFileName);
    }
    CDib::~CDib()
    {
    if(m_pBackup)
    delete[] m_pBackup;
    m_pBackup = NULL; if(m_pFileData)
    free(m_pFileData);
    if(m_pDataS)
    delete[] m_pDataS;  m_pDataS = NULL;
    m_pRGBQuad = NULL;
        m_pBitmapInfo = NULL;
    m_pBitmapInfoHeader = NULL;
    m_pBitmapFileHeader = NULL;
      m_pszFileName = NULL;
        m_pDibData = NULL;
    }#ifdef _DEBUG
    void CDib::Dump(CDumpContext& dc) const
    {
    CObject::Dump(dc);
    }void CDib::AssertValid() const
    {
    CObject::AssertValid();
    ASSERT(m_pszFileName != NULL);
    // ASSERT(m_hDIB != 0);
    }
    #endif
    void CDib::Init()
    {
    m_bValid = false;
    m_fileLeng = 0;
    m_nWidth = 0; //宽度
    m_nHeight = 0; //高度
    m_nBitCount = 0; //每个像素占有的位数
        m_nTotalColors = 0; //颜色总数
        m_pDibData = NULL; //位图像素数据
    m_pszFileName = NULL;
        m_pBitmapFileHeader = NULL;
        m_pBitmapInfoHeader = NULL;
        m_pBitmapInfo = NULL;
    m_pRGBQuad = NULL; //RGBQUAD 表项
    m_pDataS = NULL;
    m_pFileData = NULL;
    m_pBackup = NULL;
    }long CDib::GetWidth() const 
    {
        return m_nWidth;
    }
            
    long CDib::GetHeight() const
    {
        return m_nHeight;
    }//获取数据缓冲区的大小       
    unsigned long CDib::GetSize()
    {
        if (m_pBitmapInfoHeader->biSizeImage != 0)
            return (m_pBitmapInfoHeader->biSizeImage);
    else 
    return (unsigned long)WIDTHBYTES(m_nWidth*m_nBitCount) * (unsigned long)m_nHeight;
    }unsigned char CDib::GetBitCount() const
    {
    return m_nBitCount;
    }unsigned int CDib::GetColorNumber() const
    {
    unsigned int nColors = 0;    if ((m_pBitmapInfoHeader->biClrUsed == 0) &&
              (m_pBitmapInfoHeader->biBitCount < 9))
    {
    switch (m_pBitmapInfoHeader->biBitCount)
    {
        case 1: nColors = 2; break;
        case 4: nColors = 16; break;
        case 8: nColors = 256;break;
    }
    }
        else
    nColors = (unsigned int) m_pBitmapInfoHeader->biClrUsed;    return nColors;
    }char* CDib::GetFileName() const
    {
    return m_pszFileName;
    }unsigned char* CDib::GetDibData() const
    {
        return m_pDibData;
    }RGBQUAD* CDib::GetRGBQuad() const
    {
        return m_pRGBQuad;
    }BITMAPINFO* CDib::GetBmpInfo() const
    {
        return m_pBitmapInfo;
    }unsigned long CDib::GetFileLeng()
    {
    return m_fileLeng;
    }bool CDib::IsValid() const
    {
    return m_bValid;
    }
    ...
      

  4.   

    CDib::CDib(const char* pszDibFileName)你把路径付给这个函数就可以了