关于打印的问题,高手请进!急!

CobraKing 2003-09-02 08:24:16
我想在后台先选择一个指定的打印机,然后打印一个指定的文件(非文本和图片格式),不需要用户手动选择,如何用代码实现?

选择打印机可以用Printers,打印特殊格式的文件怎么办?而且我要选择的打印机不是默认打印机——有个API函数可以打印文件,但是所用的打印机是默认的。因为都是在后台运行,所以不希望用CommonDialog弹出打印对话框由用户选择。有API函数可以改变默认打印机吗?

请高手指教。急用!多谢!
...全文
16 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
CobraKing 2003-12-17
  • 打赏
  • 举报
回复
看来没有更多信息了,结贴先!
CobraKing 2003-09-03
  • 打赏
  • 举报
回复
我查到API函数OpenPrinter、StartDoc、ClosePrinter可以实现如上功能,但是一时没有找到用VB调用的方法。MSDN上的example是VC++的,偶看的不大明白。
有谁知道相关资源或者知道函数的使用方法,请指点一二。多谢!
CobraKing 2003-09-03
  • 打赏
  • 举报
回复
rainstormmaster(rainstormmaster)

这两篇文章我都看过了。分别实现选择打印机和打印任意文档的功能没有问题,但是怎么让他们配合起来使用哪?选择了打印机后再用这个打印机打印指定的文档?我试过了,ShellExecuteAny使用的是默认打印机,用Printers找到了想要的打印机但是没有改变默认的打印机。就是说Printer对象和ShellExecuteAny函数没有关系。
rainstormmaster 2003-09-02
  • 打赏
  • 举报
回复
如何在不开启文件的情况下打印各类文件?

您还记得或怀念以前 DOS 时代,在 DOS 的命令列就可以直接下指令打印文件吗?

其实这个题目的标题,就如同当今的报纸标题一般,有点夸张,因为要打印文件,势必要先开启文件!

但是您也不用失望,既然标题会这样订,表示我也有好方法 (其实应该说 Microsoft 有提供好方法)!您只要使用 ShellExecuteAny 这个 API,对于各种不同格式不同类型的文件,您都不用自己先去启动开启该类文件的应用程序,再开启文件,再打印文件!

看到上面的说明,是否让您回想起之前我们提到过的二个主题:

如何用 VB 启动其他程序或开启各类文件?
完全模拟【开始】中的【运行...】功能

在这二个主题中,我们都有提到,不必管文件的扩展名是什么?格式是什么?您都可以使用如下面

Shell("Start C:\Test.txt")
Call Shell("rundll32.exe url.dll,FileProtocolHandler " & Text1, 1)

的方式来启动程序或开启文件。今天,我们要提到的 API 也可以开启或执行各种不同类型的文件,但是那不是我们今天的重点 (如果各位有兴趣的话,请自行研究!),今天的重点是 ShellExecuteAny 这个 API 它可以:

1、自动依文件型态帮我们在 Background 启动应用程序。
2、自动打印文件。
3、自动再关闭文件。

应用在我们的 VB 程序中的话,使用者只要输入或选择文件,不管什么文件 (当然是指在注册表中曾经注册过的文件类型),都可以打印!

'以下是完成的模组:

Private Declare Function ShellExecuteAny Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As Any, ByVal lpDirectory As Any, ByVal nShowCmd As Long) As Long

Const SW_SHOWMINNOACTIVE = 7

Sub PrintAnyFile(FileToPrint As String)
Dim Ret As Long
Ret = ShellExecuteAny(Me.hwnd, "print", FileToPrint, ByVal 0&, ByVal 0&, SW_SHOWMINNOACTIVE)
End Sub

'实际使用案例如下:

Private Sub Command1_Click()
PrintAnyFile Text1.Text
End Sub

其实上面这种打印文件的方式,它的作用方式,和我们直接将文件文件拖拉到打印机的图示上去打印文件是一样的道理! (如果您之前尚不知道这个功能的话,您现在可以试试看将一份文件直接拖拉放到打印机的图示上,看看结果如何!)
rainstormmaster 2003-09-02
  • 打赏
  • 举报
回复
如何在程序中更改预设的打印机?

在上一个单元中,我们使用 Printer 物件来取得机器中预设打印机的机型、驱动程序及连接端口,那是否可以更改预设打印机呢?可以的,不过除了 Printer 物件之外,这次我们要多用一个 Printers 集合物件!

先来看一段程序码:

Private Sub Form_Load()
'利用 Printers 集合物件取得所有打印机
For i = 0 To Printers.Count - 1
'在 Combo1 中依序加入打印机名称
Combo1.AddItem Printers(i).DeviceName
Next
'将目前的预设打印机放在 Combo1.Text 中
Combo1.Text = Printer.DeviceName
End Sub

Private Sub Command1_Click()
'未选择
If Combo1.ListIndex = -1 Then
MsgBox "打印机未更改,请先选择打印机!"
Exit Sub
End If
'使用者选定之打印机设定为预设打印机
Set Printer = Printers(Combo1.listindex)
End Sub
在这一段程序中,我们在 Form_Load 中先利用 Printers 集合物件找出所有的打印机名称,放在 Combo1 中,记得 Combo1 不可将 Sorted 设成 True,这样子的话,Combo1 的索引值 (Index) 便会和 Printers 集合物件的索引值 (Index) 相同!

使用者在 Combo1 中选定打印机后,在 Command1_Click 中,我们便可以将 Combo1 的索引值带入Printers 集合物件的索引值,重新设定新的预设打印机。

这样子的设定只有在程序中有效,程序结束后,预设打印机会恢复成原来的预设打印机!

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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