电竞比分网-中国电竞赛事及体育赛事平台

分享

VFP下漢字輸入法

 悟靜 2009-06-21
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)容,只需在中文輸入法選擇框中選擇" 英語(美國)" 即可。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多