CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

用MFC生成的文档应该怎样打印出来?

楼主zhangyiheng(傻瓜)2006-03-04 17:57:40 在 VC/MFC / 基础类 提问

我用list视图创建了一个SDI程序,往里面添加了一些项后,想打印出来,可是按"文件"->"打印预览"后却发现是一片空白,请问怎样才能"所见即所得"呢? 问题点数:20、回复次数:6Top

1 楼zhangyiheng(傻瓜)回复于 2006-03-04 22:43:47 得分 0

是不是打印的代码要重新写过?Top

2 楼Mackz(在相互)回复于 2006-03-05 02:02:36 得分 0

是的。  
   
  网上有个ListCtrl的打印程序,可以找找。我也正好做过一个,需要可以提供。Top

3 楼Mackz(在相互)回复于 2006-03-05 02:04:10 得分 0

 
  int   PrintListCtrl(CDC   *pDC,   CListCtrl   *pPrintList,   int   nPage,   CRect   *prcPrint)  
  {  
          static   CArray<int,   int>   aPageItem;  
          if   (!pDC)  
          {  
                  aPageItem.RemoveAll();  
                  aPageItem.Add(0);  
                  return   0;  
          }  
   
          CFont   *pFont   =   pPrintList->GetFont();  
          LOGFONT   lgFont;  
          pFont->GetLogFont(&lgFont);  
          //lstrcpy(lgFont.lfFaceName,   _T("黑体"));  
          lgFont.lfWeight   =   FW_BOLD;  
          pFont   =   new   CFont;  
          pFont->CreateFontIndirect(&lgFont);  
   
          CFont   *pFontOld   =   pDC->SelectObject(pFont);  
          CPoint   ptOrg   =   pDC->GetWindowOrg();  
   
          CHeaderCtrl   *pHeader   =   pPrintList->GetHeaderCtrl();  
          TEXTMETRIC   /*tmCtl,   */tmDC;  
          //pPrintList->GetDC()->GetTextMetrics(&tmCtl);  
          pDC->GetTextMetrics(&tmDC);  
          int   nWidth   =   0,   nMargin   =   tmDC.tmHeight,   nHeight   =   tmDC.tmHeight   +   tmDC.tmExternalLeading   +   nMargin;  
          //double   dRatio   =   (double)tmDC.tmHeight   /   (double)tmCtl.tmHeight;  
   
          HDITEM   hiItem   =   {0};  
          TCHAR     lpBuffer[256]   =   {0};  
          hiItem.mask   =   HDI_TEXT   |   HDI_WIDTH;  
          hiItem.pszText   =   lpBuffer;  
          hiItem.cchTextMax   =   250;  
          int   nColumn   =   pHeader->GetItemCount();  
          CRect   *prcItem   =   new   CRect[nColumn];  
          CString   *pstrItem   =   new   CString[nColumn];  
          for   (int   i   =   0;   i   <   nColumn;   i++)  
          {  
                  pHeader->GetItem(i,   &hiItem);  
                  prcItem[i].SetRect(nWidth,   0,   nWidth   +   hiItem.cxy,   tmDC.tmHeight);  
                  nWidth   +=   hiItem.cxy;  
                  pstrItem[i]   =   hiItem.pszText;  
                  prcItem[i].bottom   =   prcItem[i].top   +  
                          pDC->DrawText(pstrItem[i],   prcItem[i],   DT_CENTER   |   DT_WORDBREAK   |   DT_CALCRECT);  
                  prcItem[i].right   =   prcItem[i].left   +   hiItem.cxy;  
                  if   (prcItem[i].Height()   >   nHeight)  
                          nHeight   =   prcItem[i].Height()   +   nMargin;  
          }  
          CSize   szArea   =   pDC->GetWindowExt();  
          int   nWidthArea   =   abs(szArea.cx);  
          if   (nWidth   >   nWidthArea)  
          {  
                  double   dRatioWidth   =   (double)szArea.cx   /   (double)nWidth;  
                  prcItem[0].right   =   prcItem[0].left   +   int(prcItem[0].Width()   *   dRatioWidth);  
                  nWidth   =   prcItem[0].Width();  
                  for   (int   i   =   1;   i   <   nColumn;   i++)  
                  {  
                          prcItem[i].right   =   prcItem[i   -   1].right   +   int(prcItem[i].Width()   *   dRatioWidth);  
                          prcItem[i].left   =   prcItem[i   -   1].right;  
                          nWidth   +=   prcItem[i].Width();  
                  }  
          }  
          pDC->SetWindowOrg((nWidth   -   nWidthArea)   /   2,   ptOrg.y);  
          for   (int   iCol   =   0;   iCol   <   nColumn;   iCol++)  
          {  
                  CRect   rcBorder(prcItem[iCol]);  
                  rcBorder.bottom   =   rcBorder.top   +   nHeight;  
                  pDC->Rectangle(rcBorder);  
                  prcItem[iCol].OffsetRect(0,   (nHeight   -   prcItem[iCol].Height())   /   2);  
                  pDC->DrawText(pstrItem[iCol],   prcItem[iCol],   DT_CENTER   |   DT_WORDBREAK);  
          }  
          pDC->SelectObject(pFontOld);  
          pFont->DeleteObject();  
          delete   pFont;  
   
          pDC->GetTextMetrics(&tmDC);  
          nMargin   =   tmDC.tmHeight;  
          nHeight   =   tmDC.tmHeight   +   tmDC.tmExternalLeading   +   nMargin;  
   
          int   nTop   =   nHeight;  
          int   iRow   =   0;  
          for   (iRow   =   aPageItem[nPage   -   1];   iRow   <   pPrintList->GetItemCount();   iRow++)  
          {  
                  nHeight   =   tmDC.tmHeight   +   nMargin;  
                  for   (int   iCol   =   0;   iCol   <   nColumn;   iCol++)  
                  {  
                          pstrItem[iCol]   =   pPrintList->GetItemText(iRow,   iCol);  
                          prcItem[iCol].top   =   nTop;  
                          prcItem[iCol].bottom   =   nTop   +   tmDC.tmHeight;  
                          nWidth   =   prcItem[iCol].Width();  
                          prcItem[iCol].bottom   =   prcItem[iCol].top   +  
                                  pDC->DrawText(pstrItem[iCol],   prcItem[iCol],   DT_CENTER   |   DT_WORDBREAK   |   DT_CALCRECT);  
                          prcItem[iCol].right   =   prcItem[iCol].left   +   nWidth;  
                          if   (prcItem[iCol].Height()   >   nHeight)  
                                  nHeight   =   prcItem[iCol].Height()   +   nMargin;  
                  }  
                  nTop   +=   nHeight;  
                  nWidth   =   prcItem[iCol   -   1].right;  
   
                  for   (int   iCol   =   0;   iCol   <   nColumn;   iCol++)  
                  {  
                          CRect   rcBorder(prcItem[iCol]);  
                          rcBorder.bottom   =   rcBorder.top   +   nHeight;  
                          pDC->Rectangle(rcBorder);  
                          prcItem[iCol].OffsetRect(0,   (nHeight   -   prcItem[iCol].Height())   /   2);  
                          pDC->DrawText(pstrItem[iCol],   prcItem[iCol],   DT_CENTER   |   DT_WORDBREAK);  
                  }  
                  if   (nTop   +   ptOrg.y   -   pDC->GetWindowOrg().y   >   szArea.cy   -   160)  
                          break;  
          }  
          aPageItem.Add(iRow);  
   
          delete   []pstrItem;  
          delete   []prcItem;  
   
          if   (prcPrint)  
                  prcPrint->SetRect(ptOrg.x   -   pDC->GetWindowOrg().x,   ptOrg.y   -   pDC->GetWindowOrg().y,  
                          nWidth   +   ptOrg.x   -   pDC->GetWindowOrg().x,   nTop   +   ptOrg.y   -   pDC->GetWindowOrg().y);  
   
          pDC->SetWindowOrg(ptOrg);  
   
          return   iRow;  
  }  
  Top

