古詩詞大全網 - 成語解釋 - PB打印機選擇列表的分析與實現

PB打印機選擇列表的分析與實現

 Word的打印對話框中提供了壹個選擇打印機的下拉列表 但是我們在PowerBuilder編程中常用的是PrintSetup函數打開的Printer Setup設置窗口 在該窗口中 我們可以在列表框中選擇我們所要的打印機 然而很遺憾的是這個Printer Setup窗口是英文界面 對於我們開發的純中文界面的應用程序 其中卻有著這樣壹個很重要的然而卻是英文界面的窗口 我想 大多數程序員都是不能容忍的 PowerBuilder的打印控制是最難控制的 在網上見到的許多疑難問題大都與打印有關 但無論如何 我們的中文應用程序還是應該向用戶提供這樣壹個中文的打印機選擇窗口

 做壹個類Word的打印對話窗口並不復雜 PowerBuilder的example程序中有完整的做好的窗體 PFC中也有類似的內容 將上面的英文文本及提示改為中文就行了 但該打印窗口沒有提供象word壹樣的打印機選擇下拉列表框 我們必須自己做壹個

 通過對Windows X系統進行分析 我們能夠知道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 kernel dll

 2 定義兩個函數 函數壹 ouf_get_windows_dirctory() 用途 取windows目錄 參數 無 返回值類型 string 函數體 string ls_WindowsDirctory ulong lu_Buf

lu_Buf = ls_WindowsDirctory = Space( ) 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 = 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_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 ) ls_printer = left (ls_tmp li_point ) IF trim (ls_printer) <> AND NOT IsNull (ls_printer) THEN this text = trim (ls_printer) //設置下拉列表框文本為當前打印機 ELSE selectitem ( ) 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))

lishixinzhi/Article/program/SQL/201311/16341