Word的打印對話框中提供了一個選擇打印機的下拉列表但是我們在PowerBuilder編程中常用的是PrintSetup函數打開的Printer Setup設置窗口在該窗口中我們可以在列表框中選擇我們所要的打印機然而很遺憾的是這個Printer Setup窗口是英文界面對於我們開發的純中文界面的應用程序其中卻有著這樣一個很重要的然而卻是英文界面的窗口我想大多數程序員都是不能容忍的PowerBuilder的打印控制是最難控制的在網上見到的許多疑難問題大都與打印有關但無論如何我們的中文應用程序還是應該向用戶提供這樣一個中文的打印機選擇窗口
做一個類Word的打印對話窗口並不復雜PowerBuilder的example程序中有完整的做好的窗體PFC中也有類似的內容將上面的英文文本及提示改為中文就行了但該打印窗口沒有提供象word一樣的打印機選擇下拉列表框我們必須自己做一個
通過對Windows X系統進行分析我們能夠知道Windows的打印機的信息一般存放在注冊表及Winini文件中這些信息分別位於系統注冊表的HKEY_CURRENT_CONFIG\System\CurrentControlSet\
Control\Print\Printers下及winini的[windows]及[Devices]段下在注冊表中每一個打印機在上面的目錄下均有一個以打印機為名的主鍵條目Winini的[Devices]也一樣在注冊表上述目錄下有default字符串值指示當前的默認打印機winini中的[windows]中device的值對也一樣對應了當前的打印機筆者通過下面幾個簡單的試驗判別出起決定作用的是winini文件而非注冊表信息
試驗一將注冊表中上述目錄的default的打印機值對改變為其它打印機再運行printsetup函數發現沒有產生任何反應而將winini文件中的[windows]下的devices的值對改變一下(哪怕胡亂輸入幾字符)再運行printsetup打印機選擇列表中立即體現出了相應的變化
試驗二在注冊表上述目錄下添加一個主鍵運行printsetup沒有發現打印機列表框中增加打印機而在winini文件的[Devices]下隨便增加一個則printer setup窗口中立即增加了所輸入的打印機
因此應從winini文件入手編制打印機選擇下拉列表框
可是PowerBuilder提供了RegistryKeys能從注冊表中某一主鍵下子所有主鍵條目的列表卻沒有提供任何函數從ini文件中取相似的信息當然我們可以自己編一個將winini文件內容一行一行地讀入某字符串使之與[Device]進行匹配判斷若是再繼續向下讀至某一行頭一個字符為[的行並經過復雜的字符串處理以取得打印機列表(注純PB開發下)但我們知道windows增加打印機有專門的程序而且該程序會自動地同時在注冊表及winini文件中同時增加打印機因此我們可以這樣入手從注冊表中取得打印機的列表信息而從winini文件中取得及設置當前打印機信息這樣一來問題就簡單得多了
經過以上分析論證下面就開始做了根據一般做法我們會將該列表框封裝成一個標誰的用戶對象以後開發時只需在某窗體中調用這一用戶對象就行了
步驟一新建一可視(visual)的標准(standard)的用戶對象在Select Visual Standard Type對話框中選擇DropDownListBox(下拉列表框)點擊OK按鈕進入設計畫面
步驟二開始編程
1定義兩個實例變量
string is_windows_dirctoryis_winini_file
聲明一API函數用以取windows目錄
FUNCTION ulong GetWindowsDirectoryA(ref
string wdir ulong buf) LIBRARY kerneldll
2定義兩個函數
函數一ouf_get_windows_dirctory()
用途取windows目錄
參數無
返回值類型string
函數體
string ls_WindowsDirctory
ulong lu_Buf
lu_Buf =
ls_WindowsDirctory = Space()
GetWindowsDirectoryA(ls_WindowsDirctorylu_Buf)
return ls_WindowsDirctory
函數二ouf_get_printer()
用途取打印機信息並增加至下拉列表框
參數無
返回類型boolean
函數體
string ls_printer[] //定義一個字符串型數組
integer li_rtnli_ArrayUpli_step
li_rtn = RegistryKeys(HKEY_LOCAL_MACHINE\System
\CurrentControlSet\Control\Print\
Printers ls_printer) //從注冊表中取其列表
IF li_rtn = THEN
li_ArrayUp = UpperBound(ls_printer)
//取列表數組上限
IF li_ArrayUp >= THEN
FOR li_step = TO li_ArrayUp
additem ( ls_Printer[li_step] )
//向下拉列表框中增加打印機
NEXT
ELSE
return false
END IF
ELSE
return false
END IF
return true
在constructor事件下編寫下列代碼
boolean lb_PrinterExists
string ls_printerls_tmp
int li_point
is_windows_dirctory = ouf_get_windows_dirctory ( )
is_winini_file = is_windows_dirctory + \winini
lb_PrinterExists = ouf_get_printer ( )
//向下拉列中增加打印機
IF NOT lb_PrinterExists THEN
messagebox (提示!尚未安裝打印機!)
ELSE
ls_tmp = profilestring (is_winini_file
windowsdevice) //取當前打印機信息
//由於winini信息中該信息還包括有其它參數如端口
因此必須進行截取處理
ls_tmp = trim (ls_tmp)
li_point = pos (ls_tmp)
ls_printer = left (ls_tmpli_point )
IF trim (ls_printer) <> AND NOT
IsNull (ls_printer) THEN
thistext = trim (ls_printer)
//設置下拉列表框文本為當前打印機
ELSE
selectitem ( )
END IF
END IF
4在selectionchanged事件中輸入
string ls_printer
ls_printer = profilestring
(is_winini_fileDevices
trim(thistext (index))) //從winini文件中取當前打印機完整信息(含端口及其它)
//在winini文件及注冊表中更新當前打印機
setprofilestring (is_winini_filewindowsdevice
trim(thistext (index)) + +ls_printer)
RegistrySet( HKEY_CURRENT_CONFIG\System
\CurrentControlSet\Control\Print\Printers
Default trim(thistext))
5最後保存該用戶對象(如保存為nvo_ddlb_of_printer)即可
From:http://tw.wingwit.com/Article/program/SQL/201311/16341.html