?? vfp中的漢字輸入編程.txt
字號:
實用技巧
VFP下漢字輸入法的編程
東方煙草集團有限公司
王俊峰
---- WINDOWS應用程序的中西文輸入界面中,中、西文的錄入需要手工在漢字輸入與西文輸入之間來回切換,使用起來非常繁瑣。針對這一問題,在開發軟件時,可以在程序中設置一下拉選擇框,讓用戶自己選擇其喜歡的漢字輸入法,并且在中文錄入框中讓程序自動設置用戶喜歡的輸入法,純西文、數字輸入的地方,讓程序自動切換成西文狀態。這樣,用戶在進行中西文錄入時,根本不需要手工進行中、西文的來回切換,只管在相應的地方進行錄入即可,實現了中西文輸入的智能識別,極大地改善了程序的易用性。
---- VFP5.0中,有關漢字輸入方面的函數只有IMESTATUS(),用來在中文與西文之間進行簡單的切換,不能實現系統中任一漢字輸入法的選擇,筆者曾在DELPHI下做過相似的工作,比較簡單地實現了以上想法。但在VFP下要實現此項功能比較復雜,需調用有關IME及注冊表方面的API函數來實現,筆者通過查找大量資料找到了一種較好的解決方法。本文設計環境為VISUAL FOXPRO VER6.0(以下簡稱VFP6.0),中文WINDOWS'98。
---- 一、 實現方法簡述
---- 要實現以上功能,需利用WINDOWS'API注冊表方面的函數打開系統的注冊表以獲得當前用戶可使用的漢字輸入法的名稱,將其放入vfp6.0表單中的下拉框中供用戶選擇;同時還需要獲得用于打開漢字輸入法的句柄;再利用獲得的句柄及WINDOWS'API有關打開漢字輸入法的功能調用,在相應位置將用戶選擇的漢字輸入法打開;在西文輸入的地方利用vfp6.0本身的IMESTATUS(0)函數將漢字輸入法關閉即可。
---- 1、 獲得當前用戶可使用的漢字輸入法名稱
---- ⑴注冊表HKEY_LOCAL_MACHINE?System?ControlCurrentSet?Control?
---- ?Keyboard Layouts下包含WINDOWS系統支持的所有鍵盤布局及漢字輸入法所對應的主鍵,如:“E200804"①,在其每一個中都對應著Layout Text子鍵,而其值為此種鍵盤布局或漢字輸入法的名稱,如“幸福五筆”。
---- ⑵、注冊表中HKEY_CURRENT_USER->Keyboard Layout?Preload中包含當前用戶可使用的漢字輸入法所對應的子鍵,而其鍵值正對應①中的健名。
---- ⑶、利用vfp6.0自身帶的“registry.prg"對系統的注冊表進行操作。Vfp6.0 的“registry.prg"通過調用系統的API函數給我們提供了對系統注冊表進行操作的類函數,利用其提供的函數可對系統的注冊表進行各種操作,首先到HKEY_CURRENT_USER->Keyboard Layout?Preload中獲得當前用戶可使用的全部漢字輸入法的個數及其所對應的8位16進制字符串,而此字符串的十進制形式正是用以打開某一漢字輸入法所需要的句柄,再利用已獲得的鍵名①到注冊表HKEY_LOCAL_MACHINE?System?ControlCurrentSet?Control?Keyboard Layouts?Layout text中查找所對應的漢字輸入法的中文名稱。而此正為解決輸入法名稱來源的關鍵。
---- 2、 激活用戶所選擇的漢字輸入法。
---- vfp本身并沒有提供激活某一漢字輸入法的程序接口,必須利用WIN32的API 函數ActivateKeyboardLayout(HKL hkl,UINT Flags),其中hkl為某種漢字輸入法的句柄,Flags為輸入法如何激活的標記,可以為“KLF_REORDER"、“KLF_SETFORPROCESS"、“KLF_UNLOADPREVIOUS"、“KLF_ACTIVATE",在程序中我們選擇“KLF_ACTIVATE"即可。
---- 二、VFP下漢字輸入法的編程實現。
---- 筆者通過在Form下放置一標簽及下拉組合框,同時放置了四個Label、二個Edit 、一個ComboBox、Memo及Button為例進行編程說明:
---- 1、 在vfp中建立一新的表單form1.
---- 在vfp中選擇“文件(F)”菜單下的“新建(N)”,然后選定“表單(F)”,單擊“新建”按鈕,生成一新的表單form1,設定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 && BITSET(0,31)+1
#DEFINE HKEY_LOCAL_MACHINE
-2147483646 && BITSET(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.)
&&獲得當前用戶可用的漢字輸入法
的個數及其在注冊表中所對應的主鍵
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.)
&& 獲得當前用戶可用的漢字輸入法
在注冊表中所對應的主鍵值
aregopts2[i]=aregopts1[2]
frmMyForm.GetRegKey("layout ;text",
@cvalue,"System\CurrentControlSet\;
Control\Keyboard layouts\"+aregopts2[i],
HKEY_LOCAL_MACHINE)
&& 獲得當前用戶可用的漢字輸入法
的在注冊表中所對應的中文名稱
if cvalue="美國 101" .or. cvalue="美國英語"then
aregopts3[i]="英語(美國)"
else
aregopts3[i]=cvalue
endif
endfor
---- 2、 在Form1中添加三個標簽Label1、Label2、Label3及編輯框Edit1、Edit2、
Memo1,設定其屬性
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-關閉IME
Text3.imemode=0-無控件(默認)
在Text1、Text3的屬性gotfocus中寫入以下代碼:
ActivateKeyboardLayout(handle, 'KLF_ACTIVATE') &&激活用戶
&&選擇的輸入法
---- 3、在Form1中添加一標簽Label4,設定其屬性為
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-數組
在屬性中選擇ckick event,對此事件編程,寫入以下代碼:
*此段程序用于將十六進制字符串轉換為十進制整數
*VFP本身沒有相應的轉換函數
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' &&若最高位為大于8的數字,
則其對應的數字為負數
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 &&將十六進制數字符串轉換為十進制數
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))
&&若為負數,對轉換的十進制數加1,取負
ELSE
handle=INT(Return1)
endif
---- 4、 在Form1中添加一命令按鈕Button1,設置其屬性:
Caption=退 出
FontSize=12
雙擊此命令按鈕,對其Click事件編程,寫入以下程序:
ThisForm.Release
Clear dlls
---- 整個示例程序設計過程完成,將此表單保存為Form1,選擇菜單“表單(M)”中的“執行表單(R)” 首先,利用下拉組合框選擇你所喜歡的漢字輸入法,將光標移到中文輸入編輯框中,會發現你選擇的漢字輸入法自動在屏幕上出現,再將光標移到西文輸入編輯框中,漢字輸入法自動關閉,如果將光標放到中文多行文本編輯器中,已選擇的漢字輸入法又自動出現。并且輸入法可以進行多次選擇,如果在中文輸入框或中文多行文本編輯器中輸入西文內容,只需在中文輸入法選擇框中選擇“英語(美國)”即可。
---- 三、結束語
---- 從上面的程序代碼可以出,在應用程序的錄入界面中,設置一輸入法選擇下拉組合框,既可以做到在中西文錄入時不用進行錄入法的來回選擇,更可以做到讓用戶選擇其最喜歡的漢字輸入法,錄入界面對用戶來講非常友好、方便、快捷。如果將此程序中漢字輸入法的選擇改編為vfp下的一個通用類控件,在程序開發時,就可以更方便地使用了。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -