怎样让我的DIB图像显示在客户区?
在程序中加入一个Dib类,然后再C**View的OnDraw(CDC* pDC)函数中显示。可总没有显示,拜托哪位大侠帮我看下: 
void C**View::OnDraw(CDC* pDC) 

CMAP3Doc* pDoc = GetDocument(); 
ASSERT_VALID(pDoc); pDoc->m_pDib->Draw(pDC,(0,0),(300,100)); 
} DIB的现实函数如下: 
/*----------------------------------------------------------------------------------- 
Draw(CDC* pDC, CPoint origin, CSize size) 
函数功能: 该函数调用Win32函数StretchDIBits来将CDib对象输出到显示器(或打印机)上, 
          位图会被拉伸到给定的矩形。 
参数: 
    pDC            指向显示器或打印机设备环境的指针,他将接受DIB图像。 
origin        CPoint对象,它保存了显示DIB时的逻辑坐标。 
size          CSize对象,它保存了显示DIB时的矩形的逻辑宽度和高度。 
返回值        如果成功返回TRUE。 
-----------------------------------------------------------------------------------*/ 
BOOL CDib::Draw(CDC* pDC, CPoint origin, CSize size) 

if(m_lpBMIH == NULL) return FALSE; 
if(m_hPalette != NULL) { 
::SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE); 

pDC->SetStretchBltMode(COLORONCOLOR); 
::StretchDIBits(pDC->GetSafeHdc(), origin.x, origin.y, size.cx, size.cy, 
0, 0, m_lpBMIH->biWidth, m_lpBMIH->biHeight, 
m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY); 
return TRUE; 
}附:CDIB类
// cdib.h declaration for Inside Visual C++ CDib class#ifndef _INSIDE_VISUAL_CPP_CDIB
#define _INSIDE_VISUAL_CPP_CDIBclass CDib : public CObject
{
enum Alloc {noAlloc, crtAlloc, heapAlloc};
DECLARE_SERIAL(CDib)
public:
LPVOID m_lpvColorTable;
HBITMAP m_hBitmap;
LPBYTE m_lpImage;  // starting address of DIB bits
LPBITMAPINFOHEADER m_lpBMIH; //  buffer containing the BITMAPINFOHEADER// HANDLE m_hFile;
private:
HGLOBAL m_hGlobal; // For external windows we need to free;
                   //  could be allocated by this class or allocated externally
Alloc m_nBmihAlloc;
Alloc m_nImageAlloc;
DWORD m_dwSizeImage; // of bits -- not BITMAPINFOHEADER or BITMAPFILEHEADER
int m_nColorTableEntries;

HANDLE m_hFile;
HANDLE m_hMap;
LPVOID m_lpvFile;
HPALETTE m_hPalette;
public:
CDib();
CDib(CSize size, int nBitCount); // builds BITMAPINFOHEADER
~CDib();
int GetSizeImage() {return m_dwSizeImage;}
int GetSizeHeader()
{return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;}
CSize GetDimensions();
BOOL AttachMapFile(const char* strPathname, BOOL bShare = FALSE); BOOL CopyToMapFile(const char* strPathname);
BOOL AttachMemory(LPVOID lpvMem, BOOL bMustDelete = FALSE, HGLOBAL hGlobal = NULL);
BOOL Draw(CDC* pDC, CPoint origin, CSize size);  // until we implemnt CreateDibSection
HBITMAP CreateSection(CDC* pDC = NULL);
UINT UsePalette(CDC* pDC, BOOL bBackground = FALSE);
BOOL MakePalette();
BOOL SetSystemPalette(CDC* pDC);
BOOL Compress(CDC* pDC, BOOL bCompress = TRUE); // FALSE means decompress
HBITMAP CreateBitmap(CDC* pDC);
BOOL Read(CFile* pFile);
BOOL ReadSection(CFile* pFile, CDC* pDC = NULL);
BOOL Write(CFile* pFile);
void Serialize(CArchive& ar);
void Empty();
private:
void DetachMapFile();
void ComputePaletteSize(int nBitCount);
void ComputeMetrics();
};
#endif // _INSIDE_VISUAL_CPP_CDIB

解决方案 »

  1.   

    调试时看m_lpBMIH == NULL?
    看m_lpImage 内存里的值是什么。
    我也是新手,不清楚。
      

  2.   

    你的“pDoc->m_pDib”已经加载了位图吗?在哪儿加载的?贴代码出来。
      

  3.   

    楼上的大侠,
    pDoc->m_pDib要加载位图吗? 不是直接在Menu里打开就可以了吗?
      

  4.   

    没有代码,OnDraw(CDC* pDC)里这样写算不算呢?void C**View::OnDraw(CDC* pDC)
    {
    CMAP3Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);  //pDoc->m_pDib->Draw(pDC,(0,0),(300,300)); CDC dcMemory;
        CBitmap* pOldBmp;
        dcMemory.CreateCompatibleDC(pDC);
        pOldBmp = dcMemory.SelectObject(m_pBmp);
        pDC->BitBlt(m_orgpoint.x,m_orgpoint.y,m_size.cx,m_size.cy,
            &dcMemory,0,0,SRCCOPY);
        dcMemory.SelectObject(pOldBmp);}
      

  5.   


    VC 可不同于BCB,在这里它只给了你一个框架,告诉你功能代码在哪儿填!但具体的功能代码是需要自己手工录入的!其实如果你直接在VIEW里面响应更好。
      

  6.   

    要先在DOC里加载图像数据,才能显示的,如果不加载,pDoc->m_pDib只是一个空指针当然显示不了了。我没用过CDIB,里面应该有相应的加载图像的函数把,例如Load之类的。
      

  7.   

    要先在DOC里加载图像数据,才能显示的,如果不加载,pDoc->m_pDib只是一个空指针当然显示不了了。我没用过CDIB,里面应该有相应的加载图像的函数把,例如Load之类的。
      

  8.   

    CDib这个类不是周长发的书上的吗,直接用书上的测试程序不就行了
      

  9.   

    是周长发书上的,因为CDib类似下载的,所以没按书上写,现在弄好了,呵呵。谢谢大家的热心
      

  10.   

    其实应该把gdi的那一套接口,好好看看,一般的问题都能解决