谁有CListCtrl控件可以把其中的数据库打印出来的功能! up! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谢谢liuhongyong(荒原困兽)兄,发过来参考一下把! //该结构用于存储各列的信息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;} C语言中如何截取字符串。 关于OCX的里动态生成的控件的消息响应 有谁知道QQ的窗体标题是什么? 大家讨论一下机器人视觉的循线算法。 帮帮我,关于提取数据的问题?? dll 文件格式, 如何使用未知DLL函数接口 终于能发贴了... 为什么函数使用前要申明,变量使用前声明有好处,可是函数呢 dll中不能输出创建对话框的函数吗? 求问:MFC文件读取 ******100分请教各位最简单的一个问题,怎样在对话框工程中加入ToolBar???****** mfc类中最主要的几个类是什么?
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;
}