feeviewprint.cpp

来自「VC6.0环境下编写的一个交换机计费程序。」· C++ 代码 · 共 603 行 · 第 1/2 页

CPP
603
字号

void 
CFeeView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{

	CListCtrl *pList;
	pList=&GetListCtrl();

	CRect rcPrint(pInfo->m_rectDraw);

	SubtractMargin(pDC, rcPrint);
	int obkm = pDC->SetBkMode(TRANSPARENT);

	PrintPageHead(pDC, rcPrint, pInfo->m_nCurPage, (int) pInfo->GetMaxPage(), false);
	PrintListHead(pDC, rcPrint, false);

	int iFirst = (pInfo->m_nCurPage - 1) * iItemXPage;
	int iLast = (pInfo->m_nCurPage) * iItemXPage;

	int y = rcPrint.top;
	int x = rcPrint.left;

	CFont * oft = pDC->SelectObject(&ftPrint);
	CRect rc1;
	CString cs;
	int iMax = iTotItem;

	for (int i = iFirst; i < iLast; i++)
	{
		bool bIs = i < iMax;

		int box = 0;
		for (int t = 0; t < iNumCol; t++)
		{
			rc1.SetRect(rcPrint.left+pDx[t], y, rcPrint.left+pDx[t+1], y+szFtPrint.cy);
			if (bIs)
			{
				cs = pList->GetItemText(i, t);
				UINT ftm = DT_LEFT;
				if (pFormat[t]&HDF_CENTER) ftm = DT_CENTER;
				else if (pFormat[t]&HDF_RIGHT) ftm = DT_RIGHT;

				pDC->DrawText(cs, rc1, ftm|DT_VCENTER);
			}
			pDC->MoveTo(rc1.left,rc1.bottom);
			pDC->LineTo(rc1.left,rc1.top);
			pDC->LineTo(rc1.right,rc1.top);
		}
		pDC->LineTo(rc1.right,rc1.bottom);
		y += szFtPrint.cy + 1;
	}

	pDC->MoveTo(rcPrint.left,y);
	pDC->LineTo(rcPrint.right,y);
	pDC->SelectObject(oft);

	
	rcPrint = pInfo->m_rectDraw;
	SubtractMargin(pDC, rcPrint);
	rcPrint.top = rcPrint.bottom - szFoot.cy;

	PrintListFoot(pDC, rcPrint, false);
	PrintPageFoot(pDC, rcPrint, false);
	
	pDC->SetBkMode(obkm);
}

void CFeeView::OnPrintSetprinter() 
{
	// TODO: Add your command handler code here
	CPrintDialog pd(TRUE);
	AfxGetApp()->DoPrintDialog(&pd);
}

void CFeeView::OnPrintSetfont() 
{
	// TODO: Add your command handler code here
	CprintsetfontDlg setfontdlg;
	int nResponse;	
	nResponse=setfontdlg.DoModal();
	if (nResponse!=IDOK)
	{
		return;
	}

}

void CFeeView::OnPrintSetmargin() 
{
	// TODO: Add your command handler code here
	CprintsetmaginDlg setmagindlg;
	int nResponse;	
	nResponse=setmagindlg.DoModal();
	if (nResponse!=IDOK)
	{
		return;
	}	
}


bool bGfxUserAbort;

BOOL CALLBACK EXPORT _GfxAbortProc( HDC, int )
{
	MSG msg;
	while (!bGfxUserAbort && ::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE))
	{
		if (!AfxGetThread()->PumpMessage()) return FALSE;
	}
	return !bGfxUserAbort;
}

