请高手指点一下 VC++所见即所得打印程序的设计原理和思路,多谢!

解决方案 »

  1.   

    这个,怎么说呢,就是GDI编程,建议看看Feng yuan的书。
      

  2.   

    现在做的程序需要打印固定大小的卡片式的表格,我借用下面一段代码
    void CPrintSameView::OnPrepareDC  (CDC* pDC, CPrintInfo* pInfo)   { CView::OnPrepareDC(pDC, pInfo);  pDC->SetMapMode(MM_ANISOTROPIC);    CSize size = CSize(800, 560);  pDC->SetWindowExt(size);  int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);   int yLogPixPerInch = pDC- >GetDeviceCaps(LOGPIXELSY);  long xExt = (long)size.cx * xLogPixPerInch/96 ;   long yExt = (long)size.cy * yLogPixPerInch/96 ;  pDC->SetViewportExt((int)xExt, (int)yExt);   }     作了修改,感觉没达到要求,如果有哪位高手研究过这方面,请帮忙详细讲解一下这方面的问题。
      

  3.   

    #include "StdAfx.h"
    #include "PrintDrawer.h"using namespace nsPrintCode;
    #define LIST_SPEAKER_COLUMN 0
    #define LIST_EDITRES_COLUMN 4
    CPrintDrawer::CPrintDrawer(void)
    {
    m_pDC = NULL;     // 设备上下文指针
    m_pInfo = NULL;
    m_hListCtrl = NULL;

    }CPrintDrawer::CPrintDrawer(CDC* pDC,CPrintInfo* pInfo,HWND hWnd,CPrintSettting* pSettting)
    {
        m_pDC = pDC;
    m_pInfo = pInfo;
    m_hListCtrl = hWnd;
       
    m_nStartTextLine = 0; m_nPrintStyle = pSettting->m_nPrintStyle;
    m_nHeaderStyle = pSettting->m_nHeaderStyle;
    m_strTitle = pSettting->m_strTitle;
    m_arrSubTitles.Copy(pSettting->m_arrSubTitles);
        m_arrSubTitleValues.Copy(pSettting->m_arrSubTitleValues);
    CreateFont();
    Prepare2Draw();
    }
    CPrintDrawer::~CPrintDrawer(void)
    {
    if(m_cfTitleFont.m_hObject != NULL)
    m_cfTitleFont.DeleteObject();
    if(m_cfTextFont.m_hObject != NULL)
    m_cfTextFont.DeleteObject();
    if(m_cfSpeakerFont.m_hObject != NULL)
    m_cfSpeakerFont.DeleteObject();
    if(m_cfSubTitleFont.m_hObject != NULL)
    m_cfSubTitleFont.DeleteObject();
    }
    //创建字体
    void CPrintDrawer::CreateFont()
    {
    //标题字体
    m_cfTitleFont.CreateFont(-MulDiv(14,m_pDC->GetDeviceCaps(LOGPIXELSY),72),
    0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
    OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
    VARIABLE_PITCH|FF_SWISS,_T("黑体"));
    //正文字体
    m_cfTextFont.CreateFont(-MulDiv(10,m_pDC->GetDeviceCaps(LOGPIXELSY),72),
    0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
    OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
    VARIABLE_PITCH|FF_SWISS,_T("宋体"));

    //说话人字体
    m_cfSpeakerFont.CreateFont(-MulDiv(10,m_pDC->GetDeviceCaps(LOGPIXELSY),72),
    0,0,0,FW_NORMAL,TRUE,TRUE,0,GB2312_CHARSET,
    OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
    VARIABLE_PITCH|FF_SWISS,_T("宋体"));
    //字标题字体
    m_cfSubTitleFont.CreateFont(-MulDiv(11,m_pDC->GetDeviceCaps(LOGPIXELSY),72),
    0,0,0,FW_BOLD,0,0,0,GB2312_CHARSET,
    OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
    VARIABLE_PITCH|FF_SWISS,_T("宋体"));
    }
    //准备绘制,设置页面参数
     void CPrintDrawer::Prepare2Draw()
     {
     //计算相关的尺寸
     int nXPixperInch = m_pDC->GetDeviceCaps(LOGPIXELSX); //x方向每英寸像素点数
     int nYPixperInch = m_pDC->GetDeviceCaps(LOGPIXELSY); //y方向每英寸像素点数
     m_dXPixperMiMetre = (DOUBLE)nXPixperInch*10/254;             //每 mm 宽度的像素
     m_dYPixperMiMetre = (DOUBLE)nYPixperInch*10/254;             //每 mm 高度的像素
           
     m_nPaperHeight = m_pDC->GetDeviceCaps(VERTRES);          //可打印区域高度(像素)
     m_nPaperWidth = m_pDC->GetDeviceCaps(HORZRES);           //可打印区域宽度(像素) 
          m_dXLeftMargin = 15*m_dXPixperMiMetre;             //最左线位置(像素) 合15mm
     m_dXRightMargin = m_nPaperWidth - 15*m_dXPixperMiMetre;                     //最右线 15mm
     m_dyTopMargin = m_dYPixperMiMetre*10;                      //最上线 10mm
     m_dYBottomMargin = m_nPaperHeight - m_dYPixperMiMetre*25;  //最下线 25mm 
     m_dTextOffset = 1.5*m_dXPixperMiMetre;                     //文字与表格偏移(像素)
         
     
     //////////////////////////////////////////////////////////////////////////
     CFont* pOldFont = m_pDC->SelectObject(&m_cfTextFont);
         TEXTMETRICA ptm;
     GetTextMetrics(m_pDC->m_hDC,&ptm);
     int nCharHeight = ptm.tmHeight;        //字符高度
     int dMaxCharWidth = ptm.tmMaxCharWidth; //字符宽度
        
     m_pDC->SelectObject(&m_cfTitleFont);
     GetTextMetrics(m_pDC->m_hDC,&ptm);
     m_nTitleHeight = ptm.tmHeight + (int)m_dYPixperMiMetre;   m_pDC->SelectObject(&m_cfSubTitleFont);
     GetTextMetrics(m_pDC->m_hDC,&ptm);
     m_nSubTitleHeight = ptm.tmHeight + (int)m_dYPixperMiMetre;
     m_pDC->SelectObject(pOldFont);
     m_dRowHeight = nCharHeight + m_dYPixperMiMetre;                       //行高(像素)     
     m_dYHeaderBottom = m_dyTopMargin + m_nTitleHeight + CalculateSubTitleLines() * m_nSubTitleHeight;     //每行最大字符数
     m_nMaxRowLength = (int)((m_dXRightMargin - m_dXLeftMargin - m_dTextOffset)/dMaxCharWidth)*2; 
         // 第一页行数
     m_nFirstPageMaxRows = (int)((m_dYBottomMargin - m_dYHeaderBottom - m_dTextOffset * 3)/m_dRowHeight); 
     // 其他页行数
     m_nCommonPageMaxRows = (int)((m_dYBottomMargin - m_dyTopMargin - m_dTextOffset * 3)/m_dRowHeight);  FetchAllLines();                                                          //所有行数

    //计算每个子标题的值被分割为多少行
     int CPrintDrawer::DivideSubValue(CRect* pSTRect,int nSubTitle,CStringArray & newValues)
     {
      CString strOldValue = m_arrSubTitleValues.GetAt(nSubTitle);
      TEXTMETRICA ptm;   
      int nLines = 1;
      int dCharWidth = 0;
      int nFirstRowWidth =(int) (m_dXRightMargin - pSTRect->right - m_dTextOffset);
      int nOtherRowWidth = (int) (m_dXRightMargin - m_dXLeftMargin - m_dTextOffset);
      int nFirstRowLength,nOtherRowLength;
      GetTextMetrics(m_pDC->m_hDC,&ptm);
      dCharWidth =  ptm.tmMaxCharWidth;
          nFirstRowLength =2*(nFirstRowWidth/dCharWidth);
      nOtherRowLength = 2* (nOtherRowWidth/dCharWidth);   int nLength = strOldValue.GetLength();
      CString strNewValue ;
      if( nLength <= nFirstRowLength)
      {
     newValues.Add(strOldValue);
     return nLines;
      }
      else
      {
      strNewValue = strOldValue.Left(nFirstRowLength);
      newValues.Add(strNewValue);   nLength -= nFirstRowLength;
              strOldValue = strOldValue.Right(nLength);   while(nLength >0)
      {
      nLines ++;
      if(nLength <= nOtherRowLength)
      {
      newValues.Add(strOldValue);
      break;
      }
      else
      {
       strNewValue = strOldValue.Left(nOtherRowLength);
       newValues.Add(strNewValue);
       nLength -= nOtherRowLength;
       strOldValue = strOldValue.Right(nLength);
      }   }    }
      return nLines;
      
         
     }
     
      

  4.   

    这末复杂啊 谢谢mars 我看看先