PB打印机选择列表的分析与实现

转载 2012年04月05日 16:19:44

PB打印机选择列表的分析与实现

(加入日期:2002-7-18)

保存文章至硬盘】【打印文章】【字体:

分享到: 0
江苏省姜堰市第五中学 李中华

---- Word的打印对话框中提供了一个选择打印机的下拉列表,但是我们在PowerBuilder编程中常用的是PrintSetup函数打开的Printer Setup设置窗口,在该窗口中,我们可以在列表框中选择我们所要的打印机。然而很遗憾的是这个Printer Setup窗口是英文界面。对于我们开发的纯中文界面的应用程序,其中却有着这样一个很重要的然而却是英文界面的窗口,我想,大多数程序员都是不能容忍的。PowerBuilder的打印控制是最难控制的,在网上见到的许多疑难问题大都与打印有关,但无论如何,我们的中文应用程序还是应该向用户提供这样一个中文的打印机选择窗口。

---- 做一个类Word的打印对话窗口并不复杂,PowerBuilder的example程序中有完整的做好的窗体,PFC中也有类似的内容。将上面的英文文本及提示改为中文就行了。但该打印窗口没有提供象word一样的打印机选择下拉列表框。我们必须自己做一个。

---- 通过对Windows 9X系统进行分析,我们能够知道Windows的打印机的信息一般存放在注册表及Win.ini文件中。这些信息分别位于系统注册表的HKEY_CURRENT_CONFIG\System\CurrentControlSet\
Control\Print\Printers下及win.ini的[windows]及[Devices]段下。在注册表中每一个打印机在上面的目录下均有一个以打印机为名的主键条目,Win.ini的[Devices]也一样。在注册表上述目录下,有default字符串值指示当前的默认打印机;win.ini中的[windows]中device的值对也一样对应了当前的打印机。笔者通过下面几个简单的试验,判别出起决定作用的是win.ini文件而非注册表信息。

---- 试验一:将注册表中上述目录的default的打印机值对改变为其它打印机,再运行printsetup函数,发现没有产生任何反应。而将win.ini文件中的[windows]下的devices的值对改变一下(哪怕胡乱输入几字符),再运行printsetup,打印机选择列表中立即体现出了相应的变化。

---- 试验二:在注册表上述目录下添加一个主键,运行printsetup,没有发现打印机列表框中增加打印机,而在win.ini文件的[Devices]下随便增加一个,则printer setup窗口中立即增加了所输入的打印机。

---- 因此,应从win.ini文件入手编制打印机选择下拉列表框。

