如何自己在view类中加入打印功能

手插兜兜 2000-08-27 03:03:00
在mfc向导生成的View类中,自动加入了打印的功能,我在框架中有加入了一个新的view类,没有打印功能的支持。如何直接加入打印阅览和打印的功能。
我已经察看了ViewPrnt.CPP打印支持的源吗,但是不知如何应用到我的view类中,请各位高手指教。
...全文
360 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhb 2000-08-30
  • 打赏
  • 举报
回复
你要打印的内容和显示的内容相同吗?
Holly 2000-08-27
  • 打赏
  • 举报
回复
你都已经看到,怎么不会加?
如果你只是想调用缺省的MFC的打印,只需在你的View类的消息映射表中添加
ON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint);
手插兜兜 2000-08-27
  • 打赏
  • 举报
回复
谢谢你!
你的情况我了解,此时的生成的view类已经支持打印的功能,在mfc的打印功能支持中,其实已经使用了CView::OnFilePrint函数。我在mfc的源代码中,看到了CView::OnFilePrint的代码,但我不知如何将这些代码加到我的OnFilePrint中。代码如下:
void CView::OnFilePrint()
{
// get default print info
CPrintInfo printInfo;
ASSERT(printInfo.m_pPD != NULL); // must be set

if (LOWORD(GetCurrentMessage()->wParam) == ID_FILE_PRINT_DIRECT)
{
CCommandLineInfo* pCmdInfo = AfxGetApp()->m_pCmdInfo;

if (pCmdInfo != NULL)
{
if (pCmdInfo->m_nShellCommand == CCommandLineInfo::FilePrintTo)
{
printInfo.m_pPD->m_pd.hDC = ::CreateDC(pCmdInfo->m_strDriverName,
pCmdInfo->m_strPrinterName, pCmdInfo->m_strPortName, NULL);
if (printInfo.m_pPD->m_pd.hDC == NULL)
{
AfxMessageBox(AFX_IDP_FAILED_TO_START_PRINT);
return;
}
}
}

printInfo.m_bDirect = TRUE;
}

if (OnPreparePrinting(&printInfo))
{
// hDC must be set (did you remember to call DoPreparePrinting?)
ASSERT(printInfo.m_pPD->m_pd.hDC != NULL);

// gather file to print to if print-to-file selected
CString strOutput;
if (printInfo.m_pPD->m_pd.Flags & PD_PRINTTOFILE && !printInfo.m_bDocObject)
{
// construct CFileDialog for browsing
CString strDef(MAKEINTRESOURCE(AFX_IDS_PRINTDEFAULTEXT));
CString strPrintDef(MAKEINTRESOURCE(AFX_IDS_PRINTDEFAULT));
CString strFilter(MAKEINTRESOURCE(AFX_IDS_PRINTFILTER));
CString strCaption(MAKEINTRESOURCE(AFX_IDS_PRINTCAPTION));
CFileDialog dlg(FALSE, strDef, strPrintDef,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, strFilter);
dlg.m_ofn.lpstrTitle = strCaption;

if (dlg.DoModal() != IDOK)
return;

// set output device to resulting path name
strOutput = dlg.GetPathName();
}

// set up document info and start the document printing process
CString strTitle;
CDocument* pDoc = GetDocument();
if (pDoc != NULL)
strTitle = pDoc->GetTitle();
else
GetParentFrame()->GetWindowText(strTitle);
if (strTitle.GetLength() > 31)
strTitle.ReleaseBuffer(31);
DOCINFO docInfo;
memset(&docInfo, 0, sizeof(DOCINFO));
docInfo.cbSize = sizeof(DOCINFO);
docInfo.lpszDocName = strTitle;
CString strPortName;
int nFormatID;
if (strOutput.IsEmpty())
{
docInfo.lpszOutput = NULL;
strPortName = printInfo.m_pPD->GetPortName();
nFormatID = AFX_IDS_PRINTONPORT;
}
else
{
docInfo.lpszOutput = strOutput;
AfxGetFileTitle(strOutput,
strPortName.GetBuffer(_MAX_PATH), _MAX_PATH);
nFormatID = AFX_IDS_PRINTTOFILE;
}

// setup the printing DC
CDC dcPrint;
if (!printInfo.m_bDocObject)
{
dcPrint.Attach(printInfo.m_pPD->m_pd.hDC); // attach printer dc
dcPrint.m_bPrinting = TRUE;
}
OnBeginPrinting(&dcPrint, &printInfo);

if (!printInfo.m_bDocObject)
dcPrint.SetAbortProc(_AfxAbortProc);

// disable main window while printing & init printing status dialog
AfxGetMainWnd()->EnableWindow(FALSE);
CPrintingDialog dlgPrintStatus(this);

CString strTemp;
dlgPrintStatus.SetDlgItemText(AFX_IDC_PRINT_DOCNAME, strTitle);
dlgPrintStatus.SetDlgItemText(AFX_IDC_PRINT_PRINTERNAME,
printInfo.m_pPD->GetDeviceName());
AfxFormatString1(strTemp, nFormatID, strPortName);
dlgPrintStatus.SetDlgItemText(AFX_IDC_PRINT_PORTNAME, strTemp);
dlgPrintStatus.ShowWindow(SW_SHOW);
dlgPrintStatus.UpdateWindow();

// start document printing process
if (!printInfo.m_bDocObject && dcPrint.StartDoc(&docInfo) == SP_ERROR)
{
// enable main window before proceeding
AfxGetMainWnd()->EnableWindow(TRUE);

// cleanup and show error message
OnEndPrinting(&dcPrint, &printInfo);
dlgPrintStatus.DestroyWindow();
dcPrint.Detach(); // will be cleaned up by CPrintInfo destructor
AfxMessageBox(AFX_IDP_FAILED_TO_START_PRINT);
return;
}

// Guarantee values are in the valid range
UINT nEndPage = printInfo.GetToPage();
UINT nStartPage = printInfo.GetFromPage();

if (nEndPage < printInfo.GetMinPage())
nEndPage = printInfo.GetMinPage();
if (nEndPage > printInfo.GetMaxPage())
nEndPage = printInfo.GetMaxPage();

if (nStartPage < printInfo.GetMinPage())
nStartPage = printInfo.GetMinPage();
if (nStartPage > printInfo.GetMaxPage())
nStartPage = printInfo.GetMaxPage();

int nStep = (nEndPage >= nStartPage) ? 1 : -1;
nEndPage = (nEndPage == 0xffff) ? 0xffff : nEndPage + nStep;

VERIFY(strTemp.LoadString(AFX_IDS_PRINTPAGENUM));

// If it's a doc object, we don't loop page-by-page
// because doc objects don't support that kind of levity.

BOOL bError = FALSE;
if (printInfo.m_bDocObject)
{
OnPrepareDC(&dcPrint, &printInfo);
OnPrint(&dcPrint, &printInfo);
}
else
{
// begin page printing loop
for (printInfo.m_nCurPage = nStartPage;
printInfo.m_nCurPage != nEndPage; printInfo.m_nCurPage += nStep)
{
OnPrepareDC(&dcPrint, &printInfo);

// check for end of print
if (!printInfo.m_bContinuePrinting)
break;

// write current page
TCHAR szBuf[80];
wsprintf(szBuf, strTemp, printInfo.m_nCurPage);
dlgPrintStatus.SetDlgItemText(AFX_IDC_PRINT_PAGENUM, szBuf);

// set up drawing rect to entire page (in logical coordinates)
printInfo.m_rectDraw.SetRect(0, 0,
dcPrint.GetDeviceCaps(HORZRES),
dcPrint.GetDeviceCaps(VERTRES));
dcPrint.DPtoLP(&printInfo.m_rectDraw);

// attempt to start the current page
if (dcPrint.StartPage() < 0)
{
bError = TRUE;
break;
}

// must call OnPrepareDC on newer versions of Windows because
// StartPage now resets the device attributes.
if (afxData.bMarked4)
OnPrepareDC(&dcPrint, &printInfo);

ASSERT(printInfo.m_bContinuePrinting);

// page successfully started, so now render the page
OnPrint(&dcPrint, &printInfo);
if (dcPrint.EndPage() < 0 || !_AfxAbortProc(dcPrint.m_hDC, 0))
{
bError = TRUE;
break;
}
}
}

// cleanup document printing process
if (!printInfo.m_bDocObject)
{
if (!bError)
dcPrint.EndDoc();
else
dcPrint.AbortDoc();
}

AfxGetMainWnd()->EnableWindow(); // enable main window

OnEndPrinting(&dcPrint, &printInfo); // clean up after printing
dlgPrintStatus.DestroyWindow();

dcPrint.Detach(); // will be cleaned up by CPrintInfo destructor
}
}
haitian99 2000-08-27
  • 打赏
  • 举报
