如下代码运行的环境简述:
MFC的对话框界面上创建一个按钮,点击这个按钮打印界面上CListCtrl控件上现实的内容。
如果这段代码对你有帮助,请点个赞,给我一点小小鼓励,共同进步~~

void CMaxValueDlg::OnBnClickedButton4()
{//选定默认打印机CString strPrintDevice;TCHAR szBuffer[1024] = { 0 };DWORD length = 1024;int ret = ::GetDefaultPrinter(szBuffer, &length);if (ret == FALSE){ret = ::GetLastError();m_msg.Format("打印失败...");UpdateData(false);return ;}     else{strPrintDevice = szBuffer;}/*if (ret == ERROR_INSUFFICIENT_BUFFER){CString temp;temp.Format(_T("%d"), length);AfxMessageBox(CString(_T("ERROR_INSUFFICIENT_BUFFER")) + _T(" the real size is ") + temp);}else if (ret == ERROR_FILE_NOT_FOUND){AfxMessageBox(_T("ERROR_FILE_NOT_FOUND"));}*///准备打印的信息CString wndTm; wndTm.Format("%d", m_UnitWnd);CString retNum; retNum.Format("%d", m_MaxRetNum);CString startTm = m_date_s.Format("%Y-%m-%d  %H:%M:%S");CString endTm = m_date_e.Format("%Y-%m-%d  %H:%M:%S");CString lockStatus;if (m_bNeedLockCheck)lockStatus.Format("%d", i_locktime);elselockStatus = "否";CString fLimit; if (m_bCheckLimit)fLimit.Format("%f", m_fLimit);elsefLimit = "否";//this->UpdateData();CString strMessage;CString title;title.Format("%s-电流极大值统计表", c_name);strMessage.AppendFormat("              %s \t\t\r\n", title);strMessage.Append("---------------------------------------------------------------\r\n");strMessage.AppendFormat("起始日期     %s \t\t\r\n", startTm);strMessage.AppendFormat("截止日期     %s \t\t\r\n", endTm);strMessage.AppendFormat("单元数据窗   %s \t\t\r\n", wndTm);strMessage.AppendFormat("最大值数量   %s \t\t\r\n", retNum);strMessage.AppendFormat("过滤闭锁     %s \t\t\r\n", lockStatus);strMessage.AppendFormat("过滤极差     %s \t\t\r\n\r\n", fLimit);strMessage.Append("---------------------------------------------------------------\r\n");strMessage.Append(" 序号    极大值    相别    不平衡度            记录时间            \r\n");strMessage.Append("---------------------------------------------------------------\r\n");CString buf[10000][6]; int count = c_list.GetItemCount();int colm = c_list.GetHeaderCtrl()->GetItemCount();for (int i = 0; i < count; i++) {for (int j = 0; j < colm; j++) {buf[i][j] = c_list.GetItemText(i, j);}strMessage.AppendFormat("%5d    %s     %s      %s        %s        \r\n", atoi(buf[i][0]), buf[i][1], buf[i][2], buf[i][3], buf[i][4]);}DWORD dwFlag = PD_ALLPAGES | PD_NOPAGENUMS | PD_USEDEVMODECOPIES | PD_HIDEPRINTTOFILE;  //打印配置界面的按钮可用性,因为后台打印,其实这个配置没什么意义  CPrintDialog pPrintdlg(FALSE, dwFlag, this);                                            //CPrintDialog实例化,因为MFC的打印设备无关性,可以理解为这就是一台打印机  HGLOBAL hDevMode = NULL;HGLOBAL hDevNames = NULL;if (GetPrinterDevice(strPrintDevice.GetBuffer(0), &hDevNames, &hDevMode))               //获得指定打印机的配置、名字  AfxGetApp()->SelectPrinter(hDevNames, hDevMode);elseAfxMessageBox(_T("Failed to select custom printer"));strPrintDevice.ReleaseBuffer();pPrintdlg.m_pd.hDevMode = hDevMode;                                                     //让pPrintdlg使用我们指定的打印机  pPrintdlg.m_pd.hDevNames = hDevNames;CDC dc;dc.Attach(pPrintdlg.CreatePrinterDC());                                                 //后台打印创建法,如果需要弹出打印对话框,用DoModal  DOCINFO di;di.cbSize = sizeof(DOCINFO);di.lpszDocName = _T("电流极大值统计表打印");di.lpszDatatype = NULL;di.lpszOutput = NULL;di.fwType = 0;dc.StartDocA(&di);dc.StartPage();dc.SetMapMode(MM_TEXT);CRect recPrint(0, 0, dc.GetDeviceCaps(LOGPIXELSX), dc.GetDeviceCaps(LOGPIXELSY));dc.DPtoLP(&recPrint);dc.SetWindowOrg(0, 0);dc.SetTextAlign(TA_TOP | TA_LEFT);CFont newFont;VERIFY(newFont.CreatePointFont(160, _T("宋体"), &dc));dc.SelectObject(&newFont);CString strPrint;int nIndex = 0;int x = 50;int y = 50;/*CSize textSize;textSize = dc.GetTextExtent(_T("00"), 2);*///根据当前字体的宽、高,后面以此高度为行高  int sn = 0;//开始打印//BOOL bPrinting = dc.StartDoc(&di);//dc.StartPage();while ((nIndex = strMessage.Find(_T("\r\n"))) > -1)                  //将strMessage内容打印,支持换行,一次换行等于'\r\n',所以在开头strMessage += _T("\r\n")  {CSize textSize;textSize = dc.GetTextExtent(_T("00"), 2);int abc = strMessage.Find(_T("\r\n"));int ppp = sn++;strPrint = strMessage.Left(nIndex);strMessage = strMessage.Mid(nIndex + 2);         dc.TextOutA(x, y, strPrint);y += textSize.cy;    if (sn % 50 == 0){dc.EndPage();    dc.StartPage();         x = 50;y = 50;            }}dc.EndPage();//if (bPrinting)//{//    dc.EndDoc();//}//else//{//  dc.AbortDoc();//}       newFont.DeleteObject();dc.EndPage();dc.EndDoc();DeleteDC(dc.Detach());m_msg.Format("打印完毕...");UpdateData(false);
}bool CMaxValueDlg::GetPrinterDevice(LPTSTR pszPrinterName, HGLOBAL* phDevNames, HGLOBAL* phDevMode)
{// TODO: 在此处添加实现代码.//if NULL is passed, then assume we are setting app object's  //devmode and devnames  if (phDevMode == NULL || phDevNames == NULL)return FALSE;// Open printer  HANDLE hPrinter;if (OpenPrinter(pszPrinterName, &hPrinter, NULL) == FALSE)return FALSE;// obtain PRINTER_INFO_2 structure and close printer  DWORD dwBytesReturned, dwBytesNeeded;GetPrinter(hPrinter, 2, NULL, 0, &dwBytesNeeded);PRINTER_INFO_2* p2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR,dwBytesNeeded);if (GetPrinter(hPrinter, 2, (LPBYTE)p2, dwBytesNeeded,&dwBytesReturned) == 0) {GlobalFree(p2);ClosePrinter(hPrinter);return FALSE;}ClosePrinter(hPrinter);// Allocate a global handle for DEVMODE  HGLOBAL  hDevMode = GlobalAlloc(GHND, sizeof(*p2->pDevMode) +p2->pDevMode->dmDriverExtra);ASSERT(hDevMode);DEVMODE* pDevMode = (DEVMODE*)GlobalLock(hDevMode);ASSERT(pDevMode);// copy DEVMODE data from PRINTER_INFO_2::pDevMode  memcpy(pDevMode, p2->pDevMode, sizeof(*p2->pDevMode) +p2->pDevMode->dmDriverExtra);GlobalUnlock(hDevMode);// Compute size of DEVNAMES structure from PRINTER_INFO_2's data  DWORD drvNameLen = lstrlen(p2->pDriverName) + 1;  // driver name  DWORD ptrNameLen = lstrlen(p2->pPrinterName) + 1; // printer name  DWORD porNameLen = lstrlen(p2->pPortName) + 1;    // port name  // Allocate a global handle big enough to hold DEVNAMES.  HGLOBAL hDevNames = GlobalAlloc(GHND,sizeof(DEVNAMES) +(drvNameLen + ptrNameLen + porNameLen) * sizeof(TCHAR));ASSERT(hDevNames);DEVNAMES* pDevNames = (DEVNAMES*)GlobalLock(hDevNames);ASSERT(pDevNames);// Copy the DEVNAMES information from PRINTER_INFO_2  // tcOffset = TCHAR Offset into structure  int tcOffset = sizeof(DEVNAMES) / sizeof(TCHAR);ASSERT(sizeof(DEVNAMES) == tcOffset * sizeof(TCHAR));pDevNames->wDriverOffset = tcOffset;memcpy((LPTSTR)pDevNames + tcOffset, p2->pDriverName,drvNameLen * sizeof(TCHAR));tcOffset += drvNameLen;pDevNames->wDeviceOffset = tcOffset;memcpy((LPTSTR)pDevNames + tcOffset, p2->pPrinterName,ptrNameLen * sizeof(TCHAR));tcOffset += ptrNameLen;pDevNames->wOutputOffset = tcOffset;memcpy((LPTSTR)pDevNames + tcOffset, p2->pPortName,porNameLen * sizeof(TCHAR));pDevNames->wDefault = 0;GlobalUnlock(hDevNames);GlobalFree(p2);   // free PRINTER_INFO_2  // set the new hDevMode and hDevNames  *phDevMode = hDevMode;*phDevNames = hDevNames;return TRUE;
}

