⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myprint.cpp

📁 自已做的简单的库存管理软件。包含员工信息管理等
💻 CPP
字号:

#include "stdafx.h"
#include "myprint.h"

BOOL PrintListCtrl(CListCtrl &list,  CString &DocName,bool bOrientation)
{
	PRINTDLG pd;
	pd.lStructSize = sizeof(PRINTDLG);
	pd.Flags = PD_RETURNDC;
	pd.hDC = NULL;
	pd.hwndOwner = NULL;
	pd.hInstance = NULL;
	pd.nMaxPage = 1;
	pd.nMinPage = 1;
	pd.nFromPage = 1;
	pd.nToPage = 1;
	pd.nCopies = 1;
	pd.hDevMode = NULL;
	pd.hDevNames = NULL;

	LPDEVMODE   pdm;  
	if(  !AfxGetApp()->GetPrinterDeviceDefaults(&pd) ) 		
	{   
		AfxMessageBox(_T("打印机没有准备好!"));   
		return   FALSE;   
	}   
	TRACE("OnPreparePrinting   is   OK!\n");   
	
	pdm   =   (LPDEVMODE)GlobalLock(pd.hDevMode);   
	pdm->dmPaperSize   =   DMPAPER_A4;   
	if(bOrientation)
	{
		pdm->dmOrientation   =   DMORIENT_PORTRAIT; //   DMORIENT_LANDSCAPE   =   2,   DMORIENT_PORTRAIT   =   1 
	}
	else
	{
		pdm->dmOrientation   =   DMORIENT_LANDSCAPE;
	}
	GlobalUnlock(pd.hDevMode);

	//显示打印对话框,由用户来设定纸张大小等。
	if(!PrintDlg(&pd)) return FALSE; 
	ASSERT(pd.hDC!=NULL);
	int nHorRes = GetDeviceCaps(pd.hDC, HORZRES); 
	int nVerRes = GetDeviceCaps(pd.hDC, VERTRES);
	int nXMargin = 2;
	int nYMargin = 2;
	TEXTMETRIC tm;
	GetTextMetrics(pd.hDC, &tm);
	int nCharHeight = tm.tmHeight;
	int nCharWidth = tm.tmAveCharWidth;
	CHeaderCtrl* pHeader = list.GetHeaderCtrl();
	//获得行,列的个数
	int nColCount = pHeader->GetItemCount();
	int nLineCount = list.GetItemCount();
	int ColOrderArray[100];
	COLATT ca[100];
	list.GetColumnOrderArray(ColOrderArray, nColCount);
	int nColX =nXMargin*nCharWidth;


	//add by mark lee,get the large width
	int nWidth[100];
	int nTotalWidth = 0;
	for(int j =0; j<nColCount; j++)
	{
		nWidth[j] = list.GetColumnWidth(j);
		nTotalWidth = nTotalWidth + nWidth[j];
	}



	//检索各列的信息,确定列标题的内容长度。
	for(int i =0; i< nColCount; i++)
	{
		ca[i].nColIndex = ColOrderArray[i];
		LVCOLUMN lvc;
		//char text[100];
		TCHAR text[100];
		lvc.mask = LVCF_TEXT|LVCF_SUBITEM;
		lvc.pszText = text;
		lvc.cchTextMax = 100;
		list.GetColumn(ca[i].nColIndex, &lvc);
		ca[i].strColText = lvc.pszText;
		ca[i].nSubItemIndex = lvc.iSubItem;
		//ca[i].nPrintX = nColX;

		//设置打印位置
		if ( i == 0 )
		{
			ca[i].nPrintX = nXMargin * nCharWidth + 2 * nCharWidth ;
		}
		else
		{
			ca[i].nPrintX = ca[i-1].nPrintX + 7 * nCharWidth + (7 * nWidth[i-1] / 100 ) *  nCharWidth;
		}

		nColX += nCharWidth * ca[i].strColText.GetLength();
		
		if(nColX > nHorRes) 
		{
			DeleteDC(pd.hDC);
			AfxMessageBox(_T("字段太多,无法在一行内打印,请试用较大的纸,或横向打印。"));
			return FALSE;
		}
	}
	DOCINFO di;
	di.cbSize = sizeof(DOCINFO);
	
	//print Document name
	di.lpszDocName = DocName; 
	
	di.lpszOutput = (LPTSTR) NULL; 
	di.lpszDatatype = (LPTSTR) NULL; 
	di.fwType = 0; 
	StartDoc(pd.hDC, &di);
	StartPage(pd.hDC);

	
	

	/*//调整各列的宽度,以使各列在后面的打印输出时更均匀的打印在纸上。
	int space = (nHorRes-nXMargin*nCharWidth-nColX) / (nColCount -1);
	for(int i =1; i<nColCount; i++)
	{
		ca[i].nPrintX += i*space;
	}*/

	int nMaxLinePerPage = nVerRes/nCharHeight -3;
	int nCurPage =1;	
	//打印抬头
	CString str_title = DocName;
	//TextOut(pd.hDC, ca[0].nPrintX, nYMargin, str_title, str_title.GetLength());
	TextOut(pd.hDC, (nHorRes - nCharWidth * str_title.GetLength())/ 2, nYMargin, str_title, str_title.GetLength());

	//输出列标题
	for(int i = 0; i<nColCount; i++)
		TextOut(pd.hDC, ca[i].nPrintX, nYMargin+(1-(nCurPage-1)*nMaxLinePerPage)*nCharHeight, ca[i].strColText, ca[i].strColText.GetLength());

	//输出各列的数据
	for(int i =0; i<nLineCount; i++)
	{
		for(int j =0; j<nColCount; j++)
		{
			if(i+1-(nCurPage-1)*nMaxLinePerPage > nMaxLinePerPage)
			{
				//新的一页
				EndPage(pd.hDC);
				StartPage(pd.hDC);
				nCurPage ++;
			}
			//CString subitem = list.GetItemText(i, ca[j].nSubItemIndex);
			CString subitem = list.GetItemText(i,j);
			//TextOut(pd.hDC, ca[j].nPrintX, nYMargin+(i+1-(nCurPage-1)*nMaxLinePerPage)*nCharHeight, subitem, strlen((const char*)(LPCTSTR)subitem));
			TextOut(pd.hDC, ca[j].nPrintX, nYMargin+(i+2-(nCurPage-1)*nMaxLinePerPage)*nCharHeight, subitem, subitem.GetLength());
		}
	}
	EndPage(pd.hDC);
	EndDoc(pd.hDC);
	//打印结束
	DeleteDC(pd.hDC);
	return TRUE;
}

⌨️ 快捷键说明

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