比如打印机是300dpi*300dpi,那么就是2.54cm打印300个像素点,因此你打出来的会很小。如果你是自己实现打印,就把该区域放大后复制到打印机dc中便可,利用StretchBlt,打印纸张的尺寸你可以利用函数读出来,放大的比例你就可以根据需要自己设定了

解决方案 »

  1.   

    谢谢zamely 
     你的意思是把画的线条当做图片一样读到DC中吧,这是读取图片代码,怎样改成读取自己上门所画的线段呢?
    CDC          MemDC; // 内存设备环境指针,在视的整个存在过程都将存在
    CBitmap         Bitmap,*pOldBmp;       
    CRect                Source, Dest; // 记录源位图尺寸和最终显示尺寸
    BITMAP         bm;
    if(MemDC.GetSafeHdc() == NULL)
    {
    HBITMAP hbitmap=(HBITMAP)LoadImage(0,pathpho,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
    Bitmap.Attach(hbitmap);
    MemDC.CreateCompatibleDC(pDC);
    Bitmap.GetObject(sizeof(bm),&bm);
    pOldBmp=MemDC.SelectObject(&Bitmap);
    Source.top=0;
    Source.left=0;
    Source.right= bm.bmWidth;
    Source.bottom = bm.bmHeight;
    Dest = Source;
    }

    pDc->StretchBlt(LEFT+260+FONTWEIGHT3*3+5,TOP+FONTHIGH-5,415,FONTHIGH*6,
    &MemDC, 0,0, Source.right,Source.bottom, SRCCOPY);
      

  2.   


    差不多是这个意思,不知道你解决没有,因为我自己就是这样解决的!是这样的,你直接获取当前绘图区域的dc,然后将绘图区域dc(可以是内存dc)中需要打印的区域放大复制到打印机dc就可以了
    void CCurveDlg::OnPrint() 
    {
    //打印对话框    DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS         | PD_NOSELECTION | PD_HIDEPRINTTOFILE;  
    CPrintDialog dlg(FALSE);   

    CClientDC dc(this);
    CClientDC* pCurveDlgDC=&dc;

    CRect rect;
    m_curvePanel.GetClientRect(&rect);

    CRect toolbarCltRect;
    m_curveToolBar.GetClientRect(&toolbarCltRect);

    UINT top=toolbarCltRect.Height()+CURVEPANEL_TOP_TOOLBAR;
    UINT left=CURVEPANEL_LEFT_DLG;

    CDC memDC;
    memDC.CreateCompatibleDC(pCurveDlgDC);

    CBitmap memBmp;
    memBmp.CreateCompatibleBitmap(pCurveDlgDC,rect.Width(),rect.Height());

    memDC.SelectObject(&memBmp);
    memDC.BitBlt(0,0,rect.Width(),rect.Height(),pCurveDlgDC,left,top,SRCCOPY);

    if (dlg.DoModal() == IDOK)  
    {        
    //获得打印机DC        
    HDC hDC = dlg.GetPrinterDC();        
    if (hDC == NULL)        
    {            
    return;        
    }        
    //通过HDC获得CDC指针        
    CDC* pDC = CDC::FromHandle(hDC);        
    pDC->m_bPrinting = TRUE;        
    //文档信息,含StartDoc()需要使用的输入输出文件名和其他信息。        
    DOCINFO di;         
    ::ZeroMemory (&di, sizeof (DOCINFO));        
    di.cbSize = sizeof (DOCINFO);        
    di.lpszDocName = _T("Curve");        
    //开始打印        
    BOOL bPrinting = pDC->StartDoc(&di);         
    //for (UINT nPage = 0; nPage < 10 && bPrinting; nPage++)        
    //{            
    UINT nPage = 0;            
    pDC->StartPage();            
    //输出文本            
    //CString strText = _T("");            
    //strText.Format(_T("第%d页"), nPage + 1);        

    pDC->SelectObject(&memBmp);
    UINT widthPixel,heightPixel;
    //获取纸张像素大小
    heightPixel=pDC->GetDeviceCaps(VERTRES);
    widthPixel=pDC->GetDeviceCaps(HORZRES);
    UINT i=0,j=0;
    for(;i*rect.Width()<widthPixel;i++);
    i--;
    for(;j*rect.Height()<heightPixel;j++);
    j--;
    i=(i<j)?i:j;
    //采用600dpi打印分辨率,放大10倍都看不出失真
    pDC->StretchBlt(0,0,i*rect.Width(),i*rect.Height(),&memDC,0,0,rect.Width(),rect.Height(),SRCCOPY); /*
    pDC->TextOut(100, 0, strText);            
    pDC->TextOut(100, 200, _T("111"));            
    pDC->TextOut(400, 200, _T("222"));            
    pDC->TextOut(700, 200, _T("333"));            
    pDC->TextOut(1000, 200, _T("444"));            
    */
    bPrinting = (pDC->EndPage() > 0);    
    // }        
    if (bPrinting)             
    pDC->EndDoc();         
    else            
    pDC->AbortDoc();        
    //结束打印        
    pDC->EndDoc();        
    //删除DC        
    pDC->DeleteDC();    
    }
    }
    这是我的代码,我是先把屏幕区域复制到内存DC,然后再内存DC复制到打印机dc,因为某种原因我需要如此,而你直接复制就可以了。