我需要在针式打印机上用连续打印纸(两边带孔的那种)打印一个很长的图形,可能长10多米,这里不考虑打印宽度,只考虑长度。
我现在的方法是先把数据按照自定义的页长分配到每一页中,从第一页开始转入该页的数据用MoveTo,LineTo画好后调用EndPage,StartPage循环打印下一页,直到打完。
但是执行EndPage后不但打印当前页的数据,而且还会自动走纸,各页间留出了一段空白。我在XP下使用VC6开发一个dll实现上述功能,打印机是金长城5370TX,Epson1600K仿真
测试的数据是(0,0)到(1000,2500)的位置画一条直线,为了模仿多页连续打印,每页的页长我设置成200。映射模式使用MM_TEXT。请各位帮帮忙,怎么能解决EndPage后自动走纸的问题。多谢。void Print()
{
CPrintDialog dlg(FALSE);
if (dlg.DoModal() != IDOK)
return;
CPrintInfo prInfo;
// 得到缺省的打印机设置
CPrintDialog *pReservedPD = prInfo.m_pPD;
prInfo.m_pPD = &dlg;
DEVMODE *pDevMode;
//得到缺省DEVMODE信息
pDevMode = prInfo.m_pPD->GetDevMode();
//修改打印纸的宽度,长度等参数
pDevMode->dmPaperSize = DMPAPER_USER;
pDevMode->dmPaperLength = 200;
pDevMode->dmPaperWidth = 2000;
pDevMode->dmFields |= DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH;
//把测试数据按照页长分配到各页,保存到m_aryPrintPoint,y坐标转换成各页中的坐标
AdjustPtCoorbyPageLength(pDevMode->dmPaperLength);
prInfo.m_pPD->m_pd.nMinPage = 1;
//m_fPtYMin,m_fPtYMax是测试数据y方向的最小值最大值
prInfo.m_pPD->m_pd.nMaxPage = (m_fPtYMax - m_fPtYMin) / pDevMode->dmPaperLength + 1;
prInfo.m_pPD->m_pd.nFromPage = 1;
prInfo.m_pPD->m_pd.nToPage = prInfo.m_pPD->m_pd.nMaxPage;
prInfo.m_nCurPage = 1;
//打印机句柄
HDC hDCPrint = prInfo.m_pPD->GetPrinterDC();
//根据DEVMODE修改hDCPrint
if(::ResetDC(hDCPrint, pDevMode) == NULL)
return;
//将句柄附加到PrintDC上
CDC dcPrint;
dcPrint.Attach(hDCPrint);
dcPrint.SetMapMode(MM_TEXT);
DOCINFO di;
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszOutput = NULL;
dcPrint.StartDoc(&di);
dcPrint.StartPage();
CString str;
PRINTPOINT curPoint, lastPoint;
for (int i = 0; i <= prInfo.m_pPD->m_pd.nMaxPage; i++) {
//用MoveTo,LineTo画出当前页的内容
DrawOnePage();
dcPrint.EndPage();
dcPrint.StartPage();
}
dcPrint.EndPage();
dcPrint.EndDoc();
dcPrint.Detach();
prInfo.m_pPD = pReservedPD;
}
我现在的方法是先把数据按照自定义的页长分配到每一页中,从第一页开始转入该页的数据用MoveTo,LineTo画好后调用EndPage,StartPage循环打印下一页,直到打完。
但是执行EndPage后不但打印当前页的数据,而且还会自动走纸,各页间留出了一段空白。我在XP下使用VC6开发一个dll实现上述功能,打印机是金长城5370TX,Epson1600K仿真
测试的数据是(0,0)到(1000,2500)的位置画一条直线,为了模仿多页连续打印,每页的页长我设置成200。映射模式使用MM_TEXT。请各位帮帮忙,怎么能解决EndPage后自动走纸的问题。多谢。void Print()
{
CPrintDialog dlg(FALSE);
if (dlg.DoModal() != IDOK)
return;
CPrintInfo prInfo;
// 得到缺省的打印机设置
CPrintDialog *pReservedPD = prInfo.m_pPD;
prInfo.m_pPD = &dlg;
DEVMODE *pDevMode;
//得到缺省DEVMODE信息
pDevMode = prInfo.m_pPD->GetDevMode();
//修改打印纸的宽度,长度等参数
pDevMode->dmPaperSize = DMPAPER_USER;
pDevMode->dmPaperLength = 200;
pDevMode->dmPaperWidth = 2000;
pDevMode->dmFields |= DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH;
//把测试数据按照页长分配到各页,保存到m_aryPrintPoint,y坐标转换成各页中的坐标
AdjustPtCoorbyPageLength(pDevMode->dmPaperLength);
prInfo.m_pPD->m_pd.nMinPage = 1;
//m_fPtYMin,m_fPtYMax是测试数据y方向的最小值最大值
prInfo.m_pPD->m_pd.nMaxPage = (m_fPtYMax - m_fPtYMin) / pDevMode->dmPaperLength + 1;
prInfo.m_pPD->m_pd.nFromPage = 1;
prInfo.m_pPD->m_pd.nToPage = prInfo.m_pPD->m_pd.nMaxPage;
prInfo.m_nCurPage = 1;
//打印机句柄
HDC hDCPrint = prInfo.m_pPD->GetPrinterDC();
//根据DEVMODE修改hDCPrint
if(::ResetDC(hDCPrint, pDevMode) == NULL)
return;
//将句柄附加到PrintDC上
CDC dcPrint;
dcPrint.Attach(hDCPrint);
dcPrint.SetMapMode(MM_TEXT);
DOCINFO di;
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszOutput = NULL;
dcPrint.StartDoc(&di);
dcPrint.StartPage();
CString str;
PRINTPOINT curPoint, lastPoint;
for (int i = 0; i <= prInfo.m_pPD->m_pd.nMaxPage; i++) {
//用MoveTo,LineTo画出当前页的内容
DrawOnePage();
dcPrint.EndPage();
dcPrint.StartPage();
}
dcPrint.EndPage();
dcPrint.EndDoc();
dcPrint.Detach();
prInfo.m_pPD = pReservedPD;
}
解决方案 »
- 我有MENU里有两个IDR 一个IDR_CHTYPE 一个IDR_MAINFRAME
- 学习使用Microsoft Visual studio 2005做MFC发现很困难
- ado 操作 ACESS 的问题
- 请教error:expression canot be evaluated 是什么原因?
- 求有关链表操作封装的类,例如,查询,删除,插入,更新,.....
- 简单问题,virtual key是不是不分像1和!两个键?
- 一个关于edit box 控件的拷贝,粘贴奇怪的为题!谢谢!
- 有关vc和access建数据库的问题用ODBC,恳请帮忙
- 为何这样赋值也报错?
- 请问如何读取钱龙日线数据,数据结构已知,最好给出源吗!
- 不使用mfc WIN32程序(第二次得到列表框文本出错!)
- 如何再VC里创建个ACESS数据库表? 大家帮帮忙
//
指用打印机指令(打印机手册上有)直接绘图。不用StartPage、EndPage之类的。