VC的打印功能如何实现?

sunqi 2000-05-17 09:54:00
现有一结构数组,我想通过一个按钮将该结构数组的内容打印出来,数组中每一个结构占一行,要求可以对打印纸可以设置,但是我对打印方面的代码不了解,只知道用CPrintDialog,CPageSetupDialog等,但不知道具体该如何操作,如何将文本显示到打印机,用TextOut吗?但如何控制输出点坐标呢?希望大家可以帮我一下,最好将代码贴上来,多谢了。
...全文
1136 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sutao 2000-05-22
  • 打赏
  • 举报
回复
应该再加入一个打印循环,OnPrint()和OnDraw()函数.
sun2000 2000-05-19
  • 打赏
  • 举报
回复
TEXTMETRIC tm;
GetTextMetrics(hPrintDC,&tm);

根据打印机的分辨率不同而定(可以计算)x,y,若打印机用的是不连续的纸则会自动分页而当打印机用的是连续纸时要编程进行分页。



再提供以下代码仅供参考
if(pPrintDC->StartDoc(&docinfo)>0 &&
pPrintDC->StartPage()>0)
{
pPrintDC->SetMapMode(MM_ANISOTROPIC); //转换坐标映射方式
CSize size = CSize(800, 560);
pPrintDC->SetWindowExt(size); //确定窗口大小

//得到实际设备每逻辑英寸的象素数量
int xLogPixPerInch = pPrintDC->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = pPrintDC->GetDeviceCaps(LOGPIXELSY);

//得到设备坐标和逻辑坐标的比例
long xExt = (long)size.cx * xLogPixPerInch/96 ;
long yExt = (long)size.cy * yLogPixPerInch/96 ;
pPrintDC->SetViewportExt((int)xExt, (int)yExt);
//确定视口大小

此处进行输出



if(pPrintDC->EndPage()>0)
pPrintDC->EndDoc();//<=0;
}
else
pPrintDC->AbortDoc();
sun2000 2000-05-19
  • 打赏
  • 举报
回复
TEXTMETRIC tm;
GetTextMetrics(hPrintDC,&tm);

根据打印机的分辨率不同而定(可以计算)x,y,若打印机用的是不连续的纸则会自动分页而当打印机用的是连续纸时要编程进行分页。



再提供以下代码仅供参考
if(pPrintDC->StartDoc(&docinfo)>0 &&
pPrintDC->StartPage()>0)
{
pPrintDC->SetMapMode(MM_ANISOTROPIC); //转换坐标映射方式
CSize size = CSize(800, 560);
pPrintDC->SetWindowExt(size); //确定窗口大小

//得到实际设备每逻辑英寸的象素数量
int xLogPixPerInch = pPrintDC->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = pPrintDC->GetDeviceCaps(LOGPIXELSY);

//得到设备坐标和逻辑坐标的比例
long xExt = (long)size.cx * xLogPixPerInch/96 ;
long yExt = (long)size.cy * yLogPixPerInch/96 ;
pPrintDC->SetViewportExt((int)xExt, (int)yExt);
//确定视口大小

此处进行输出



if(pPrintDC->EndPage()>0)
pPrintDC->EndDoc();//<=0;
}
else
pPrintDC->AbortDoc();
sunqi 2000-05-19
  • 打赏
  • 举报
回复
关键是我不知道TextOut的坐标如何控制,如第一行打印完,我可将y坐标加nHeigth,但是有换页怎么办呢?是不是会自动处理呢?
sunqi 2000-05-19
  • 打赏
  • 举报
回复
好像还是不对,我在你写的“此处进行输出”加入以下测试代码
pPrintDC->TextOut(700,550,"..");
pPrintDC->TextOut(700,650,"..");
pPrintDC->TextOut(700,750,"..");
pPrintDC->TextOut(700,850,"..");
pPrintDC->TextOut(700,950,"..");
pPrintDC->TextOut(700,1050,"..");
pPrintDC->TextOut(700,1150,"..");
pPrintDC->TextOut(700,1250,"..");
pPrintDC->TextOut(700,1350,"..");
pPrintDC->TextOut(700,1450,"..");
pPrintDC->TextOut(700,1550,"..");
pPrintDC->TextOut(700,1650,"..");
pPrintDC->TextOut(700,1750,"..");
pPrintDC->TextOut(700,1850,"..");
pPrintDC->TextOut(700,1950,"..");
但是打印机打完第一页就罢工了,还剩下应该在第二页的都没有打印出来,如何是好?
多谢了!
sun2000 2000-05-18
  • 打赏
  • 举报
回复

如果不用CPrintDialog可以用如下函数
HDC GetPrinterDC(void)
{
static char szPrinter[80];
char *szDevice,*szDriver,*szOutput;


GetProfileString("windows","device","",szPrinter,80);


if((szDevice=strtok(szPrinter,","))&&
(szDriver = strtok(NULL,","))&&
(szOutput = strtok(NULL,",")))
return CreateDC(szDriver,szDevice,szOutput,NULL);

return 0;

}
如果你要用CPrintDialog则如下 大概用如相代码就可以了
CPrintDialog dlg;
if (dlg.DoModal()!=IDOK) return;



HDC hPrintDC=dlg.GetPrinterDC();
CDC *pPrintDC=CDC::FromHandle(hPrintDC);

TEXTMETRIC tm;
GetTextMetrics(hPrintDC,&tm);
int nHeight=tm.tmHeight+tm.tmExternalLeading;
......................................

DOCINFO docinfo;
static char szMsg[]="文档名";
docinfo.cbSize=strlen(szMsg);
docinfo.lpszDocName=szMsg;
docinfo.lpszOutput=NULL;


if(pPrintDC)
{
if(pPrintDC->StartDoc(&docinfo)>0 &&
pPrintDC->StartPage()>0)
{
pPrintDC->TextOut(...);
if(pPrintDC->EndPage()>0)
pPrintDC->EndDoc();//<=0;
}
else
pPrintDC->AbortDoc();
}
else
{
AfxMessageBox("can't found the printer");
}
if (hPrintDC)
DeleteDC(hPrintDC);
}




仅供参考
sun2000

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