最近才开始学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);
}
位图的宏定义和存储位置都已经准确操作了。
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);
}
位图的宏定义和存储位置都已经准确操作了。
pDC->BitBlt(0,0,pDoc->m_nWidth,pDoc->m_nHeight,&MemDC,0,0,SRCCOPY);
函数圆形是:
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.
创建兼容的内存DC
然后拷贝内存DC到目标DC
CDC派生了CClientDC CPaintDC CWindowDC
楼主看看是不是别的地方的错误,最好多给点信息,比如断言的调用堆栈等。我以前还专门写过测试代码,测试兼容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));
}
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()
。