CListCtrl的打印及预览

cjpx84 操作系统及支撑软件开发工程师  2008-04-12 05:01:01
大家好
我想实现CListCtrl中的内容的打印,要有预览功能,我的程序是基于对话框结构的.其中要打印出CListCtrl中的标题和内容,要能够自动分页,在网上找了好久都没有找到有用的.希望大家能够帮帮我实现这个功能.
...全文
317 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
不会,帮顶
回复
cjpx84 2008-04-22
顶一下,9楼的朋友,发一下啊
回复
tianloveyou 2008-04-16
一个函数就OK了。

看看修改一下啦

BOOL PrintKq_Deal_QueryCtrl(CListCtrl &list) //请假信息的打印
{

HFONT hRecordFont;//记录的字体

HFONT hTopicFont;//标题的字体

HFONT hCodeFont;//字段的字体

//创建(输出内容的)字体

hRecordFont=CreateFont(93,29,1,0,FW_EXTRALIGHT,0,0,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
"宋体字");
//创建标题的字体

hTopicFont=CreateFont(260,47,10,0,FW_BOLD,0,0,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
"楷体_GB2312");
//创建字段的字体

hTopicFont=CreateFont(150,21,1,0,FW_BOLD,0,0,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
"楷体_GB2312");
//设置打印对话框

PRINTDLG pd;

pd.lStructSize=sizeof(PRINTDLG);

pd.Flags=PD_RETURNDC;

pd.hDC=NULL;

pd.hwndOwner=NULL;

pd.hInstance=NULL;

pd.nMaxPage=2;

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 = 20;//页边的空白

int nYMargin = 6;

///////////////////////////////////////////////////////////

TEXTMETRIC tm;/*映射结构体*/

GetTextMetrics(pd.hDC, &tm);

int nCharWidth = tm.tmAveCharWidth;

int ncaps=(tm.tmPitchAndFamily &1?3:2)*nCharWidth/2;

int nCharHeight =tm.tmExternalLeading +tm.tmHeight+ncaps;//

///////////////////////////////////////////////////////////

CHeaderCtrl* pHeader = list.GetHeaderCtrl();

//获得行,列的个数

int nColCount = pHeader->GetItemCount();//获取列头的个数

int nLineCount = list.GetItemCount(); //获取ListCtrl的记录行数

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 = "考勤报表";

di.lpszOutput = (LPTSTR)NULL;

di.lpszDatatype = (LPTSTR)NULL;

di.fwType = 0;

StartDoc(pd.hDC,&di);

StartPage(pd.hDC);

SelectObject(pd.hDC,hTopicFont);

TextOut(pd.hDC,nHorRes/3,nYMargin,"考 勤 报 表",strlen("考 勤 报 表"));

////////////////////////////////////////////////

//调整各列的宽度,以使各列在后面的打印输出时更均匀的打印在纸上.

int space =(nHorRes-nXMargin*nCharWidth-nColX)/(nColCount);
for(i=1;i<nColCount;i++)
{
ca[i].nPrintX+=i*space;
}
SelectObject(pd.hDC,hCodeFont);

//输出列标题

for(i =0;i<nColCount;i++)

TextOut(pd.hDC,ca[i].nPrintX,nYMargin+260,
ca[i].strColText,strlen(ca[i].strColText));

int nMaxLinePerPage =nVerRes/nCharHeight -3;

int nCurPage=1;

SelectObject(pd.hDC,hRecordFont);//将字体选入设备描述表里
//输出各列的数据
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].nColIndex);

TextOut(pd.hDC,ca[j].nPrintX,
nYMargin+300+(i+1-(nCurPage-1)*nMaxLinePerPage)*nCharHeight,
subitem,strlen(subitem));
}
}

EndPage(pd.hDC);

EndDoc(pd.hDC);

//打印结束

DeleteObject(hTopicFont);

DeleteObject(hRecordFont);

DeleteObject(hCodeFont);

DeleteDC(pd.hDC);

return TRUE;
}
回复
cjpx84 2008-04-16
谢谢
lijiazheng2005@163.com
回复
cjpx84 2008-04-15
是的,我在对话框中加入了一个列表控件,通过查询数据库把数据库中的记录放入到列表控件中,我想把其中的内容打印出来,就像DOC-VIEW结构一样可以有打印预览功能
回复
蒋晟 2008-04-15
在没有针对你的问题的方案的时候,分解你的问题成比较简单的问题,一个一个解决
你说的大印预览是什么意思?你的列表不是所见即所得?
回复
suterfo 2008-04-15
[Quote=引用楼主 cjpx84 的帖子:]
大家好
我想实现CListCtrl中的内容的打印,要有预览功能,我的程序是基于对话框结构的.其中要打印出CListCtrl中的标题和内容,要能够自动分页,在网上找了好久都没有找到有用的.希望大家能够帮帮我实现这个功能.
[/Quote]

邮箱留下,发个程序给你参考.
回复
蒋晟 2008-04-15
打印和预览你得自己定义格式,一般都要额外加表头
回复
cjpx84 2008-04-13
怎么没有人顶啊
自己在顶一下
回复
cjpx84 2008-04-12
这个是直接打印的,没有预览功能,还有我控件中的内容是动态变化的
回复
CathySun118 2008-04-12
http://www.programbbs.com/doc/1428.htm
回复
cjpx84 2008-04-12
都是文档视图结构的,有没有基于对话框的啊!这个问题困了我好久了,能不能把代码帖出来,谢谢
回复
mr.zhoux 2008-04-12
http://www.codeproject.com/KB/combobox/listprint.aspx

看看这个~:)
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-12 05:01
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……