|
Windows 應(yīng)用程序的中西文輸入界面中,中、西文的錄入需要手工在漢字輸入與西文輸入之間來回切換,使用起來非常繁瑣。針對這一問題,在開發(fā)軟件時,可以在程序中設(shè)置一下拉選擇框,讓用戶自己選擇其喜歡的漢字輸入法,并且在中文錄入框中讓程序自動設(shè)置用戶喜歡的輸入法,純西文、數(shù)字輸入的地方,讓程序自動切換成西文狀態(tài)。這樣,用戶在進行中西文錄入時,根本不需要手工進行中、西文的來回切換,只管在相應(yīng)的地方進行錄入即可,實現(xiàn)了中西文輸入的智能識別。
本文設(shè)計環(huán)境為VFP6.0,中文Windows 98。 一、實現(xiàn)方法 要實現(xiàn)以上功能,需利用Windows API 注冊表方面的函數(shù)打開系統(tǒng)的注冊表以獲得當前用戶可使用的漢字輸入法的名稱,將其放入VFP 6.0 表單中的下拉框中供用戶選擇;同時還需要獲得用于打開漢字輸入法的句柄;再利用獲得的句柄及API 有關(guān)打開漢字輸入法的功能調(diào)用,在相應(yīng)位置將用戶選擇的漢字輸入法打開;在西文輸入的地方利用VFP 6.0 本身的IMESTATUS(0)函數(shù)將漢字輸入法關(guān)閉即可。 1. 獲得當前用戶可使用的漢字輸入法名稱 ?、?a title=與注冊表有關(guān)的教程 href="http://www./search.aspx?Where=title&cid=0&Keyword=%D7%A2%B2%E1%B1%ED">注冊表HKEY_LOCAL_MACHINE -->System -->ControlCurrentSet -->Control --> ?。?gt;Keyboard Layouts 下包含Windows 系統(tǒng)支持的所有鍵盤布局及漢字輸入法所對應(yīng)的主鍵,如:"E200804"1,在其每一個中都對應(yīng)著Layout Text 子鍵,而其值為此種鍵盤布局或漢字輸入法的名稱,如" 幸福五筆"。 ?、?a title=與注冊表有關(guān)的教程 href="http://www./search.aspx?Where=title&cid=0&Keyword=%D7%A2%B2%E1%B1%ED">注冊表中HKEY_CURRENT_USER ->Keyboard Layout -->Preload 中包含當前用戶可使用的漢字輸入法所對應(yīng)的子鍵,而其鍵值正對應(yīng)1 中的健名。 ?、抢肰FP 6.0 自身帶的"registry.prg" 對系統(tǒng)的注冊表進行操作。VFP 6.0 的"registry.prg" 通過調(diào)用系統(tǒng)的API 函數(shù)給我們提供了對系統(tǒng)注冊表進行操作的類函數(shù),利用其提供的函數(shù)可對系統(tǒng)的注冊表進行各種操作,首先到HKEY_CURRENT_USER ->Keyboard Layout -->Preload 中獲得當前用戶可使用的全部漢字輸入法的個數(shù)及其所對應(yīng)的8 位16 進制字符串,而此字符串的十進制形式正是用以打開某一漢字輸入法所需要的句柄,再利用已獲得的鍵名1 到注冊表HKEY_LOCAL_MACHINE -->System -->ControlCurrentSet -->Control -->Keyboard Layouts -->Layout text 中查找所對應(yīng)的漢字輸入法的中文名稱。 2. 激活用戶所選擇的漢字輸入法 VFP 本身并沒有提供激活某一漢字輸入法的程序接口,必須利用WIN32 的API 函數(shù)ActivateKeyboardLayout (HKL hkl,UINT Flags),其中hkl 為某種漢字輸入法的句柄,F(xiàn)lags 為輸入法如何激活的標記,可以為"KLF_REORDER"、"KLF_SETFORPROCESS"、"KLF_UNLOADPREVIOUS"、"KLF_ACTIVATE",在程序中我們選擇"KLF_ACTIVATE" 即可。 二、編程實現(xiàn) 筆者通過在Form 下放置一標簽及下拉組合框,同時放置了四個Label、二個Edit 、一個ComboBox、Memo 及Button 為例進行編程說明: 1. 在VFP 中建立一新的表單form1 在VFP 中選擇" 文件(F)" 菜單下的" 新建(N)",然后選定" 表單(F)",單擊" 新建" 按鈕,生成一新的表單form1, 設(shè)定form1 的屬性caption。 Caption=" VFP 下輸入法編程示例" Autocenter=.T. 在FORM1 的init 事件中寫入以下代碼: SET PROC TO "C:\Program Files\Microsoft Visual Studio\msdn98\98vs \1033\;samples\vfp98\Classes\registry.PRG" #DEFINE HKEY_CURRENT_USER -2147483647 ?。ΓITSET(0,31) +1 #DEFINE HKEY_LOCAL_MACHINE -2147483646 ?。ΓITSET(0,31) +2 DECLARE INTEGER ActivateKeyboardLayout in win32api integer hkl,string flag; addi public handle,tnumber private I,cvalue dime aregopts[1] cvalue='' i=1 frmMyForm = CREATEOBJECT("registry") frmMyForm.init() frmMyForm.EnumOptions(@aregopts,"keyboard Layout\preload",HKEY_CURRENT_USER,.t.) &&獲得當前用戶可用的漢字輸入法 的個數(shù)及其在注冊表中所對應(yīng)的主鍵 tnumber=alen(aregopts) public dime aregopts1[tnumber],dime aregopts2 [tnumber],dime aregopts3[tnumber] for i=1 to tnumber frmMyForm.EnumOptions(@aregopts1,"keyboard Layout\preload\" +aregopts[I],HKEY_CURRENT_USER,.F.) &&獲得當前用戶可用的漢字輸入法 在注冊表中所對應(yīng)的主鍵值 aregopts2[i]=aregopts1[2] frmMyForm.GetRegKey("layout ;text",@cvalue, "System\CurrentControlSet\;Control\Keyboard layouts\" +aregopts2[i],HKEY_LOCAL_MACHINE) &&獲得當前用戶可用的漢字輸入法 在注冊表中所對應(yīng)的中文名稱 if cvalue=" 美國101" .or. cvalue=" 美國英語"then aregopts3[i]=" 英語( 美國)" else aregopts3[i]=cvalue endif endfor 2. 在Form1 中添加三個標簽Label1、Label2、Label3 及編輯框Edit1、Edit2、Memo1,設(shè)定其屬性 Label1.Caption= 中文輸入編輯框 Label1.FontSize=12 Label1.Alignment=1 -右 Label2.Caption= 西文輸入編輯框 Label2.FontSize=12 Label2.Alignment=1 -右 Label3.Caption= 中文多行文本編輯器 Label3.FontSize=12 Label3.Alignment=1 -右 Text1.imemode=0 -無控件(默認) Text2.imemode=2 -關(guān)閉IME Text3.imemode=0 -無控件(默認) 在Text1、Text3 的屬性gotfocus 中寫入以下代碼: ActivateKeyboardLayout(handle, 'KLF_ACTIVATE') &&激活用戶&&選擇的輸入法 3. 在Form1 中添加一標簽Label4,設(shè)定其屬性為 Alignment=1 -右 Caption = 選擇最喜歡的輸入法 Font.Size=12 ForeColor=255,0,0 BackColor=192,192,192 在Form1 中添加一下拉組合框Combo1, Combo1.Style="1 -下拉一列表框" Combo1.Rowsourcetype=aregopts4 Combo1.Rowsource=5 -數(shù)組 在屬性中選擇ckick event, 對此事件編程,寫入以下代碼: *此段程序用于將十六進制字符串 轉(zhuǎn)換為十進制整數(shù) *VFP 本身沒有相應(yīng)的轉(zhuǎn)換函數(shù) private return1,return2,counter, length,flag,strings counter=1 do while counter<=tnumber if this.value=aregopts3[counter] strings=aregopts2[counter] clea exit endif counter=counter +1 enddo length=len(strings) flag=substr(strings,1,1) IF flag>'8' ?。Γθ糇罡呶粸榇笥? 的數(shù)字, 則其對應(yīng)的數(shù)字為負數(shù) temp2='' return2='' i1=1 for i1=1 to length &&對各位進行取反操作 TEMP1=substr(stringS,i1,1) if temp1>'9' TEMP2=chr(5 -(ASC(TEMP1) -65) +48) else if temp1>'5' TEMP2=chr(15 -(ASC(TEMP1) -48) +48) else temp2=chr(15 -(ASC(TEMP1) -48) +55) endif endif return2=return2 +temp2 &&return2 為生成的反碼 endfor STRINGS=RETURN2 endif return1=0 I=1 FOR i=1 to length &&將十六進制數(shù)字符串 轉(zhuǎn)換為十進制數(shù) TEMP1=substr(strings,i,1) if temp1>'9' TEMP2=ASC(TEMP1) -65 +10 ELSE TEMP2=ASC(TEMP1) -48 ENDIF return1=TEMP2 *16^(length -i) +return1 endfor if flag>'8' handle=INT(0 -(return1 +1)) &&若為負數(shù), 對轉(zhuǎn)換的十進制數(shù)加1,取負 ELSE handle=INT(Return1) endif 4. 在Form1 中添加一命令按鈕Button1,設(shè)置其屬性: Caption= 退出 FontSize=12 雙擊此命令按鈕,對其Click 事件編程,寫入以下程序: ThisForm.Release Clear dlls 整個示例程序設(shè)計過程完成,將此表單保存為Form1,選擇菜單" 表單(M)" 中的" 執(zhí)行表單(R)" 命令。 首先,利用下拉組合框選擇你所喜歡的漢字輸入法,將光標移到中文輸入編輯框中,會發(fā)現(xiàn)你選擇的漢字輸入法自動在屏幕上出現(xiàn),再將光標移到西文輸入編輯框中,漢字輸入法自動關(guān)閉,如果將光標放到中文多行文本編輯器中,已選擇的漢字輸入法又自動出現(xiàn),并且輸入法可以進行多次選擇。如果在中文輸入框或中文多行文本編輯器中輸入西文內(nèi)容,只需在中文輸入法選擇框中選擇" 英語(美國)" 即可。 |
|
|