回复
1 设定打印机
建立 菜单 文件|设定打印机 ID=ID_FILE_PRINTE_SETUP
CMyApp 的消息映射表中加入:
ON_COMMAND(ID_FILE_PRINTE_SETUP,CWinApp::OnFilePrintSetup)

2 启动打印
建立 菜单 文件|打印 ID=ID_FILE_PRINTE CMyView的消息映射表中加入
既加入消息映射
ON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)

3 准备打印机参数.
virtual BOOL CView::OnPreparePrinting( CPrintInfo* pInfo ); virtual void
4 开始打印
CVIew::OnBeginPrinting( CDC* pDC, CPrintInfo* pInfo );

5 循环打印每一页
virtual void CView::OnPrepareDC( CDC* pDC, CPrintInfo* pInfo = NULL );
virtual void CView::OnPrint( CDC* pDC, CPrintInfo* pInfo );
6 结束打印

virtual void CVIew::OnEndPrinting( CDC* pDC, CPrintInfo* pInfo );


以上虚拟函数需要orerride.
手插兜兜 2000-08-27
  • 打赏
  • 举报
回复
我是用CView类做父类的,但什打印的功能必须手工加入,如何加入?
jhb 2000-08-27
  • 打赏
  • 举报
回复
为什么不让你的View类以MFC的view类作为父类?这样就可以用添加打印支持的方法了。
如果你没有这样,自已要作的工作就太多了。很可能要使用API接口的。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