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()