Mfc 打印功能中发生0xC0000005错误

Mfc 打印功能中发生0xC0000005错误,mfc,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(); }

下面是代码

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;
}
这看起来很麻烦。如果循环条件在第一次和第二次为真,则不能保证它最终会停止

以下可能不是导致错误的原因,但您应该尝试按照这些步骤进行操作

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

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
中重复相同的代码。

谢谢您的帮助。但我必须做打印预览。我已经使用打印对话框,但我删除了它,因为如果我继续使用打印对话框,我找不到显示打印预览模式的方法。此外,预览应该向用户显示一个横向视图,所以我在设置之前使用横向模式。有没有一种方法可以在打印对话框中使用打印预览??如果没有,如何使用正常的打印视图功能。如果有帮助,请参阅编辑。它应该强制景观。您还可以在
void CMyView::OnFilePrintPreview()中执行此操作。
感谢您的编辑。但是,它没有显示任何预览。。如果我想让预览显示在对话框之前,我应该如何从您的代码中修复它?我不明白。问题是“打印功能出错”。您应该编辑您的问题并显示更多代码,包括SignalView的消息映射,并更详细地解释错误。谢谢。这确实有帮助。但仍然存在一个问题。调用AfxGetApp()->GetPrinterDeviceDefaults(&printdlg.m_pd)时;在编辑代码中,afxcomctl32.inl文件中的COMMDLG_AFXCTXFUNC(BOOL,PrintDlgW,(LPPRINTDLGW unname1),(unname1))函数出现错误消息。您能给我一些解决方案吗?使用调试器通过查看调用堆栈来找出崩溃发生的位置。谢谢您的评论。我对上面的代码发表了评论。请检查一下。
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()