Database 版 (精华区)
发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标 题: 汉字输入法类控件在VFP下的实现及应用
发信站: 哈工大紫丁香 (2000年12月06日20:03:10 星期三), 站内信件
汉字输入法类控件在VFP下的实现及应用
中文MIS系统大都涉及中西文的混合录入,在进行数据录入特别是大量的数据
录入时,需要在中西文输入状态之间来回切换,使用起来非常繁琐。为此,笔者设
计了一个汉字输入法类控件,可让用户在中文录入位置自动打开用户喜欢的汉字输
入法;在西文录入处,汉字输入法自动关闭。
控件制作
1.启动VFP后,新建一个容器类(container),并命名为“ime”。
2.在容器中添加标签Label1及下拉组合框Combo1,设置属性如下:
Label1.Caption=“选择喜欢的输入法”
Label1.FontName=“宋体″
Combo1.RowSource=“imename”
Combo1.RowSourceType=“5-数组”
在Combo1的InteractiveChange事件中写入以下程序:
private selindex
selindex=this.listindex
this.parent.imehandle=dechandle[selindex]
3.双击容器IME1属性init事件的“默认过程”,写入以下程序代码:
DECLARE INTEGER GetKeyboardLayoutList in win32api integer;
nbuff,string @pointer1 addi
DECLARE INTEGER ImmGetDescription in imm32 integer hkl,string;
@lpsz,integer number addi
DECLARE INTEGER ActivateKeyboardLayout in win32api integer;
hkl,string flag addi
local maxnumber,handlebuf,i,j,temp1
public imename,dechandle,imenumber
maxnumber=15
handlebuf=space(60)
&&按15个输入法设置,每个占4个字符
clea
&&获得系统已安装的输入法数及句柄
imenumber=GetKeyboardLayoutList(maxnumber,@handlebuf)
dim ehexhandle[imenumber],dechandle[imenumber],imename[imenumber]
for j=1 to imenumber
temp1=′ ′
for i=4 to 1 step -1
temp1=temp1+this.producehandle(asc(substr(handlebuf,i+(j-1)*4,
1)))
endfor
hexhandle[j]=temp1
dechandle[j]=this.hextodec(temp1)
imename1=space(29)
ImmGetdescription(dechandle[j],@imename1,29)
if alltrim(imename1)==′ ′
imename[j]=″英语(美国)″
else
imename[j]=alltrim(imename1)
endif
endfor
4.为类ime添加“producehandle”方法,在此方法中写入以下程序:
para ascvalue
if ascvalue〈16
if ascvalue〈10
hexvalue=′0′+alltrim(str(ascvalue))
else
hexvalue=′0′+alltrim(chr(55+ascvalue))
endif
else
highdec=int(ascvalue/16)
lowdec=mod(ascvalue,16)
if highdec〈10
highhex=alltrim(str(highdec))
else
highhex=alltrim(chr(55+highdec))
endif
if lowdec〈10
lowhex=alltrim(str(lowdec))
else
lowhex=alltrim(chr(55+lowdec))
endif
hexvalue=highhex+lowhex
endif
return hexvalue
5.为类ime再添加新方法″hextodec″,此方法是类ime内部使用的函数,用于
将十六进制的字符串转换为所对应的十进制数,其代码如下:
para strings
private return1,return2,counter,length,flag,strings
length=len(strings)
flag=substr(strings,1,1)
if flag〉=′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′ &&若为负数,对转换的十进制数加1,取负
handle=int(0-(return1+1))
else
handle=int(return1)
endif
return handle
6.为类ime再添加一新方法“activeime”,为程序提供打开选定输入法的接口
,其代码如下:
ActivateKeyboardLayout(this.imehandle,
′KLF—ACTIVATE′)
7.再为类ime添加一新的属性“ImeHandle”,设置其缺省值为67699721,并将
此容器类的大小调整为:
Ime.Height=24
Ime.Width=300
Ime.BackStyle=0-透明
至此,整个汉字输入法选择类设计完毕。
汉字输入法类控件应用实例
在VFP中新建一表单,命名为DemoForm,设置其属性:
Caption=汉字输入法选择类控件示例表单
1.将汉字输入法选择类控件放置到表单中,设置好位置,其Name为“ime1”。
2.在DemoForm中添加三个标签Label1、Label2、Label3及文本框Text1、
Text2和编辑框Edit1,设定属性如下:
Label1.Caption=中文输入文本框
Label1(Label2、Label3).FontSize=12
Label1(Label2、Label3).Alignment=1-右
Label2.Caption=西文输入文本框
Label3.Caption=中文输入编辑框
Text1.ImeMode=0-无控件(默认)
Text2.ImeMode=2-关闭IME
Edit1.ImeMode=0-无控件(默认)
在Text1、Edit1的属性GotFocus事件中写入以下代码:
ThisForm.Ime1.ActiveIme()
3.在表单中添加一命令按钮Button1,设置其属性:
Caption=退出
FontSize=12
对其Click事件写入以下程序:
ThisForm.Release
Clear dlls
4.到此整个示例表单设计完成。保存后运行此表单,其界面如下:
利用下拉组合框选择你所喜欢的汉字输入法,将光标移到中文输入文本框中,
会发现你选择的汉字输入法自动在屏幕上打开,再将光标移到西文输入文本框中,
汉字输入法自动关闭,如果将光标放到中文编辑框中,已选择的汉字输入法又自动
打开。并且输入法可以进行多次选择,如果在中文输入文本框或中文输入编辑框中
输入西文内容,只需在中文输入法选择框中选择“英语(美国)”。由于减少了输
入法切换的次数,提高了数据的录入速度,故而极大地方便了用户的使用。
--
大海无边天做岸
山登绝顶我为风
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.752毫秒