以下是代码。
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
答案 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
中重复相同的代码。