哪位高手尝试一下我的代码,我做了3天了,还是没有结果
建立一个单文档单视图工程PrintOneView,而后在视图类ondraw函数中画了一些格子,如下,
void CPrintOneViewView::OnDraw(CDC* pDC)
{
CPrintOneViewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
    GetWindowRect(&rect);
ScreenToClient(&rect); CPoint prePoint,nextPoint;
CPoint prexGrid,nextxGrid;
CPoint preyGrid,nextyGrid;
prexGrid.x=0;
prexGrid.y=0;
nextxGrid.x=rect.Width();
    nextxGrid.y =0;
CPen   newPen;   
newPen.CreatePen(PS_DOT,   4,   RGB(220,   220,   220));   
CPen*   pOldPen   =   pDC->SelectObject(&newPen); 
CPen BoldLine(PS_SOLID, 4.5, RGB(220,220,220));
for(int i=0;i<rect.Height();i++)//画背景横线
{  if(i%5==0)
{
  pDC->SelectObject(&BoldLine);
  pDC->MoveTo(prexGrid);
     pDC->LineTo(nextxGrid);
          
  pDC->SelectObject(&newPen); 
}
else
{
pDC->MoveTo(prexGrid);
pDC->LineTo(nextxGrid); }
      prexGrid.y = prexGrid.y+100;
nextxGrid.y = nextxGrid.y+100;

} pDC->SelectObject(pOldPen);  preyGrid.x=0;
preyGrid.y=0;
nextyGrid.x=0;
    nextyGrid.y =rect.Height()*2; for(i=0;i <rect.Width()-1;i++)//画背景竖线
{ if(i%5==0)//5小格等于1大格
{   pDC->SelectObject(&BoldLine); 
          pDC->MoveTo(preyGrid);
  pDC->LineTo(nextyGrid);
  pDC->SelectObject(pOldPen);
}
    else
{   pDC->SelectObject(&newPen); 
          pDC->MoveTo(preyGrid);
  pDC->LineTo(nextyGrid);
  pDC->SelectObject(pOldPen);
} preyGrid.x=preyGrid.x+120;
nextyGrid.x=nextyGrid.x+120;
}
}运行工程,显示格子。点击打印,打出来的格子和屏幕上的差很多,怎么会这样呢?
2、加入了一个OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 函数,里面的具体设置不太明白,论坛上copy过来的。
void CPrintOneViewView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
// TODO: Add your specialized code here and/or call the base class
  if(pDC->IsPrinting())   //横向打印
  {   
  LPDEVMODE   pDevMode;   
  pDevMode=pInfo->m_pPD->GetDevMode();   
  pDevMode->dmOrientation=DMORIENT_LANDSCAPE;   
  pDC->ResetDC(pDevMode);   
  }    CView::OnPrepareDC(pDC, pInfo);
long iLogPixelX=pDC->GetDeviceCaps(LOGPIXELSX);
long iLogPixelY=pDC->GetDeviceCaps(LOGPIXELSY);    pDC->SetMapMode(MM_ANISOTROPIC);                     //转换坐标映射方式、确定窗口大小  
    CSize size = CSize(6000, 5000); //我试过别的数,结果一样  
    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);
}
结果还是打出来不对,请高手尝试一下,多谢!

解决方案 »

  1.   

    没记错的话,你最好判断一下pDC->IsPrinting,打印dc的宽高等尺寸和显示器都不一样。
      

  2.   

    试验了一下 楼主在OnDraw里面的代码 和打印的代码都没有错误 是可以打印出来的我想主要的问题是楼主设定横向打印的问题。你在OnDraw里面绘图的时候是取得View客户区的大小 然后绘制的网格 打印的时候你把纸张设定成了横向打印 ------------
    |          |
    |          |
    |          |
    |          |
    |          |  图1
    |          |
    |          |
    ------------------------------
    |                |
    |                |
    |                | 图2
    |                |
    ------------------------------------------
    |                      |
    |                      |
    |                      |
    |                      |
    |                      |  图3
    |                      |
    ------------------------你在OnDraw里面绘图的时候是用的图1的区域绘制网格 打印的时候却打印在图2的区域上 那图2比图1宽度上多出来的部分就没有了网格。主要问题我想应该是在这里的。建议楼主将上面的代码这样改一下:
    CRect rect; 
    GetWindowRect(&rect); 
    ScreenToClient(&rect); 

    CPoint prePoint,nextPoint; 
    CPoint prexGrid,nextxGrid; 
    CPoint preyGrid,nextyGrid; 
    prexGrid.x=0; 
    prexGrid.y=0; 
    nextxGrid.x=rect.Width()*2; //绘制两倍宽度区域 也就是图3对应的区域
        
    既然是打印到横向纸张上 那就要考虑到 绘图也要能准确地绘制到横向打印的所有区域上 不然就会产生截断了。如果还有其他问题 楼主可以发站内私信。
      

  3.   

    打印并不难,我想是楼主没有将问题描述清楚,必要时可以上图说明(发邮件或上传到网络相册),而且应该先好好在网上下一本关于MFC打印的电子书看看。
      

  4.   

    to:Tinary3v0,非常感谢您关于打印的回答您说绘图在图1中,打印对应的是图2,您建议nextxGrid.x=rect.Width()*2; //绘制两倍宽度区域 也就是图3对应的区域,
    请问能不能事先知道图2的具体尺寸呢?这样的话我就可以调整格子的比例,我想画同样多的格子,
    但是另外有个问题,横向和纵向的比例是不是不一样,这时该怎么做?
      

  5.   

    楼主要知道屏幕绘图和打印纸张之间的比例关系?真是不好意思 具体的比例我也不太清楚 但是可以这样考虑:屏幕分辨率 也就是inch对应多少个像素 而inch和厘米之间有换算关系 纸张一般跟厘米对应 这样应该能够导出来的但是这样做还是有些局限 我一般都是通过试数据来打印的 比如一张A4纸打印的时候左右空出1厘米 我是通过试数据来做的 比如左右空100个像素打印 如果太小就试120 呵呵 我的方法比较笨 不过我使用PDF虚拟打印机 直接在屏幕上用尺子量就能量出来打印到纸上是什么效果了 呵呵具体的数据还可能和打印机的dpi有关系 一般默认的打印机都是300dpi 如果是600的还需要进一步的换算。楼主去网上搜搜吧 应该能找到答案的
      

  6.   

    另外推荐一本书: Visual C++打印编程技术与工程实践
    这本书当中应该将的比较详细 楼主看过后应该能深入的了解打印中的一些具体问题。
      

  7.   

    横向和纵向的比例是不一样,  根据比例自动调整吧要不针对打印 和视图显示 各写一份代码。 当然共享是最好的,用pDC->IsPrinting针对不同点
      

  8.   

       其实不用MM_ANISOTROPIC,用缺省MM_TEXT就可以的
    根据实际区域比例和大小动态调整格子的大小,like as follows
     if (pDC->m_bPrinting)
        {
            m_nAutoPixelWidth = m_nPrintPixelWidth;
            m_nAutoPixelHeight = m_nPrintPixelHeight;
            m_nAutoTextHeight = m_nPrintTextHeight;
            m_nAutoTextWidth = m_nPrintTextWidth;
         }
        else
        {
            m_nAutoPixelWidth = m_nPixelWidth;
            m_nAutoPixelHeight = m_nPixelHeight;
            m_nAutoTextHeight = m_nTextHeight;
            m_nAutoTextWidth = m_nTextWidth;
         }
    然后再OnDraw就不用考虑什么了