江苏省姜堰市第 5中学 李中华
---- Word
![](/icons/90926de.gif)
打印对话框中提供了
![](/icons/90926yi.gif)
个选择打印机
![](/icons/90926de.gif)
下拉列表
![](/icons/90926dou.gif)
但是我们在PowerBuilder编程中常用
![](/icons/90926de.gif)
是Pr
![](/icons/90926int.gif)
Setup
![](/icons/90926hanshu.gif)
打开
![](/icons/90926de.gif)
Pr
![](/icons/90926int.gif)
er Setup设置窗口
![](/icons/90926dou.gif)
在该窗口中
![](/icons/90926dou.gif)
我们可以在列表框中选择我们所要
![](/icons/90926de.gif)
打印机
![](/icons/90926dou2.gif)
然而很遗憾
![](/icons/90926de.gif)
是这个Pr
![](/icons/90926int.gif)
er Setup窗口是英文界面
![](/icons/90926dou2.gif)
对于我们开发
![](/icons/90926de.gif)
纯中文界面
![](/icons/90926de.gif)
应用
![](/icons/90926chengxu.gif)
![](/icons/90926dou.gif)
其中却有着这样
![](/icons/90926yi.gif)
个很重要
![](/icons/90926de.gif)
然而却是英文界面
![](/icons/90926de.gif)
窗口
![](/icons/90926dou.gif)
我想
![](/icons/90926dou.gif)
大多数
![](/icons/90926chengxu.gif)
员都是不能容忍
![](/icons/90926de.gif)
![](/icons/90926dou2.gif)
PowerBuilder
![](/icons/90926de.gif)
打印控制是最难控制
![](/icons/90926de.gif)
![](/icons/90926dou.gif)
在网上见到
![](/icons/90926de.gif)
许多疑难问题大都和打印有关
![](/icons/90926dou.gif)
但无论如何
![](/icons/90926dou.gif)
我们
![](/icons/90926de.gif)
中文应用
![](/icons/90926chengxu.gif)
还是应该向用户提供这样
![](/icons/90926yi.gif)
个中文
![](/icons/90926de.gif)
打印机选择窗口
---- 做
![](/icons/90926yi.gif)
个类Word
![](/icons/90926de.gif)
打印对话窗口并不复杂
![](/icons/90926dou.gif)
PowerBuilder
![](/icons/90926de.gif)
example
![](/icons/90926chengxu.gif)
中有完整
![](/icons/90926de.gif)
做好
![](/icons/90926de.gif)
窗体
![](/icons/90926dou.gif)
PFC中也有类似
![](/icons/90926de.gif)
内容
![](/icons/90926dou2.gif)
将上面
![](/icons/90926de.gif)
英文文本及提示改为中文就行了
![](/icons/90926dou2.gif)
但该打印窗口没有提供象word
![](/icons/90926yi.gif)
样
![](/icons/90926de.gif)
打印机选择下拉列表框
![](/icons/90926dou2.gif)
我们必须自己做
![](/icons/90926yi.gif)
个
---- 通过对Windows 9X系统进行分析
![](/icons/90926dou.gif)
我们能够知道Windows
![](/icons/90926de.gif)
打印机
![](/icons/90926de.gif)
信息
![](/icons/90926yi.gif)
般存放在注册表及Win.ini文件中
![](/icons/90926dou2.gif)
这些信息分别位于系统注册表
![](/icons/90926de.gif)
HKEY_CURRENT_CONFIG\
![](/icons/90926System.gif)
\CurrentControlSet\
Control\Pr
![](/icons/90926int.gif)
\Pr
![](/icons/90926int.gif)
ers下及win.ini
![](/icons/90926de.gif)
[windows]及[Devices]段下
![](/icons/90926dou2.gif)
在注册表中每
![](/icons/90926yi.gif)
个打印机在上面
![](/icons/90926de.gif)
目录下均有
![](/icons/90926yi.gif)
个以打印机为名
![](/icons/90926de.gif)
主键条目
![](/icons/90926dou.gif)
Win.ini
![](/icons/90926de.gif)
[Devices]也
![](/icons/90926yi.gif)
样
![](/icons/90926dou2.gif)
在注册表上述目录下
![](/icons/90926dou.gif)
有default
![](/icons/90926zifu.gif)
串值指示当前
![](/icons/90926de.gif)
默认打印机;win.ini中
![](/icons/90926de.gif)
[windows]中device
![](/icons/90926de.gif)
值对也
![](/icons/90926yi.gif)
样对应了当前
![](/icons/90926de.gif)
打印机
![](/icons/90926dou2.gif)
笔者通过下面几个简单
![](/icons/90926de.gif)
试验
![](/icons/90926dou.gif)
判别出起决定作用
![](/icons/90926de.gif)
是win.ini文件而非注册表信息
---- 试验
![](/icons/90926yi.gif)
:将注册表中上述目录
![](/icons/90926de.gif)
default
![](/icons/90926de.gif)
打印机值对改变为其它打印机
![](/icons/90926dou.gif)
再运行pr
![](/icons/90926int.gif)
![](/icons/90926set.gif)
up
![](/icons/90926hanshu.gif)
![](/icons/90926dou.gif)
发现没有产生任何反应
![](/icons/90926dou2.gif)
而将win.ini文件中
![](/icons/90926de.gif)
[windows]下
![](/icons/90926de.gif)
devices
![](/icons/90926de.gif)
值对改变
![](/icons/90926yi.gif)
下(哪怕胡乱输入几
![](/icons/90926zifu.gif)
)
![](/icons/90926dou.gif)
再运行pr
![](/icons/90926int.gif)
![](/icons/90926set.gif)
up
![](/icons/90926dou.gif)
打印机选择列表中立即体现出了相应
![](/icons/90926de.gif)
变化
---- 试验 2:在注册表上述目录下添加
![](/icons/90926yi.gif)
个主键
![](/icons/90926dou.gif)
运行pr
![](/icons/90926int.gif)
![](/icons/90926set.gif)
up
![](/icons/90926dou.gif)
没有发现打印机列表框中增加打印机
![](/icons/90926dou.gif)
而在win.ini文件
![](/icons/90926de.gif)
[Devices]下随便增加
![](/icons/90926yi.gif)
个
![](/icons/90926dou.gif)
则pr
![](/icons/90926int.gif)
er
![](/icons/90926set.gif)
up窗口中立即增加了所输入
![](/icons/90926de.gif)
打印机
---- 因此
![](/icons/90926dou.gif)
应从win.ini文件入手编制打印机选择下拉列表框
---- 可是
![](/icons/90926dou.gif)
PowerBuilder提供了RegistryKeys能从注册表中某
![](/icons/90926yi.gif)
主键下子所有主键条目
![](/icons/90926de.gif)
列表
![](/icons/90926dou.gif)
却没有提供任何
![](/icons/90926hanshu.gif)
从ini文件中取相似
![](/icons/90926de.gif)
信息
![](/icons/90926dou2.gif)
当然
![](/icons/90926dou.gif)
我们可以自己编
![](/icons/90926yi.gif)
个
![](/icons/90926dou.gif)
将win.ini文件内容
![](/icons/90926yi.gif)
行
![](/icons/90926yi.gif)
行地读入某
![](/icons/90926zifu.gif)
串
![](/icons/90926dou.gif)
使的和“[Device]”进行匹配判断
![](/icons/90926dou.gif)
若是再继续向下读至某
![](/icons/90926yi.gif)
行头
![](/icons/90926yi.gif)
个
![](/icons/90926zifu.gif)
为“[”
![](/icons/90926de.gif)
行并经过复杂
![](/icons/90926de.gif)
![](/icons/90926zifu.gif)
串处理以取得打印机列表(注:纯PB开发下)
![](/icons/90926dou2.gif)
但我们知道
![](/icons/90926dou.gif)
windows增加打印机有专门
![](/icons/90926de.gif)
![](/icons/90926chengxu.gif)
![](/icons/90926dou.gif)
而且
![](/icons/90926dou.gif)
该
![](/icons/90926chengxu.gif)
会自动地同时在注册表及win.ini文件中同时增加打印机
![](/icons/90926dou2.gif)
因此我们可以这样入手:从注册表中取得打印机
![](/icons/90926de.gif)
列表信息
![](/icons/90926dou.gif)
而从win.ini文件中取得及设置当前打印机信息
![](/icons/90926dou2.gif)
这样
![](/icons/90926yi.gif)
来
![](/icons/90926dou.gif)
问题就简单得多了
---- 经过以上分析论证
![](/icons/90926dou.gif)
下面就开始做了
![](/icons/90926dou2.gif)
根据
![](/icons/90926yi.gif)
般做法
![](/icons/90926dou.gif)
我们会将该列表框封装成
![](/icons/90926yi.gif)
个标谁
![](/icons/90926de.gif)
用户对象
![](/icons/90926dou.gif)
以后开发时
![](/icons/90926dou.gif)
只需在某窗体中
![](/icons/90926diaoyong.gif)
这
![](/icons/90926yi.gif)
用户对象就行了
---- 步骤
![](/icons/90926yi.gif)
:新建
![](/icons/90926yi.gif)
可视(visual)
![](/icons/90926de.gif)
标准(standard)
![](/icons/90926de.gif)
用户对象
![](/icons/90926dou.gif)
在Select Visual Standard Type对话框中选择DropDownListBox(下拉列表框)
![](/icons/90926dou.gif)
点击“OK”按钮进入设计画面
---- 步骤 2:开始编程
---- 1、定义两个例子变量
![](/icons/90926string.gif)
is_windows_dirctory,is_winini_file
声明
![](/icons/90926yi.gif)
API
![](/icons/90926hanshu.gif)
用以取windows目录
FUNCTION ulong GetWindowsDirectoryA(ref
![](/icons/90926string.gif)
wdir, ulong buf) LIBRARY "kernel32.dll"
---- 2、定义两个
![](/icons/90926hanshu.gif)
:
![](/icons/90926hanshu.gif)
![](/icons/90926yi.gif)
:ouf_get_windows_dirctory
用途:取windows目录
参数:无
返回值类型:
![](/icons/90926string.gif)
![](/icons/90926hanshu.gif)
体:
![](/icons/90926string.gif)
ls_WindowsDirctory
ulong lu_Buf
lu_Buf = 144
ls_WindowsDirctory = Space(144)
GetWindowsDirectoryA(ls_WindowsDirctory,lu_Buf)
![](/icons/90926return.gif)
ls_WindowsDirctory
![](/icons/90926hanshu.gif)
2:ouf_get_pr
![](/icons/90926int.gif)
er
用途:取打印机信息并增加至下拉列表框
参数:无
返回类型:boolean
![](/icons/90926hanshu.gif)
体:
![](/icons/90926string.gif)
ls_pr
![](/icons/90926int.gif)
er
![](/icons/90926zhk2.gif)
//定义
![](/icons/90926yi.gif)
个
![](/icons/90926zifu.gif)
串型
![](/icons/90926int.gif)
eger li_rtn,li_ArrayUp,li_step
li_rtn = RegistryKeys("HKEY_LOCAL_MACHINE\
\CurrentControlSet\Control\Pr
![](/icons/90926int.gif)
\
Pr
![](/icons/90926int.gif)
ers", ls_pr
![](/icons/90926int.gif)
er) //从注册表中取其列表
IF li_rtn = 1 THEN
li_ArrayUp = UpperBound(ls_pr
![](/icons/90926int.gif)
er)
//取列表
![](/icons/90926shuzu.gif)
上限
IF li_ArrayUp >= 1 THEN
FOR li_step = 1 TO li_ArrayUp
additem ( ls_Pr
![](/icons/90926int.gif)
er[li_step] )
//向下拉列表框中增加打印机
NEXT
ELSE
![](/icons/90926return.gif)
false
END IF
ELSE
![](/icons/90926return.gif)
false
END IF
![](/icons/90926return.gif)
true
3、在constructor事件下编写下列代码:
boolean lb_Pr
![](/icons/90926int.gif)
erExists
![](/icons/90926string.gif)
ls_pr
![](/icons/90926int.gif)
er,ls_tmp
![](/icons/90926int.gif)
li_po
is_windows_dirctory = ouf_get_windows_dirctory ( )
is_winini_file = is_windows_dirctory + "\win.ini"
lb_Pr
![](/icons/90926int.gif)
erExists = ouf_get_pr
![](/icons/90926int.gif)
er ( )
//向下拉列中增加打印机
IF NOT lb_Pr
![](/icons/90926int.gif)
erExists THEN
messagebox ("提示!","尚未安装打印机!")
ELSE
ls_tmp = profile
![](/icons/90926string.gif)
(is_winini_file,
"windows","device","") //取当前打印机信息
//由于win.ini信息中该信息还包括有其它参数如端口
因此必须进行截取处理
ls_tmp = trim (ls_tmp)
li_po
![](/icons/90926int.gif)
= pos (ls_tmp,",",1)
ls_pr
![](/icons/90926int.gif)
er = left (ls_tmp,li_po
![](/icons/90926int.gif)
- 1)
IF trim (ls_pr
![](/icons/90926int.gif)
er) <> "" AND NOT
IsNull (ls_pr
![](/icons/90926int.gif)
er) THEN
this.text = trim (ls_pr
![](/icons/90926int.gif)
er)
//设置下拉列表框文本为当前打印机
ELSE
selectitem ( 1 )
END IF
END IF
---- 4、在selectionchanged事件中输入:
![](/icons/90926string.gif)
ls_pr
![](/icons/90926int.gif)
er
ls_pr
![](/icons/90926int.gif)
er = profile
(is_winini_file,"Devices",
trim(this.text (index)),"") //从win.ini文件中取当
前打印机完整信息(含端口及其它)
//在win.ini文件及注册表中更新当前打印机
![](/icons/90926set.gif)
profile
![](/icons/90926string.gif)
(is_winini_file,"windows","device",
trim(this.text (index)) + "," +ls_pr
![](/icons/90926int.gif)
er)
RegistrySet( "HKEY_CURRENT_CONFIG\
\CurrentControlSet\Control\Pr
![](/icons/90926int.gif)
\Pr
![](/icons/90926int.gif)
ers",
"Default", trim(this.text))
---- 5、最后保存该用户对象(如保存为nvo_ddlb_of_pr
![](/icons/90926int.gif)
er)即可
延伸阅读
最新评论