打印CListCtrl内容

使用VC的朋友都感觉到打印是VC中比较难掌握的,这里涉及到坐标系的一系列转换,下面的代码只要你能获取到列表的指

针,它就能帮你完成打印过程,非常简单。代码如下: typedef struct tagColAtt {  int nColIndex;  CString strColText;  int nPrintX;  int nSubItemIndex; }COLATT;

BOOL 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; }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值