---- 可是,PowerBuilder提供了RegistryKeys能从注册表中某一主键下子所有主键条目的列表,却没有提供任何函数从ini文件中取相似的信息。当然,我们可以自己编一个,将win.ini文件内容一行一行地读入某字符串,使之与“[Device]”进行匹配判断,若是再继续向下读至某一行头一个字符为“[”的行并经过复杂的字符串处理以取得打印机列表(注:纯PB开发下)。但我们知道,windows增加打印机有专门的程序,而且,该程序会自动地同时在注册表及win.ini文件中同时增加打印机。因此我们可以这样入手:从注册表中取得打印机的列表信息,而从win.ini文件中取得及设置当前打印机信息。这样一来,问题就简单得多了。

---- 经过以上分析论证,下面就开始做了。根据一般做法,我们会将该列表框封装成一个标谁的用户对象,以后开发时,只需在某窗体中调用这一用户对象就行了。

---- 步骤一:新建一可视(visual)的标准(standard)的用户对象,在Select Visual Standard Type对话框中选择DropDownListBox(下拉列表框),点击“OK”按钮进入设计画面。

---- 步骤二:开始编程。

---- 1、定义两个实例变量

string is_windows_dirctory,is_winini_file
声明一API函数用以取windows目录
FUNCTION ulong GetWindowsDirectoryA(ref
string wdir, ulong buf) LIBRARY "kernel32.dll"

---- 2、定义两个函数:
函数一:ouf_get_windows_dirctory()
用途:取windows目录。
参数:无。
返回值类型:string。
函数体:
string ls_WindowsDirctory
ulong lu_Buf

lu_Buf = 144
ls_WindowsDirctory = Space(144)
GetWindowsDirectoryA(ls_WindowsDirctory,lu_Buf)
return ls_WindowsDirctory

函数二:ouf_get_printer()
用途:取打印机信息并增加至下拉列表框。
参数:无
返回类型:boolean
函数体:
string ls_printer[] //定义一个字符串型数组

integer li_rtn,li_ArrayUp,li_step
li_rtn = RegistryKeys("HKEY_LOCAL_MACHINE\System
\CurrentControlSet\Control\Print\
Printers", ls_printer) //从注册表中取其列表

IF li_rtn = 1 THEN
li_ArrayUp = UpperBound(ls_printer)
//取列表数组上限
IF li_ArrayUp >= 1 THEN
FOR li_step = 1 TO li_ArrayUp
additem ( ls_Printer[li_step] )
//向下拉列表框中增加打印机
NEXT
ELSE
return false
END IF
ELSE
return false
END IF
return true

3、在constructor事件下编写下列代码:
boolean lb_PrinterExists
string ls_printer,ls_tmp
int li_point
is_windows_dirctory = ouf_get_windows_dirctory ( )
is_winini_file = is_windows_dirctory + "\win.ini"

lb_PrinterExists = ouf_get_printer ( )
//向下拉列中增加打印机
IF NOT lb_PrinterExists THEN
messagebox ("提示!","尚未安装打印机!")
ELSE
ls_tmp = profilestring (is_winini_file,
"windows","device","") //取当前打印机信息
//由于win.ini信息中该信息还包括有其它参数如端口,
因此必须进行截取处理。
ls_tmp = trim (ls_tmp)
li_point = pos (ls_tmp,",",1)
ls_printer = left (ls_tmp,li_point - 1)
IF trim (ls_printer) <> "" AND NOT
IsNull (ls_printer) THEN
this.text = trim (ls_printer)
//设置下拉列表框文本为当前打印机
ELSE
selectitem ( 1 )
END IF

END IF

---- 4、在selectionchanged事件中输入:
string ls_printer
ls_printer = profilestring
(is_winini_file,"Devices",
trim(this.text (index)),"") //从win.ini文件中取当
前打印机完整信息(含端口及其它)
//在win.ini文件及注册表中更新当前打印机
setprofilestring (is_winini_file,"windows","device",
trim(this.text (index)) + "," +ls_printer)
RegistrySet( "HKEY_CURRENT_CONFIG\System
\CurrentControlSet\Control\Print\Printers",
"Default", trim(this.text))

---- 5、最后保存该用户对象(如保存为nvo_ddlb_of_printer)即可。

PB获取系统打印机

PB使用小技巧:PB程序通过注册表信息获取系统打印机列表,并找出默认打印机,希望对大家有所帮助! 先在窗口中添加一个下拉控件,在窗口的open事件中添加如下代码: 本文章转载至:http://www....
  • nickeyj
  • nickeyj
  • 2008年11月24日 23:39
  • 627

在PB程序中如何设置打印机?

//先定义局部函数如下:FUNCTION ulong GetWindowsDirectoryA(ref string wdir, ulong buf) LIBRARY "kernel32.dll"//...
  • hnas_better
  • hnas_better
  • 2007年11月27日 10:16
  • 4027

pb 设置打印机

最近遇到关于打印的一些问题。 在数据窗口中实现了检索的数据,但需要打印出来,不知如何进行打印窗口设置。我的代码如下: printsetup()//设置打印机属性 dw_tj_result.Object...
  • bjash
  • bjash
  • 2015年02月01日 00:53
  • 1540

pb控制打印机

在使用连续纸打印数据窗口的情况下,需要定制打印的页长,以保证打印机走纸正确,不用人工干预,实现连续打印。在PB中须调用外部函数来自定义纸张长度,比较繁琐。本文介绍一种直接对打印机的控制方法,简单实现对...
  • ribut9225
  • ribut9225
  • 2014年02月18日 14:17
  • 3002

PB打印相关

              PB中打印相关 2009-03-20 09:58:00 分类: WINDOWS -----------------------------...
  • tlammon
  • tlammon
  • 2015年06月01日 11:02
  • 968

VB.NET 创建打印机选择列表

(作者:Dipal Choksi 来源:vbdotnetheaven.com,粗糙翻译:seal203) Introduction 介绍 In this example we will create...
  • Seal203
  • Seal203
  • 2015年06月01日 10:25
  • 998

C#如何获取本地的打印机列表并且指定默认打印机

相关代码如下: [DllImport("winspool.drv")] public static extern bool SetDefaultPrinter(Str...
  • esunshine1985
  • esunshine1985
  • 2014年03月24日 13:41
  • 1531

winform(c#)中实现打印机相关功能

 在实现我的打印功能时主要用到 Graphics 、PrintDialog、 PageSetupDialog 、PrintPreviewDialog、 StringReader 、ShowDialog...
  • nanqing
  • nanqing
  • 2007年05月11日 09:50
  • 2374

java 获取可用的打印机列表 和 当前默认打印机

import javax.print.DocFlavor; import javax.print.attribute.HashPrintRequestAttributeSet; import java...
  • NRlovestudy
  • NRlovestudy
  • 2016年01月11日 11:00
  • 3632

pb LPT打印

////空一行代码:CHAR(13)+CHAR(10)Int handle1,iDateTime ldtldt = DateTime(Date(Today()),Time('00:00:00'))i ...
  • ailex
  • ailex
  • 2010年07月23日 08:58
  • 430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PB打印机选择列表的分析与实现
举报原因:
原因补充:

(最多只允许输入30个字)