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毫秒