📄 9937.txt
字号:
---- 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下的一个通用类控件,在程序开发时,就可以更方便地使用了。
****************************************************************
****************************************************************
◆有问必答◆
143. 回答请mailto: yaozheng@kali.com.cn?subject=143
Hi,各位大侠 ,
问题一:
在一个窗口中,放两个数据窗口dw_1,dw_2;dw_1显示主表,dw_2
显示明细表。希望达到,选取dw_1中的一条记录时,dw_2能根据一个属
性(比如说“编号”)显示明细。书上说定义一个检索参数,建立好后
它说“定义了一个没有用到的参数”。请问我该怎么半?
问题二:
在记录输入时,把学历框设为 DropDownDW 型,学历表中有“编号”
和“学历”两个属性,其中“编号”是为了综合查询时,用来查“某某
学历以上”时而设的。但问题出在当输入一条记录提交后,它怎么把编
号存到“学历”中?
问题三:
我现在软件启动时加一个登陆窗口,要求用户填写“用户名”“口
令”,要求能添加新用户,并让新用户输入新口令。应如何实现?
希望各路高手不吝赐教!
dallors@263.net
144. 回答请mailto: yaozheng@kali.com.cn?subject=144
在MIS中,需要通用的查询方案。我们采取最简单的方法,允许用
户任意选择多表条件和输出字段。所有的表通过外键的关联组成一个网
络。但用户所涉及的表之间可能没有直接的外键联系。我们面临的问题
是怎样确定选择哪些表做笛卡儿积。
我们考虑的一个方案是在表的网络中取支撑树,然后将无关的叶子
上的表剪枝。但这不是最优的方法,希望各位高手指点。
我的E-MAIL:rangxiao@263.net
145. 回答请mailto: yaozheng@kali.com.cn?subject=145
最近我在写一个 VB 程序,涉及到 Windows WMF 图形的缩放,开始直
接使用图片框控件处理,发现缩放倍率受到限制,而且最大倍率不确
定,经常放大后图形就不见了,所以想使用 Windows 的 GDI函数来绘
制 WMF 图形,但找了很久也未能找到有关 Windows GDI 函数使用方
面的资料,只好求助于各位告诉我如何使用 Windows GDI 函数(不知
是否有专门的 API 函数,如果有请告诉我详细的使用方法),在此本
人表示十二万分的感谢。Green green.jy@public1.wx.js.cn
146. 回答请mailto: yaozheng@kali.com.cn?subject=146
请您帮助解决一个问题: 我在ASP中使用CDONTS.DLL组件发送电
子邮件,但在BODY部分只能够使用文本内容发送,请问怎样才能使用
HTML格式来发送呢?
例如:objmail.body="<font color=red>hello</font>"
在收到的邮件中就显示”<font color=red>hello</font>“ 而不是
红色的“hello"字样 wangguangda@263.net
147. 回答请mailto: yaozheng@kali.com.cn?subject=147
VB50中,如何实现在同一数据库所有数据表中查找某一记录?
Chiman Yid kdop@pub.dgnet.gd.cn
148. 回答请mailto: yaozheng@kali.com.cn?subject=148
大家知道VC6.0新增了一个自动提示的功能,可我发现,比如敲入
“this->”后应该列出本类和继承的父类里的所有成员,但现在只
列出本类的成员,这是怎么回事?(我已经改动过Tools中的选项,
没用)my email: my.love@188.net
提问信箱: yaozheng@kali.com.cn?subject=question
如果您有什么疑难问题,请发到上面的信箱里,我会及时把您的问题放在
杂志上的,希望编程高手们能不吝赐教,也希望这个栏目能成为大家交流
的场所。
****************************************************************
****************************************************************
◆编者的话◆
本刊已加入【CHINA-EZL】中国电子杂志联盟
联盟主页地址 http://china-ezl.yeah.net
◆欢迎光临我的个人主页
●《编程技术》 http://person.zj.cninfo.net/~yao
本刊的同名主页,主要以收集各类编程工具控件和程序源代码为主。
●《C++ Builder世界》 http://cppbuilder.myrice.com
本人最新制作的个人主页,是一个探讨C++ Builder编程的专题
网站,为广大的C++ Builder爱好者搜集关于C++ Builder的一切。
◆《编程技术》订、退方法:
请到本刊主页进行订退工作 http://person.zj.cninfo.net/~yao
如果您觉得这份刊物还不错的话,欢迎把它介绍给您的朋友.
不知道您看了这期刊物有什么想法或者是意见,欢迎向我提出来.
本人感激不尽,我的联系方法如下:
E-mail:yaozheng@kali.com.cn
ICQ#: 43260473
**************************THE END**************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -