0xC0000005打印功能发生错误

时间:2016-03-05 17:19:13

标签: mfc

以下是代码。

void SignalView::OnFilePrintPreview()
{
 if(RcursorPosX-LcursorPosX<=0){
  AfxMessageBox(_T("Please set cursor positions.\nYou can only print out the area between left and right cursors"));
  return;
 }
 CScrollView::OnFilePrintPreview();
}

BOOL SignalView::OnPreparePrinting(CPrintInfo* pInfo)
{
 if(RcursorPosX-LcursorPosX>100*4*2)
 RcursorPosX = LcursorPosX+100*4*2; //800 = 100 cursor x 4(gridX) x 2(zoomX)

 pInfo->SetMinPage(1);
 pInfo->SetMaxPage(1);

 return DoPreparePrinting(pInfo);      //<===========
}

void SignalView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
 PRINTDLG* pPrintDlg = new PRINTDLG;
 AfxGetApp()->GetPrinterDeviceDefaults(pPrintDlg);
 DEVMODE* lpDevMode = (DEVMODE*)::GlobalLock(pPrintDlg->hDevMode);        

 lpDevMode->dmOrientation = DMORIENT_LANDSCAPE; 

 while(!pDC->ResetDC(lpDevMode));
 ::GlobalUnlock(pPrintDlg->hDevMode);    
 delete pPrintDlg;
}

我试图使用打印功能。但我重新制作它是因为我删除了它并再次创建了一个新的类,它来自CScrollView,因此我不会使用从头开始制作的原始视图。

现在,我实现了我想要的但问题是当我尝试调用并关闭打印事件OnFilePrintPreview()大约30-40次时发生错误,然后它会关闭并显示错误消息{{ 1}}。

它从函数0xC0000005发生,然后转到DoPreparePrinting(pInfo)文件中的COMMDLG_AFXCTXFUNC(BOOL ,PrintDlgW,(LPPRINTDLGW unnamed1),(unnamed1)),然后它会引发错误消息。

为什么会出现这个问题?代码似乎正朝着正确的方向发展吗?

P.S。 该部分在反汇编模式下发生错误。

afxcomctl32.inl

1 个答案:

答案 0 :(得分:1)

while(!pDC->ResetDC(lpDevMode));
    ::GlobalUnlock(pPrintDlg->hDevMode); 

这看起来很麻烦。如果第一次和第二次循环条件为真,则无法保证它最终会停止。

以下可能不是导致错误的原因,但您应该尝试一般遵循这些程序。

声明新变量时将它们设置为零,因此所有结构成员都为零:

PRINTDLG* pPrintDlg = new PRINTDLG;
memset(pPrintDlg, 0, sizeof(pPrintDlg)); 

某些结构需要知道尺寸。这与Microsoft版本控制有关:

pPrintDlg->lStructSize = sizeof(PRINTDLG); 

在这种情况下,您不需要使用new来分配pPrintDlg(但如果您这样做,则不会导致问题)

您应该能够拦截打印请求(在创建打印机设备上下文之前)并切换到横向模式,因此打印对话框以横向模式显示。

void SignalView::OnFilePrint()
{
    PRINTDLG printDlg = { 0 };
    printDlg.lStructSize = sizeof(PRINTDLG);
    if (AfxGetApp()->GetPrinterDeviceDefaults(&printDlg))
    {
        if (printDlg.hDevMode)
        {
            DEVMODE *dm = (DEVMODE*)::GlobalLock(printDlg.hDevMode);
            if (dm)
            {
                dm->dmFields |= DM_ORIENTATION;
                dm->dmOrientation = DMORIENT_LANDSCAPE;
                ::GlobalUnlock(printDlg.hDevMode);
            }
        }
    }

    CScrollView::OnFilePrint();
}

消息映射应如下所示:

BEGIN_MESSAGE_MAP(SignalView, CScrollView)
    ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, OnFilePrint)
    //**************************************************
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
    //**************************************************
END_MESSAGE_MAP()

用户可以在打印对话框中将打印模式更改回肖像。如果您想强制横向,可以在OnBeginPrinting中重复相同的代码。