如何在VC++中使用API直接打印

转载 2004年10月29日 13:20:00

Visual  C++中,应用程序通常是使用CView中提供的打印功能,在OnPrint()或OnDraw()中向打印机输出。但是对于对话框中的数据,或基于对话框的程序,打印成了一件繁琐的工作。  
 
该段代码向用户提供了PrintListCtrl()函数,用于打印用户在对话框或FormView中的CListCtrl(控件必须是Report  View  形式的)控件中的内容。在打印过程中,根据控件中每列标题的宽度计算打印输出时各列的宽度,并根据数据的行数自动分页。在本代码的基础上稍作修改,就可以适应各种数据的输出。  
 
(用法:)该段代码使用Visual  C++  6.0,  使用Windows  API来完成所需功能,使用时将本文本作为头文件使用。打印时直接调用PrintListCtrl(),函数的参数为所要打印的ListCtrl。?联系方法:lff@mail.wl.xj.cn  
 
*///该结构用于存储各列的信息  
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;  
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

如何在VC++中使用API直接打印

在Visual  C++中,应用程序通常是使用CView中提供的打印功能,在OnPrint()或OnDraw()中向打印机输出。但是对于对话框中的数据,或基于对话框的程序,打印成了一件繁琐的工作。  ...
  • happyparrot
  • happyparrot
  • 2004年10月29日 13:20
  • 955

在VC++中使用API直接打印

介绍: 这一段代码,用以演示《如何在VC++中使用API直接打印》。并且该段代码可以直接嵌入各种工程中,有实际使用的价值。   用途: 在Visual C++中,应用程序通常是使用CView中提供的打...
  • guoxiaoli
  • guoxiaoli
  • 2005年11月14日 15:14
  • 630

在VC++中直接调用API执行打印任务

介绍: 这一段代码,用以演示《如何在VC++中使用API直接打印》。并且该段代码可以直接嵌入各种工程中,有实际使用的价值。 用途:在Visual C++中,应用程序通常是使用CView中提供的打印功能...
  • dragoo1
  • dragoo1
  • 2017年01月17日 21:32
  • 563

键盘记录及自动发送VC++实现

键盘记录及自动发送VC++实现   正文: 首先我想向大家说明的是: 1、   现在这个软体已经被某些杀毒软件(nod32、瑞星等)偶尔报为病毒了; 2、   本软件仅供学习使用; 3、  ...
  • liulianglin
  • liulianglin
  • 2014年01月22日 12:56
  • 1045

在VC++中创建的项目中添加一个资源文件

初学者有的时候可能会遇到这样的问题,我们想在VC++创建的项目中添加一个资源文件,在一开始添加的时候我们在项目中添加资源文件,新建一个文本文件然后命名为.rc的文件类型的文件,但是有的时候往往出现载入...
  • datouniao1
  • datouniao1
  • 2015年11月09日 22:25
  • 2016

如何在VC++中使用注册表

如今修改注册表成为继超频之后的又一大热点,许多CFAN通过对注册表的修改使Win98显得更加个性化,诸多报刊杂志也纷纷扯起注册表这面旗帜,令人遗憾的是,在介绍注册表修改的众多的文章中,大都以手工修改为...
  • ycs0501
  • ycs0501
  • 2009年06月29日 17:03
  • 597

如何在VC++中使用注册表

如今修改注册表成为继超频之后的又一大热点,许多CFAN通过对注册表的修改使Win98显得更加个性化,诸多报刊杂志也纷纷扯起注册表这面旗帜,令人遗憾的是,在介绍注册表修改的众多的文章中,大都以手工修改为...
  • rider628
  • rider628
  • 2010年01月25日 00:05
  • 479

怎么导入工程到VC++中?

打开菜单“文件”-“打开” 如果你只有一个工程,一般打开.dsp,这个是生成的工程的文件,也可以打开.dsw,这个文件是根据.dsp产生的工作空间。如果你一个工作空间包含很多工程,那就直接打开.ds...
  • sqk1988
  • sqk1988
  • 2017年03月30日 17:27
  • 190

VC中鼠标移动点击操作

实例: CPoint pointOld; GetCursorPos(&pointOld); CRect rect; GetDlgItem(IDCANCEL)->GetWindowRec...
  • qiangzi4646
  • qiangzi4646
  • 2014年12月03日 11:38
  • 994

基于API函数的串口通信(方法讲解)

用到的串口通信编程方法有:使用通信控件、在高级语言中嵌入汇编以及使用API函数。在这几种方法中,使用API函数编写的串口通信程序最为高效、灵活。串口通信编程将用到三种API函数 ——串口通信相关API...
  • godlove_ymx
  • godlove_ymx
  • 2014年02月19日 10:34
  • 1226
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在VC++中使用API直接打印
举报原因:
原因补充:

(最多只允许输入30个字)