VC程序在不同的电脑上打印字体大小不一样
小弟初学VC,自己工作中写了一个小程序,打印的部分是自己写的.在原来的电脑上打印出来,效果很好(纸张A4,主要内容是一个表格),但现在新换了一台电脑,打印出来的内容字体太大,一页内容只能打印出原一页内容的1/4,请问是什么原因?
原系统W2K,现系统WXP.

解决方案 »

  1.   

    应该是你设置的打印机的属性问题,建议你采用所见即所得的方式,也就是象打印预览一样,先在自己的窗口中模拟A4纸大小,在视图中打印正常后,再在打印机上打印,在打印机上打印时可以先在内存中绘制好采用Bitblt的方式直接打到打印机上。
      

  2.   

    void CReportView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
    {
    // TODO: Add your specialized code here and/or call the base class
    PrintLedgerHeader(pDC, pInfo);
    PrintLedgerBady(pDC, pInfo);
    }void CReportView::PrintLedgerHeader(CDC *pDC, CPrintInfo *pInfo)
    {
    //表名 CString szText;
    CString szNote;
    int nHight[5] = {900, 700, 600, 500, 400}; szText.LoadString(IDS_PRINT_TITLE);
    ASSERT(m_rectPage != CRect(0,0,0,0));
        CRect rect = m_rectPage;
        rect.DeflateRect(0, -nHight[0], 0, rect.Height() + nHight[1]);
    CFont fontHead, * pOldFont;
    fontHead.CreatePointFont(1400, _T("宋体"));
    pOldFont = pDC->SelectObject(&fontHead);
    pDC->DrawText(szText, rect, DT_CENTER | DT_TOP/*| DT_VCENTER | DT_SINGLELINE*/);
    fontHead.DeleteObject();
    pDC->SelectObject(pOldFont); //打印时间,页数
    rect = m_rectPage;
        rect.DeflateRect(0, -nHight[1], 0, rect.Height() + nHight[2]);
    CTime tmNow = CTime::GetCurrentTime();
    szText.Empty();
    szText.LoadString(IDS_PRINT_DATE);
    szNote.Format(_T("%s:%d-%02d-%02d"), szText, tmNow.GetYear(), tmNow.GetMonth(), tmNow.GetDay());
    pDC->DrawText(szNote, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); szNote.Empty();
    szText.Empty();
    CString szDI, szTotal, szPage;
    szDI.LoadString(IDS_FLT_DI);
    szTotal.LoadString(IDS_PAGE_TOTAL);
    szPage.LoadString(IDS_PAGE); szNote.Format(_T("%s %d %s %s %d %s"), szDI, pInfo->m_nCurPage, szPage, 
    szTotal, pInfo->GetMaxPage(), szPage);
    pDC->DrawText(szNote, rect, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);

    //材料编号名称规格等
    rect = m_rectPage;
        rect.DeflateRect(0, -nHight[2], 0, rect.Height() + nHight[3]);
    MT_MATSHORT_ITEM * pItem = (MT_MATSHORT_ITEM * )
    m_pDoc->m_arPtr.GetAt(m_pDoc->m_nCurrent - 1);
    szNote.Empty();
    CString szMatNo, szMatName, szSpec, szUnit;
    szMatNo.LoadString(IDS_MAT_COL_MATNO);
    szMatName.LoadString(IDS_MAT_COL_MATNAME);
    szSpec.LoadString(IDS_MAT_COL_MATSPEC);
    szUnit.LoadString(IDS_MAT_COL_MATUNIT);
    szNote.Format(_T("%s: %s    %s: %s    %s: %s    %s: %s"), 
    szMatNo, pItem->szMatNo, szMatName, pItem->szMatName, 
    szSpec, pItem->szMatSpec, szUnit, pItem->szMatUnit);
    pDC->DrawText(szNote, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    //期间
    rect = m_rectPage;
        rect.DeflateRect(0, -nHight[3], 0, rect.Height() + nHight[4]);
    szNote.Empty();
    CString szPeriod, szTo;
    szPeriod.LoadString(IDS_RPT_PERIOD);
    szTo.LoadString(IDS_RPT_TO);
    if (m_pDoc->m_nPeriodBgn == m_pDoc->m_nPeriodEnd)
    {
    szNote.Format(_T("%s: %d"), szPeriod, m_pDoc->m_nPeriodBgn);
    }
    else
    {
    szNote.Format(_T("%s: %d %s %d"), szPeriod, m_pDoc->m_nPeriodBgn, 
    szTo, m_pDoc->m_nPeriodEnd);
    }
    pDC->DrawText(szNote, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);}void CReportView::PrintLedgerBady(CDC *pDC, CPrintInfo *pInfo)
    {
    int nWidth[13] = {MARGIN_LEFT * 3, 1050, 1450, 2520, 
    3040, 3440, 3860, //每列宽1340, 数量520 单价400 金额 420
    4380, 4780, 5200, 
    5720, 6120, 6540};
    int nHeight = 100;
        int nStartRow = (pInfo->m_nCurPage - 1) * m_nPageRows;
        int nEndRow = nStartRow + m_nPageRows;
    int nRowCount = m_pListCtrl->GetItemCount();
        if (nEndRow > nRowCount)         
            nEndRow = nRowCount;
    int nCurPageRow = nEndRow - nStartRow;
    int nPageHeight = (nCurPageRow + 2) * nHeight; CFont fontBady, * pOldFont;
    fontBady.CreatePointFont(600, _T("宋体"));
    pOldFont = pDC->SelectObject(&fontBady);
    //表头
    CRect rect = m_rectPage;
        rect.DeflateRect(0, -350, 0, 0);
    CRect rc(max(rect.left, nWidth[0]), rect.top, 
    min(rect.right, nWidth[12]), 
    min(rect.bottom, rect.top + nPageHeight)); //列宽  100;100;500;150;150;150;150;150;150;150;150;150 for (int i = 0; i < 13; i++)
    {
    if (i <= 3 || i == 6 || i == 9 || i == 12)
    {
    pDC->MoveTo(nWidth[i], rect.top);
    pDC->LineTo(nWidth[i], min(rect.bottom, rect.top + nPageHeight));
    }
    else
    {
    pDC->MoveTo(nWidth[i], rect.top + nHeight);
    pDC->LineTo(nWidth[i], min(rect.bottom, rect.top + nPageHeight));
    }
    } for (i = 0; i < nCurPageRow + 3; i++)
    {
    if (i != 1)
    {
    pDC->MoveTo(max(nWidth[0], rect.left), rect.top + nHeight * i);
    pDC->LineTo(min(nWidth[12], rect.right), rect.top + nHeight * i);
    // CString szText;
    // szText.Format("%d", i - 2);
    // CRect rc(rect.left + 400, rect.top + nHeight * (i - 1), rect.left + 800, rect.top + nHeight* i);
    // pDC->DrawText(szText, rc, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
    }
    else
    {
    pDC->MoveTo(nWidth[3], rect.top + nHeight * i);
    pDC->LineTo(min(nWidth[12], rect.right), rect.top + nHeight * i); }
    } //表头
    CString szText;
    CRect rcCur;... //外边框
    rc.InflateRect(10, 10);
    pDC->MoveTo(rc.left, rc.top);
    pDC->LineTo(rc.right, rc.top);
    pDC->LineTo(rc.right, rc.bottom);
    pDC->LineTo(rc.left, rc.bottom);
    pDC->LineTo(rc.left, rc.top); fontBady.DeleteObject();
    pDC->SelectObject(pOldFont); rc.InflateRect(0, 0, 0, 150);
    CString szNote;
    szNote.LoadString(IDS_UNIT);
    szText.Empty();
    szText.Format(_T("%s:%s"), szNote, theApp.m_szCompany);
    pDC->DrawText(szText, rc, DT_LEFT | DT_BOTTOM | DT_SINGLELINE);
    szText.Empty();
    szNote.LoadString(IDS_OPERATOR);
    szText.Format(_T("%s:%s"), szNote, theApp.m_szUserName);
    pDC->DrawText(szText, rc, DT_RIGHT | DT_BOTTOM | DT_SINGLELINE);}
      

  3.   

    m_rectPage是哪来的呢,可能在计算上有问题。至于字体,看看是否设置了映射模式。
      

  4.   

    m_rectPage是自己设置的打印区域的大小,在原来的电脑上打印正确,估计不是这个问题.