/////////////////////////////////////////CString strPrinterName="HP LaserJet 2100";
CString pDocumentName="HPDocumentName";
int iFontSize=200;
CFont NewFont;
RECT rect1;
//AnsiString SavePath;
   rect1.left =0;
   rect1.top =0;
   rect1.right =200000;
   rect1.bottom =30000;
HDC hdcPrinter=CreateDC(_T("WINSPOOL"), strPrinterName, NULL, NULL);//获取打印机硬件的控制;
CDC dcPrinter;
DOCINFO docinfo={sizeof(DOCINFO),"printer",NULL};
dcPrinter.Attach(hdcPrinter);//将CDC和HDC关联起来;
dcPrinter.SetMapMode(MM_HIENGLISH);//设置CDC的映射模式;
docinfo.lpszDocName = _T(pDocumentName);
dcPrinter.StartDoc(&docinfo);//开始一个打印文档;
dcPrinter.StartPage();//开始文档中的一页;
NewFont.CreateFont(iFontSize, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "宋体");//新建一个用于打印的字体;
dcPrinter.SelectObject(&NewFont);//选用新的字体;
//dcPrinter.TextOut(x, y, str);//在(x,y)坐标输出str;
//dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式");
//dcPrinter.DrawText(str, lpRect, DT_LEFT|DT_WORDBREAK);//在lpRect范围内输出str;
dcPrinter.DrawText("dddd坐标输出\r\ndd坐标输出ddfds", CRect(0,0,100000,2000), DT_LEFT|DT_WORDBREAK);
dcPrinter.DrawText("dddd选用新的字体\r\ndd选用新的字体ddfds", CRect(0,0,100000,2000), DT_LEFT|DT_WORDBREAK);dcPrinter.EndPage();
dcPrinter.EndDoc();/////////////////////////////////////
以上是我改动vc6++的程序,问题是在该程序段中如果不屏蔽行dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式");的话TextOut函数可以在打印机上打印出字符,但DrawText就无法打印出任何字了,如果屏蔽
TextOut的话该段程序也是可以驱动打印的,但打印出来的页面是空白的,请大家帮帮我怎么才可以使用DrawText函数打印出文字出来呢?

