最近才开始学mfc,这是书上的列子,我运行了出现下面的错误: 
Debug Assertion failed!
断言错误所指行:ASSERT(m_hObject!=0);
这是我在class wizard 框架下建立的单文档MFC程序。
程序如下:
class CGraduateDoc : public CDocument
{public:
        CBitmap m_Bitmap;
int m_nWidth;
int m_nHeight;
...}CGraduateDoc::CGraduateDoc()
{BITMAP BM;
m_Bitmap.LoadBitmap(IDB_MY_BITMAP);
m_Bitmap.GetBitmap(&BM);
m_nWidth=BM.bmWidth;
 m_nHeight=BM.bmHeight;
....
}
void CGraduateView::OnDraw(CDC* pDC)
{
CGraduateDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(pDoc->m_Bitmap);
pDC->BitBlt(0,0,pDoc->m_nWidth,pDoc->m_nHeight,&MemDC,0,0,SRCCOPY);
}
位图的宏定义和存储位置都已经准确操作了。

解决方案 »

  1.   

    MemDC.CreateCompatibleDC(NULL); 这里的NULL改为pDC
    pDC->BitBlt(0,0,pDoc->m_nWidth,pDoc->m_nHeight,&MemDC,0,0,SRCCOPY); 
      

  2.   

    同意LS   MemDC.CreateCompatibleDC(NULL); 意思是创建一个与参数兼容的DC  !
    函数圆形是:
    BOOL CreateCompatibleDC(CDC* pDC );
    其实DC在MFC中分好多
    你仔细看这个参数:
    pDC
    A pointer to a device context. If pDC is NULL, the function creates a memory device context that is compatible with the system display. 
      

  3.   

    UP
    创建兼容的内存DC
    然后拷贝内存DC到目标DC
    CDC派生了CClientDC CPaintDC CWindowDC
      

  4.   

    我拷贝了楼主的代码做了测试,是OK的。而且楼主创建的是兼容DC,又不是兼容位图。
    楼主看看是不是别的地方的错误,最好多给点信息,比如断言的调用堆栈等。我以前还专门写过测试代码,测试兼容DC、兼容位图的问题。如下:
    //总结:创建兼容位图时,★不能★使用才创建好的内存兼容DC
    void CFTLGdiTester::test_CompatibleBitmap()
    {
        BOOL bRet = FALSE;
        HBITMAP hDesktopBmp = NULL;
        BITMAP bmpInfo = {0};    //创建和桌面DC的兼容位图 -- 支持32位真彩
        hDesktopBmp = ::CreateCompatibleBitmap(m_hDesktopDC, 10,10);
        ::GetObject(hDesktopBmp, sizeof(bmpInfo), &bmpInfo);
        CPPUNIT_ASSERT(40 == bmpInfo.bmWidthBytes
            && 1 == bmpInfo.bmPlanes
            && 32 == bmpInfo.bmBitsPixel);    //创建和桌面兼容的内存DC,并在其基础上创建兼容位图 -- 由于内存DC中没有选入位图,因此兼容位图只支持最基本的黑白两色
        HDC hMemDcFromDesktop = ::CreateCompatibleDC(m_hDesktopDC);
        HBITMAP hMemDCBmp = ::CreateCompatibleBitmap(hMemDcFromDesktop, 10,10);
        ::GetObject(hMemDCBmp, sizeof(bmpInfo), &bmpInfo);
        CPPUNIT_ASSERT(2 == bmpInfo.bmWidthBytes
            && 1 == bmpInfo.bmPlanes
            && 1 == bmpInfo.bmBitsPixel);
        ::DeleteObject(hMemDCBmp);    //将创建好的32位兼容位图选入兼容内存DC,然后重新创建兼容位图 -- 此时兼容位图也能支持32位真彩
        HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDcFromDesktop, hDesktopBmp);
        hMemDCBmp = ::CreateCompatibleBitmap(hMemDcFromDesktop, 10,10);
        API_VERIFY(0 != ::GetObject(hMemDCBmp, sizeof(bmpInfo), &bmpInfo));
        CPPUNIT_ASSERT(40 == bmpInfo.bmWidthBytes
            && 1 == bmpInfo.bmPlanes
            && 32 == bmpInfo.bmBitsPixel);    API_VERIFY(::DeleteObject(hMemDCBmp));
        API_VERIFY(::DeleteDC(hMemDcFromDesktop));
        API_VERIFY(::DeleteObject(hDesktopBmp));
    }
      

  5.   

    堆栈中说::
    CBitmap::GetBitmap(tagBITMAP * 0x0012fb50) line 418 + 38 bytesCMyDoc::CMyDoc() line 38
    CMyDoc::CreateObject() line 18 + 83 bytes
    CRuntimeClass::CreateObject() line 140 + 6 bytes
    CDocTemplate::CreateNewDocument() line 230 + 11 bytes
    CSingleDocTemplate::OpenDocumentFile(const char * 0x00000000, int 1) line 112 + 11 bytes
    CDocManager::OnFileNew() line 829
    CWinApp::OnFileNew() line 29
    _AfxDispatchCmdMsg(CCmdTarget * 0x00417850 class CMyApp theApp, unsigned int 57600, int 0, void (void)* 0x00402c6a CWinApp::OnFileNew, void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 57600, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CWinApp::ProcessShellCommand(CCommandLineInfo & {CCommandLineInfo}) line 31 + 30 bytes
    CMyApp::InitInstance() line 88 + 12 bytes
    AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00192363, int 1) line 39 + 11 bytes
    WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00192363, int 1) line 30
    WinMainCRTStartup() line 330 + 54 bytes
    KERNEL32! 75f44911()
    NTDLL! 7767e1c6()
    NTDLL! 7767e199()