MFC项目有关打印功能(支持分页打印)相关推荐

  1. lodop实现打印,支持分页打印

    1.官网下载 http://www.lodop.net/download.html 建议下载"Lodop最新综合版"和"最新技术手册" 2.安装相应的文件(in ...

  2. 金蝶KIS商贸版实现'条码标签打印'功能进行商品条码打印

    金蝶KIS商贸版.专业版实现'条码标签打印'功能进行商品条码打印,减少条码打印工作量: 同时可实现在业务单据中,进行类似操作. 支持普通打印机A4页面打印或立象条码打印机.SATO CX400.Zeb ...

  3. html打印表格自动分页,Web分页打印 细线表格+分页打印之终极攻略

    Web分页打印 细线表格+分页打印之终极攻略 发布时间:2009-03-01 23:46:40   作者:佚名   我要评论 最近给客户做打印的时候,客户提出打印时不要打印该页面的头,只是打印表格里面 ...

  4. html分页表格中的线条,HTML_Web分页打印 细线表格+分页打印之终极攻略,最近给客户做打印的时候,客 - phpStudy...

    Web分页打印 细线表格+分页打印之终极攻略 最近给客户做打印的时候,客户提出打印时不要打印该页面的头,只是打印表格里面的内容,因为头部有背景和打印按钮,而且要细线表格的那种,我想细线表格不是很简单吗 ...

  5. WEB打印-网页打印功能(带分页、可多页打印)

    <html> <head> <title>Web打印</title> <meta http-equiv="Content-Type&qu ...

  6. java实现分页打印功能_分页功能的java实现

    最近做一个项目,要用到分页功能,参考了很多方法,有的不合适,有的不喜欢,于是自己在他们的基础上整了一个:思路是这样的:先把需要分页的数据或是记录都查询出来 存入一个集合类里如List或是Vector, ...

  7. vue 实现打印与批量分页打印功能

    安装 npm install print-js --save main.js 引入 import Print from 'vue-print-nb'Vue.use(Print) // 注册 3.打印效 ...

  8. vue打印问题(分页打印、批量打印条形码)

    前言 项目需求打印功能所遇到的问题.在此记录,望能帮到你 一下问题: 当内容超过一页时不会自动分页? 当使用vue3-barcode 打印条形码时,不能批量打印? 基础打印 安装 官网地址:https ...

  9. qt的qprinter打印功能怎么设置打印时字体大小_如何打印一份成绩单

    学校考试之后,要看自己班的成绩,要打印自己班的成绩. 需要进行以下操作,设置好后,只打印自己班的那页就可以了. 惯用WPS,本文一些方法可能仅适用WPS.因为EXCEL的打印预览我没有掌握. 一.冻结 ...

