📄 myprint.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 + -