printlist.cpp

来自「偶作的毕业设计程序」· C++ 代码 · 共 143 行

CPP
143
字号
// PrintList.cpp: implementation of the PrintList class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "softdocsystem.h"
#include "PrintList.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

PrintList::PrintList()
{

}

PrintList::~PrintList()
{

}

bool PrintList::PrintListCtrl(CListCtrl &list)
{

	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;

	//显示打印对话框,由用户来设定纸张大小等。
	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;

	//检索各列的信息,确定列标题的内容长度。
	for(int i =0 ; i< nColCount; i++)
	{
		ca[i].nColIndex = ColOrderArray[i];
		LVCOLUMN lvc;
		char 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;
		nColX += nCharWidth * strlen(ca[i].strColText);

		if(nColX > nHorRes) 
		{
			DeleteDC(pd.hDC);
			AfxMessageBox("字段太多,无法在一行内打印,请试用较大的纸,或横向打印。");
			return FALSE;
		}

  
	}

	DOCINFO di;
	di.cbSize = sizeof(DOCINFO);
	di.lpszDocName = "ListCtrl Data Printing"; 
	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(i =1; i<nColCount; i++)
	{
		ca[i].nPrintX += i*space;
	}
	
	//输出列标题
	for(i =0; i<nColCount; i++)
		TextOut(pd.hDC, ca[i].nPrintX, nYMargin, 
			ca[i].strColText, strlen(ca[i].strColText));
	
	int nMaxLinePerPage = nVerRes/nCharHeight -3;
	int nCurPage =1;
	//输出各列的数据
	for(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);
			TextOut(pd.hDC, ca[j].nPrintX, 
					nYMargin+(i+1-(nCurPage-1)*nMaxLinePerPage)*nCharHeight, 
					subitem, strlen(subitem));
		}
	}
	
	EndPage(pd.hDC);
	EndDoc(pd.hDC);
//打印结束
	DeleteDC(pd.hDC);
	return TRUE;
}

⌨️ 快捷键说明

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