最新文章

  1. AAAI 2020论文解读:商汤科技发布新视频语义分割和光流联合学习算法
  2. R语言all函数、any函数判断逻辑向量(logical vector)实战
  3. java内部类的作用
  4. 清橙 A1120 拦截导弹 -- 动态规划(最长上升子序列)
  5. 【渝粤题库】广东开放大学 社会保障法 形成性考核
  6. [工具类]DataTable与泛型集合List互转
  7. 游戏用计算机配置表显卡,5000元电脑配置9代i5配GTX1660TI显卡配置清单(可装Win7)...
  8. android studio更改代码字体,Android Studio怎么改变代码字体大小?
  9. 计算机硬件基本常识面试,硬件工程师面试题集(含答案_很全)要点
  10. oracle智能便携投影机,小火投影S10评测:让人眼前一亮的便携智能投影仪
  11. Google Code Jam 2010 Qualification Round 资格赛 Problem A. Snapper Chain 问题A.按扣链条
  12. GTA5怎么快速吃零食 回血
  13. 终结HashMap面试?我是谁?我在哪
  14. 我的世界服务器怎么弄无限矿物,minecraft mod教程:在世界上生成矿石:GameRegistry的使用5...
  15. win10右键卡顿原因_win10右键新建特别慢怎么办_解决win10右键新建卡顿的方法
  16. 工科学术论文书写攻略
  17. STM32控制电机简易教程
  18. 阿里云ONS消息队列入门指南
  19. 任性杭州,骨感北京——面试汇总
  20. 简单便宜智能家居解决方案

热门文章

  1. java程序设计实用教程第4版_Java程序设计实用教程(第4版)
  2. C++编程练习:计算长方体体积、对象数组求学生成绩最高者、销售应用问题、重载复数加法运算
  3. 【OpenGL ES】着色器Shader与程序Program
  4. program和module区别
  5. CVE-2010-2729(MS10-061)
  6. 数据库 7---SQL语言复杂查询与视图
  7. 我上了个假“中台”!
  8. python开发项目管理平台_基于Python的软件项目管理系统.doc
  9. 必测的支付漏洞(一)——使用fiddler篡改支付金额
  10. R语言使用caret包的confusionMatrix函数计算混淆矩阵、基于混淆矩阵的信息手动编写函数计算Specificity、特异度指标