4 楼zhangyiheng(傻瓜)回复于 2006-03-05 10:13:36 得分 0

上面这段程序是不是要在classwizard里面添加的?Top

5 楼zxw2844(赵轩)回复于 2006-03-10 11:46:40 得分 0

本人也是這個問題..  
   
  建立了個SDI程序,..建工程時,已經加入了打印功能,  
  我加入個畫圖事件,每次畫的圖都不一樣,   可是在我打印預覽時,是空白,---我又將畫圖的代碼加到OnDraw(CDC*   pDC)中去,印預覽時,也是空白,......Top

6 楼Mackz(在相互)回复于 2006-03-10 12:56:17 得分 0

PrintListCtrl是一个全局函数。当然也可以作为成员函数使用。Top

相关问题

  • 生成word文档
  • 如何生成word文档?
  • 请教:生成xml文档
  • 生成文档的问题
  • 在线生成Word文档
  • 整样直接在VB程序中调用EXCEL的打印预览功能,我已生成一个EXCEL文档???
  • 极菜的问题:在生成MFC单文档工程时,怎样不生成MFC自带的所有菜单和工具栏?
  • 用vb生成word文档,有生成表格,在word看是有表格,但打印后发现没有表格线了
  • 请教各位,在MFC自动生成的文档与视图中看到的:class CInvSet;这算什么意思???
  • MFC多文档的打印预览是怎样自动实现的?

关键词

  • 打印
  • prcitem
  • icol
  • tmdc
  • hiitem
  • ptorg
  • nmargin
  • pstritem
  • pdc
  • tmheight

得分解答快速导航

  • 帖主:zhangyiheng

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo