没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
VC 实现打印功能
介绍: 这一段代码,用以演示《如何在 VC++中使用 API 直接打印》。并且该段代码可以直接嵌入各种工程中,有实际
使用的价值。
用途: 在 Visual C++中,应用程序通常是使用 CView 中提供的打印功能,在 OnPrint()或 OnDraw()中向打印
机输出。但是对于对话框中的数据,或基于对话框的程序,打印成了一件繁琐的工作。
该段代码向用户提供了 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;
//检索各列的信息,确定列标题的内容长度。
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;
}
CreateDC,(CreatePrinterDC 内部也是调用的它)。
CreateDC(_T("WINSPOOL"),name, NULL, data);
打印机一般用 WINSPOOL, name 可以通过 EnumDisplayDevices 来得到打印
设备名称。data 可以看 MSDN 上的说明来设置,也就是打印 DPI,纸张宽度高
度,颜色等信息,没什么难的,开始你设置为 NULL 试试
http://blog.csdn.net/xgx198831/article/details/7024949
vc
实现打印功能
分类: VC 6.0/MFC 2011-11-29 21:16 8036 人阅读 评论(4) 收藏 举报
nullwindows 报表 api 文档 xp
Visual C++6.0 是开发 Windows 应用程序的强大工具,但是要通过它实现
程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在 VC 中实
现打印功能,他们往往感到在 MFC 提供的框架内实现这个问题很复杂,不知道
如何下手。本例针对这个问题,介绍一种简单的方法实现文字串的打印功能,读
者朋友可以在此基础上稍微改动一下,就可以实现文件、图像的打印功能。
一、实现方法
在 Windows 操作系统下,显示器、打印机和绘图仪都被视为输出设备,
正常情况下,系统默认的输出设备是显示器。要使用打印机,首先需要创建一个
指向打印机的设备环境句柄,然后通过该句柄调用相关的绘图函数把所需的文字
和图形输出至打印机上。当打印结束后,删除这个设备环境句柄即可。
当 Windows 系统中安装好打印机后,系统总是自动设置一个打印机为系
统的默认打印机,在 Windows 的启动配置文件 Win.ini 中的[window]段中列出
了带有关键字 device 的默认打印机。下面是某一机器中 Win.ini 中的
[Windows]字段的内容:
[windows]
load=
run=
NullPort=None
device=HP LaserJet 4050(computer000),HPBFDB1,LPT1
在上述关键字 device 后的字符串中,包含了系统中默认打印机的三个重
要属性,它们依次是打印机的设备名 HP LaserJet 4050(computer000),驱
动程序名是 HPBFDB1,输出端口为 LPT1。
为了操纵系统默认的打印机,实现程序的打印功能,在程序中可调用 API
函数 GetPro/leString()从 Win.ini 文件中获得 device 这个设备字符串,该
函数的原型为:DWORD GetPro/leString( LPCTSTR lpAppName,
LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString,
DWORD nSize)。函数中 lpAppName 参数为所要检索的 Win.ini 文件中的字
段名;lpKeyName 为字段中的关键字名;lpDefault 为默认的字符串;
lpReturnedString 为检索到的字符串,如果该函数没有从 lpKeyName 关键
字中检索到相应的字符串,则 kpRetrunedString 返回默认字符串
lpDefault;nSize 为返回字符串的长度。
获取上述字符串后,再使用 strtok()函数将该字符串进行分解,获得与打
印机相关的三个属性,作为 API 函数 CreateDC()创建打印机设备环境句柄的
参数,CreateDC()函数如果调用成功,则为默认打印机创建一个设备环境句
柄,否则返回一个空值(NULL)。该函数的原形为:HDC CreateDC(LPCTSTR
lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,CONST
DEVMODE *lpinitData)。该函数的前三个参数恰好对应打印机的三个属性,
最后一个参数为初始化打印机驱动程序的数据,一般情况下该参数设置为
NULL 就可以了。
在具体打印的过程中,调用 int StartDoc( HDC hdc, CONST DOCINFO
*lpdi )函数来开始一个打印任务,其中参数 lpdi 为一个指向 DOCINFO 结构的
指针,该结构如下:
typedef struct {
int cbSize; //结构的尺寸大小;
LPCTSTR lpszDocName; //文档的名字;
LPCTSTR lpszOutput; //输出文档名,一般情况下为 NULL;
LPCTSTR lpszDatatype;//用来记录打印过程的数据类型,一般情况下为 NULL;
DWORD fwType; //用来支持打印工作的额外
信息,一般情况下为 NULL;
} DOCINFO, *LPDOCINFO;
开始一个打印任务后,再调用 StartPage(hdcprint)函数让打印机走纸,通知打印机有文档将要打印;接下来的工作
就是输出数据了,这部分工作对于开发人员来说就象往计算机屏幕上输出文字、图像一样容易,只不过是计算机根据
当前的设备环境句柄自动将数据输出到打印机罢了。数据打印完后,需要作一些善后处理工作,使用
RestoreDC(hdcprint,-1)函数恢复打印机设备句柄、EndPage(hdcprint)函数让打印机停止打印,最后调用
EndDoc(hdcprint)函数结束上述的打印作业。
二、编程步骤
1、启动 Visual C++6.0,新建一个基于对话框的应用程序 Test,在程序的对话框窗体中加入一个按钮(Button),设
置这个 Button 的属性:ID=IDC_PRINT,CAPTION="打印";
2、使用 Class Wizard 类向导为该按钮添加一个鼠标单击处理函数 OnPrint()
剩余27页未读,继续阅读
资源评论
luzi1997
- 粉丝: 0
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功