2014-03-26 15 views
0

我有一個在Visual Studio 2010專業版中創建的簡單文本編輯器。基本上我修改了由VS2010嚮導自動生成的MFC MDI程序。問題是,當我打印時,它給了我一個調試斷言錯誤在viewrich.cpp第294行。我沒有修改代碼中的任何與打印有關的事情,雖然它可能是我如何使用Rich Edit的問題。這是我擁有的所有信息。提前致謝。打印時出現調試斷言錯誤

Viewrich.cpp

BOOL CRichEditView::PaginateTo(CDC* pDC, CPrintInfo* pInfo) 
// attempts pagination to pInfo->m_nCurPage, TRUE == success 
{ 
ASSERT_VALID(this); 
ASSERT_VALID(pDC); 

CRect rectSave = pInfo->m_rectDraw; 
UINT nPageSave = pInfo->m_nCurPage; 
ASSERT(nPageSave > 1); // LINE 294 
ASSERT(nPageSave >= (UINT)m_aPageStart.GetSize()); 
VERIFY(pDC->SaveDC() != 0); 
pDC->IntersectClipRect(0, 0, 0, 0); 
pInfo->m_nCurPage = (int)m_aPageStart.GetSize(); 
while (pInfo->m_nCurPage < nPageSave) 
{ 
    ASSERT(pInfo->m_nCurPage == (UINT)m_aPageStart.GetSize()); 
    OnPrepareDC(pDC, pInfo); 
    ASSERT(pInfo->m_bContinuePrinting); 
    pInfo->m_rectDraw.SetRect(0, 0, 
     pDC->GetDeviceCaps(HORZRES), pDC->GetDeviceCaps(VERTRES)); 
    pDC->DPtoLP(&pInfo->m_rectDraw); 
    OnPrint(pDC, pInfo); 
    if (pInfo->m_nCurPage == (UINT)m_aPageStart.GetSize()) 
     break; 
    ++pInfo->m_nCurPage; 
} 
BOOL bResult = pInfo->m_nCurPage == nPageSave; 
pDC->RestoreDC(-1); 
pInfo->m_nCurPage = nPageSave; 
pInfo->m_rectDraw = rectSave; 
ASSERT_VALID(this); 
return bResult; 
} 

EmergenceView.cpp

IMPLEMENT_DYNCREATE(CEmergenceView, CRichEditView) 

BEGIN_MESSAGE_MAP(CEmergenceView, CRichEditView) 
// Standard printing commands 
ON_COMMAND(ID_FILE_PRINT, &CRichEditView::OnFilePrint) 
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CRichEditView::OnFilePrint) 
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CEmergenceView::OnFilePrintPreview) 
ON_WM_CONTEXTMENU() 
ON_WM_RBUTTONUP() 
ON_COMMAND(ID_MUTATE_GROUP, &CEmergenceView::OnMutateGroup) 
ON_UPDATE_COMMAND_UI(ID_MUTATE_GROUP, &CEmergenceView::OnUpdateMutateGroup) 
ON_COMMAND(ID_MUTATE_RANDOMISE, &CEmergenceView::OnMutateRandomise) 
ON_UPDATE_COMMAND_UI(ID_MUTATE_RANDOMISE, &CEmergenceView::OnUpdateMutateRandomise) 
ON_COMMAND(ID_HELP_STATISTICS, &CEmergenceView::OnHelpStatistics) 
ON_UPDATE_COMMAND_UI(ID_HELP_STATISTICS, &CEmergenceView::OnUpdateHelpStatistics) 
ON_COMMAND(ID_MUTATE_POETRIZE, &CEmergenceView::OnMutatePoetrize) 
ON_COMMAND(ID_EDIT_SELECTALL, &CEmergenceView::OnEditSelectall) 
END_MESSAGE_MAP() 

// CEmergenceView construction/destruction 

CEmergenceView::CEmergenceView() 
{ 
// TODO: add construction code here 

} 

CEmergenceView::~CEmergenceView() 
{ 
} 

BOOL CEmergenceView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
// TODO: Modify the Window class or styles here by modifying 
// the CREATESTRUCT cs 

return CRichEditView::PreCreateWindow(cs); 
} 

// CEmergenceView drawing 

void CEmergenceView::OnDraw(CDC* /*pDC*/) 
{ 
CEmergenceDoc* pDoc = GetDocument(); 
ASSERT_VALID(pDoc); 
if (!pDoc) 
    return; 

// TODO: add draw code for native data here 
} 


// CEmergenceView printing 


void CEmergenceView::OnFilePrintPreview() 
{ 
    #ifndef SHARED_HANDLERS 
AFXPrintPreview(this); 
    #endif 
} 

BOOL CEmergenceView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
// default preparation 
return DoPreparePrinting(pInfo); 
} 

void CEmergenceView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
// TODO: add extra initialization before printing 
} 

void CEmergenceView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
// TODO: add cleanup after printing 
} 
+0

您可以發佈斷言的MFC代碼以及您的代碼,該代碼會啓動打印 – user1793036

+0

的添加。謝謝。 – user3396028

+0

查看「OnPreparePrinting」(http://msdn.microsoft.com/en-us/library/a59dff1e.aspx)的文檔,看起來您必須調用'pInfo-> SetMaxPage()'。 – user1793036

回答

0

斷言說,這一切:

UINT nPageSave = pInfo->m_nCurPage; 
ASSERT(nPageSave > 1); 

這是當前頁面打印/ PAGINATE的值。它在CPrintInfo的構造函數中設置爲1。但有些東西改變了它,並使其成爲0或負面。通常這個值完全由RTF打印輸出控制。所以你必須做一些操縱它的東西。

您必須在CPrintInfo中設置最小頁面和最大頁面值(SetMinPage和SetMaxPage)。

+0

我已經設置了最小頁面和最大頁面,它仍然給我同樣的錯誤... – user3396028