解决方案 »

  1.   

    坐标方向的问题,也就是映射模式。你可以试着改变DrawText的坐标看效果。
      

  2.   

    不修改坐标映射方式,然后将CRect该小试试
      

  3.   

    我把设置改成了以下还是不行,到底是什么问题呢?dcPrinter.DrawText("dddd选用新的字体\r\ndd选用新的字体ddfds", CRect(1,1,10,20), DT_LEFT|DT_WORDBREAK);
      

  4.   

    我把设置改成了以下也还是不行,帮我吧?
    dcPrinter.DrawText("dddd选用新的字体\r\ndd选用新的字体ddfds", CRect(100,100,100,200), DT_LEFT|DT_WORDBREAK);
    还有怎么
    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式");
    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式2");
    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式3");但是打印的只有最后的那行,怎么把三行都打印出来呢?
      

  5.   

    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式");
    dcPrinter.TextOut(0, 20, "设置CDC的\r\n映射模式2");
    dcPrinter.TextOut(0, 40, "设置CDC的\r\n映射模式3");坐标区域问题,x,y,dx,dy要设置正确
      

  6.   

    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式");
    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式2");
    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式3");
    这个你的纵坐标都相同,所以上面两行打印的都被覆盖了~~~
    方法就是上面所说的~~~
      

  7.   

    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式");
    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式2");
    dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式3");
    纵坐标都是0了~~~
      

  8.   

    将像素坐标换算为打印机的坐标:系数如下:
    int xP = GetDeviceCaps(dcPrinter.m_hDC, LOGPIXELSX); //x方向每英寸像素点数
    int yP = GetDeviceCaps(dcPrinter.m_hDC, LOGPIXELSY); //y方向每英寸像素点数m_xPix = (DOUBLE)xP*10/800; //每 mm 宽度的像素254
    m_yPix = (DOUBLE)yP*10/800; //每 mm 高度的像素254将你的CRect中x和y方向的像素值分别乘以m_xPix,m_yPix
      

  9.   

    这是我的一个标签打印的类代码,很简单,供你参考:CPrintEmsTab::CPrintEmsTab()
    {
    m_pTabInfo = NULL;
    m_xPix = 0;
    }CPrintEmsTab::~CPrintEmsTab()
    {}
    BOOL CPrintEmsTab::DoPreparePrintDC()
    {
    //获取打印机的设备属性
    CPrintDialog dlgPrint(FALSE);
    // 得到当前系统缺省打印机设置

    if(!dlgPrint.GetDefaults()) return FALSE;
    LPDEVMODE pDM=dlgPrint.GetDevMode();
    if(pDM==NULL) return FALSE;

    ::GlobalUnlock(pDM);
    // 联结打印DC,m_hDC是定义为HDC m_hDC的类成员变量
    m_hDC=dlgPrint.CreatePrinterDC();

    // m_DC是定义为CDC m_DC的类成员变量
    if(!m_DC.Attach(m_hDC)) return FALSE; // 设置打印标志
    m_DC.m_bPrinting=TRUE;
    //short cxInch=m_DC.GetDeviceCaps(LOGPIXELSX);
    short cyInch=m_DC.GetDeviceCaps(LOGPIXELSY); // 建立打印字体,m_fontPrint 是定义为CFont m_fontPrint的类成员变量

    if(!m_fontPrint.CreateFont(MulDiv(m_pTabInfo->iFontHeight,-cyInch,72),
    0,0,0, FW_NORMAL,
    0,0,0, GB2312_CHARSET,
    OUT_CHARACTER_PRECIS,
    CLIP_CHARACTER_PRECIS,
    DEFAULT_QUALITY,
    DEFAULT_PITCH | FF_DONTCARE,
    m_pTabInfo->szFaceName))
    return FALSE; 
    return TRUE;
    }void CPrintEmsTab::DoClearPrintDC()
    {
    m_DC.Detach();
    ::DeleteDC(m_hDC );
    }void CPrintEmsTab::DoPrint(EMSTABINFO * pTabInfo,int iTotalItem)
    { int i;
    /*/******************************************************
    for(i=0;i<iTotalItem;i++)
    {
    if(!pTabInfo->stItem[i].bPrint) continue;
    AfxMessageBox(pTabInfo->stItem[i].szText);
    }
    AfxMessageBox(pTabInfo->szFaceName);
    return ;
    *///****************************************************** m_pTabInfo = pTabInfo;
    if(DoPreparePrintDC() == FALSE) return;

    // 开始一次打印作业
    //CString str;
    //str.LoadString(AFX_IDS_APP_TITLE);
    DOCINFO di;
    ::ZeroMemory(&di, sizeof(DOCINFO));
    di.cbSize=sizeof(DOCINFO);
    di.lpszDocName="单据";
    m_DC.StartDoc(&di);
    m_DC.StartPage();
    // 将打印字体选进设备场景
    CFont * pOldFont=m_DC.SelectObject(&m_fontPrint);
    if(m_xPix == 0)
    {
    int xP = GetDeviceCaps(m_DC.m_hDC, LOGPIXELSX); //x方向每英寸像素点数
    int yP = GetDeviceCaps(m_DC.m_hDC, LOGPIXELSY); //y方向每英寸像素点数 m_xPix = (DOUBLE)xP*10/800; //每 mm 宽度的像素254
    m_yPix = (DOUBLE)yP*10/800; //每 mm 高度的像素254
    } CRect rc;

    for(i=0;i<iTotalItem;i++)
    {
    if(!pTabInfo->stItem[i].bPrint) continue;

    rc.SetRect((int)((pTabInfo->stItem[i].rc.left+pTabInfo->iLeft)*m_xPix),
    (int)((pTabInfo->stItem[i].rc.top+pTabInfo->iTop)*m_yPix),
    (int)((pTabInfo->stItem[i].rc.right+pTabInfo->stItem[i].rc.left+pTabInfo->iLeft)*m_xPix),
    (int)((pTabInfo->stItem[i].rc.bottom+pTabInfo->stItem[i].rc.top+pTabInfo->iTop)*m_yPix)); m_DC.DrawText( pTabInfo->stItem[i].szText,
    rc,
    pTabInfo->stItem[i].nFormat);
    //AfxMessageBox(pTabInfo->stItem[i].szText);
    }
    // 终止打印作业 
    m_DC.EndPage();
    m_DC.EndDoc();
    // 清除打印场景
    m_DC.SelectObject(pOldFont);
    m_fontPrint.DeleteObject();
    DoClearPrintDC(); return ;
    }
      

  10.   

    重要的是DrawText无法打印出文字,如果CRect不对的话给个建议的数值吧,只要可以看到东西就好调整
    dcPrinter.DrawText("dddd选用新的字体\r\ndd选用新的字体ddfds", CRect(100,100,100,200), DT_LEFT|DT_WORDBREAK);
      

  11.   


    看一看用于打印的CFont的设置,与Creen是不一样的if(!m_fontPrint.CreateFont(MulDiv(m_pTabInfo->iFontHeight,-cyInch,72),
    0,0,0, FW_NORMAL,
    0,0,0, GB2312_CHARSET,
    OUT_CHARACTER_PRECIS,
    CLIP_CHARACTER_PRECIS,
    DEFAULT_QUALITY,
    DEFAULT_PITCH | FF_DONTCARE,
    m_pTabInfo->szFaceName))
    return FALSE;