CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

如何将CListCtrl中的数据打印出来?(请教高手)急!

楼主jackgao1976(jackgao1976)2003-08-01 15:54:06 在 VC/MFC / 界面 提问

如何将CListCtrl中的数据打印出来,是否有最简便的方法??? 问题点数:0、回复次数:4Top

1 楼c0der()回复于 2003-08-01 16:06:58 得分 0

该段代码向用户提供了PrintListCtrl()函数,用于打印用户在对话框或FormView中的CListCtrl(控件必须是Report   View   形式的)控件中的内容。在打印过程中,根据控件中每列标题的宽度计算打印输出时各列的宽度,并根据数据的行数自动分页。在本代码的基础上稍作修改,就可以适应各种数据的输出。    
   
    用法:   该段代码使用Visual   C++   6.0,   使用Windows   API来完成所需功能,使用时将本文本作为头文件使用。打印时直接调用PrintListCtrl(),函数的参数为所要打印的ListCtrl。    
   
  //------------------------------------  
  //该结构用于存储各列的信息  
  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;  
  Top

2 楼c0der()回复于 2003-08-01 16:08:12 得分 0

//继续  
  //检索各列的信息,确定列标题的内容长度。  
  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;  
  }  
  Top

3 楼fengqinggao(风清高)回复于 2003-08-01 17:56:44 得分 0

我用的是一个笨办法,就是循环获取所有节点的文本,添加一些格式符号(如回车、空格等)存在一个字符串中,然后存到一个临时的txt文件,然后用ShellExecute()命令打印该文件,用这个命令打印有一个最大的有点就是不用考虑分行分页的问题,如果格式要求不是很高,可以试一试。Top

4 楼jennifergiant(希罗·尤尔)回复于 2003-08-01 18:08:36 得分 0

学习中!Top

相关问题

  • 分页打印数据的问题。急!
  • == == == 横向数据显示,打印!急! == == ==
  • 怎样用asp打印数据库的报表?急急急
  • 急急急...,有关数据窗口打印的问题
  • 关于数据窗口打印的问题,急急急!!!
  • 急!!! PB打印数据窗口问题,请救救我!!!!
  • 急!!! PB打印数据窗口问题,请救救我!!!!
  • 急!!!TQUERY的数据怎样用execel打印出来?
  • 数据窗口打印显示!(在线,急!)
  • 关于数据窗口打印显示问题!!!急用!

关键词

  • 打印
  • ca
  • 数据
  • 代码
  • 控件
  • pd
  • ncolcount
  • ncolx
  • nprintx
  • strcoltext

得分解答快速导航

  • 帖主:jackgao1976

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo