pb设置默认打印机:PB打印机选择列表的分析和实现

江苏省姜堰市第 5中学 李中华

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

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

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

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

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

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

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

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

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

---- 步骤 2:开始编程

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

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

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

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

2:ouf_get_prer
用途:取打印机信息并增加至下拉列表框
参数:无
返回类型:boolean
体:
ls_prer //定义串型

eger li_rtn,li_ArrayUp,li_step
li_rtn = RegistryKeys("HKEY_LOCAL_MACHINE\
\CurrentControlSet\Control\Pr\
Prers", ls_prer) //从注册表中取其列表

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

3、在constructor事件下编写下列代码:
boolean lb_PrerExists
ls_prer,ls_tmp
li_po
is_windows_dirctory = ouf_get_windows_dirctory ( )
is_winini_file = is_windows_dirctory + "\win.ini"

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

END IF

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

---- 5、最后保存该用户对象(如保存为nvo_ddlb_of_prer)即可
Tags:  如何选择打印机 pb实现用户权限管理 pb文件列表 pb设置默认打印机

延伸阅读

最新评论

发表评论