以下是绘制基类的代码
void CDrawBase::DrawMain(CDC *pDC, BOOL bSeeMark)
{
if (bSeeMark && !m_bCanDraw)
return;
CMemDC dc(pDC, &((CRect)m_rect)); //Call stack 就到这里,程序出错,请看MemDC的代码:
dc.SetBkMode(TRANSPARENT);
DrawBackGround(&dc);
_DrawMain(&dc);
}
以下是CMemDC的部分代码(该代码是从codeproject上面Get的,成熟的,经得起考验的,问题不会在这里):
CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
{
ASSERT(pDC != NULL);
// Some initialization
m_pDC = pDC;
m_oldBitmap = NULL;
m_bMemDC = !pDC->IsPrinting();
// Get the rectangle to draw
if (pRect == NULL) {
pDC->GetClipBox(&m_rect);
} else {
m_rect = *pRect;
}
if (m_bMemDC) {
// Create a Memory DC
CreateCompatibleDC(pDC);
pDC->LPtoDP(&m_rect);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_oldBitmap = SelectObject(&m_bitmap); //好,call stack到这里程序出错
SetMapMode(pDC->GetMapMode());
pDC->DPtoLP(&m_rect);
SetWindowOrg(m_rect.left, m_rect.top);
} else {
// Make a copy of the relevent parts of the current DC for printing
m_bPrinting = pDC->m_bPrinting;
m_hDC = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;
}
// Fill background
FillSolidRect(m_rect, pDC->GetBkColor());
}
ok,最后程序执行_AFXWIN_INLINE CBitmap* CDC::SelectObject(CBitmap* pBitmap) ,断言,出错...