【msce c++】 关于调用打印API的一些疑问。

我这边想实现一个批量打印图框的功能。读取dgn信息,获取图框位置,并且套上fence 都已经实现了。就是打印的那部分还有很多疑问。

如下代码,能实现打印fence到pdf,我这边就想做更多的功能,所以有了一些疑问

1.如何打印到实体打印机。

    PrintDescriptionPtr printDescPtr = PrintDescriptionRef::Create(); 
	IPrintDescriptionP printDesc = printDescPtr->GetP();
	if (SUCCESS != printDesc->InitializeFromTCB(L"pdf.pltcfg"))
		return;

	//设置纸张名称
	printDesc->SetFormName(L"ISO A4");

	if(printDesc->IsFenceDefined())
	{
		printDesc->SetPlotArea(PlotAreaMode::Fence);
		printDesc->SetPaperOrientation(PlotOrientation::Portrait);
	}
	else
	{
		MessageBox::Show("没有Fence 未生成pdf");
		return;
	}
	//开始打印
	printDesc->Print(L"C:\\Sample.pdf");

2.打开msce自带的打印功能,可以选择很多打印驱动,其中分为windows的打印驱动和bently的打印驱动。 

bently驱动的pltcfg文件,我这边知道文件在哪。   windows的那些驱动信息,有现成的api获取吗。我的想法就是做个一样的下拉列表出来

  • 一、老师 , 你的意思就是  想要用windows驱动打印的话,  打印api 里面的只有  printDesc->InitializeFromTCB(L"printer.pltcfg")  这个加载函数有用吗。是不是因为这个InitializeFromTCB不能指定使用哪个windwos驱动,它只是默认的使用其中一个,至于想具体用哪个windows驱动去打印,需要调用Win32的API的去做一些事了吗?   

    二、我想具体的代码流程是不是   1.printDesc->InitializeFromTCB  2.使用Win32的API改变当前的windows打印驱动   3.  printDesc->Print();  

  • 是不是因为这个InitializeFromTCB不能指定使用哪个windwos驱动,它只是默认的使用其中一个,至于想具体用哪个windows驱动去打印,需要调用Win32的API的去做一些事了吗?   

    在MS端调用InitializeFromTCB指定printer.pltcfg后会选用Windows默认打印机。Winodws默认打印机只有一个。要想设置Windows默认打印机,还得调用Win32 API。

    我想具体的代码流程是不是   1.printDesc->InitializeFromTCB  2.使用Win32的API改变当前的windows打印驱动   3.  printDesc->Print();  

    我认为应该是先调用Win32API设置Windows默认打印机,然后再调用InitializeFromTCB,最后是Print



    Answer Verified By: 瑞 胡 

  • 是的 老师,我这边实验成功了!   

    现在就有个问题哈。在print的时候,想要打印到指定文件,需要给出文件的路径,文件名,和文件后缀,比如  C:\\Sample.pdf  这样的。 如果是bently的驱动,那么使用 plotter->GetString(PlotTagStr::DefaultExtension, ws1);  这样可以获取后缀。但是如果是windows驱动,这样获取不到后缀。做批量打印的时候,就没法去预设文件的保存类型了 。 

    老师 你这边有什么建议吗。

  • Windows驱动每种驱动程序打印出的结果文件的后缀都是事先规定好的吧?



  • 是呀。 用windows驱动打印的话, 调用print() 不传参数的话, 就会弹出一个对话框去手动填写文件名,这时候后缀名是定死的。

    同样的 如果调用print()传一个具体的文件路径比如C:\\Sample.pdf ,那么 程序就不会弹出一个对话框,程序就直接打印到指定文件,这样更快捷,但是有个问题就是,事先得先知道 这个windwos打印驱动的保存文件类型是什么。