/////////////////////////////////////////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函数打印出文字出来呢?
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函数打印出文字出来呢?
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");但是打印的只有最后的那行,怎么把三行都打印出来呢?
dcPrinter.TextOut(0, 20, "设置CDC的\r\n映射模式2");
dcPrinter.TextOut(0, 40, "设置CDC的\r\n映射模式3");坐标区域问题,x,y,dx,dy要设置正确
dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式2");
dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式3");
这个你的纵坐标都相同,所以上面两行打印的都被覆盖了~~~
方法就是上面所说的~~~
dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式2");
dcPrinter.TextOut(0, 0, "设置CDC的\r\n映射模式3");
纵坐标都是0了~~~
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
{
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 ;
}
dcPrinter.DrawText("dddd选用新的字体\r\ndd选用新的字体ddfds", CRect(100,100,100,200), DT_LEFT|DT_WORDBREAK);
看一看用于打印的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;