void CFeeView::OnPrinttable() 
{
	// TODO: Add your command handler code here
	CPrintInfo printInfo;
	ASSERT(printInfo.m_pPD != NULL);    // must be set

	if (OnPreparePrinting(&printInfo))
	{
		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)
		{
			// 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();
		}
		DOCINFO docInfo;
		memset(&docInfo, 0, sizeof(DOCINFO));
		docInfo.cbSize = sizeof(DOCINFO);
		strTitle="twd charging system";
		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;
			nFormatID = AFX_IDS_PRINTTOFILE;
		}
		// setup the printing DC
		CDC dcPrint;
		dcPrint.Attach(printInfo.m_pPD->m_pd.hDC);  // attach printer dc
		dcPrint.m_bPrinting = TRUE;
		printInfo.m_rectDraw.SetRect(0, 0, dcPrint.GetDeviceCaps(HORZRES), dcPrint.GetDeviceCaps(VERTRES));
		dcPrint.DPtoLP(&printInfo.m_rectDraw);
		
		OnBeginPrinting(&dcPrint, &printInfo);
		dcPrint.SetAbortProc(_GfxAbortProc);
		// disable main window while printing & init printing status dialog
		CString csFormat, cs, strTemp;
		AfxGetMainWnd()->EnableWindow(FALSE);
		/*
		CPrintStatus dlgPrintStatus(pParent);
		cs.Format("Stampa di %s in corso ..", strTitle);
		dlgPrintStatus.SetWindowText(cs);
		
		dlgPrintStatus.GetDlgItemText(IDC_TEXT1, csFormat);
		AfxFormatString1(strTemp, nFormatID, strPortName);
		cs.Format(csFormat, strTitle, printInfo.m_pPD->GetDeviceName(), strTemp);
		dlgPrintStatus.SetDlgItemText(IDC_TEXT1, cs);
		dlgPrintStatus.ShowWindow(SW_SHOW);
		dlgPrintStatus.UpdateWindow();
		*/
		// start document printing process
		if (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;
		int iPageTot = abs(abs(nEndPage) - abs(nStartPage)), iPrintedPages = 0;
		CString csPageFormat;
		//dlgPrintStatus.GetDlgItemText(IDC_PAGES, csPageFormat);
		// begin page printing loop
		DWORD dwStart = GetTickCount(), dTickPerPage = 0;

		//dlgPrintStatus.wndProg.SetRange(0, iPageTot);
		//dlgPrintStatus.wndProg.SetPos(0);

		bool bRectSet = false;
		BOOL bError = FALSE;
		for (printInfo.m_nCurPage = nStartPage; printInfo.m_nCurPage != nEndPage; printInfo.m_nCurPage += nStep)
		{
			TCHAR szBuf[80];

			iPrintedPages ++;
			//dlgPrintStatus.wndProg.SetPos(iPrintedPages);
			//dlgPrintStatus.wndProg.UpdateWindow();

			wsprintf(szBuf, "%d %%", iPrintedPages*100/iPageTot);
			//dlgPrintStatus.SetDlgItemText(IDC_PC, szBuf);

			OnPrepareDC(&dcPrint, &printInfo);
			// check for end of print
			if (!printInfo.m_bContinuePrinting) break;
			// write current page

			DWORD tck = dTickPerPage * (iPageTot - iPrintedPages + 1) / 1000;
			if (tck > 60)
			{
				tck |= 60;//tck != 60;
				DWORD tckS = tck%60;
				tck /= 60;
				strTemp.Format("%d minuti, %d secondi", tck, tckS);
			}
			else
			{
				if (iPageTot > 1)
				{
					if (tck > 0) strTemp.Format("%d secondi", tck);
					else strTemp = "??";
				}
			}
			wsprintf(szBuf, csPageFormat, iPrintedPages, iPageTot, strTemp);
			//dlgPrintStatus.SetDlgItemText(IDC_PAGES, szBuf);

			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;
			}
			OnPrepareDC(&dcPrint, &printInfo);
			ASSERT(printInfo.m_bContinuePrinting);
			// page successfully started, so now render the page
			int is = dcPrint.SaveDC();
			OnPrint(&dcPrint, &printInfo);
			if (dcPrint.EndPage() < 0 || !_GfxAbortProc(dcPrint.m_hDC, 0))
			{
				bError = TRUE;
				break;
			}
			dcPrint.RestoreDC(is);

			dTickPerPage = (GetTickCount() - dwStart) / iPrintedPages;
		}
		// cleanup document printing process
		//dc.SelectObject(def_font); //恢复原来的字体
		
		ftPrint.DeleteObject();
		ftHead.DeleteObject();
		ftFoot.DeleteObject();
		//font.DeleteObject(); 
		dcPrint.EndPage(); //通知打印机驱动程序页结束
		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
		//
		DeleteDC(dcPrint.Detach());
		if (iNumCol) 
		{
			if (pDx) delete [] pDx;
			if (pFormat) delete [] pFormat;
			if (pColTitle)
			{
				for (int t = 0; t < iNumCol; t++)
					if (pColTitle[t]) delete [] pColTitle[t];
				delete [] pColTitle;
			}
		}
		//
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?