如何截获中文输入(100分)

  • 主题发起人 主题发起人 ZZZ
  • 开始时间 开始时间
Z

ZZZ

Unregistered / Unconfirmed
GUEST, unregistred user!
我的一段程序中要求用中文输入法输入汉字,然后TextOut到 Device Context上,但是不知道如何获得中文输入的汉字?
 
你的意思是说英文输入的就不texout吗?
 
想要输入汉字必须有一个Windowed Control如TEdit, 因为只有Windowed Control
才能接受IME消息.

最简单的办法是用一个TEdit接受汉字后在TextOut到某一个设备上, 一般的Windowed
Control 都有一个IME属性
 
zzz,我不明白你的意思。你是想在一个非WinControl中或直接在TForm
中截获汉字输入汉的输入,然后TextOut到设备上吗?
如果是,我能做到。
但你到底要实现什么样的功能呢?能具体点吗?举个例?
 
又见到aiming,有老兄您在我就放心了!

我的意思也就是如你所说,想直接在非WinControl上如Canvas上直接截获汉字的输入。我的程序是GIS的一个地图系统(地图是直接MoveTo、LineTo到Canvas上的),想在上面直接加入注记(如在一个点上加入“上海市”),然后直接TextOut到 Canvas上。就这样。
 
我试试,老兄等等。
不过未必能成,各位大侠请继续帮zzz兄想想。
 
思考过这个问题了,读了一遍imm和controls的源码,结论是——
很不好意思,结论是不能在非Twincontrol上出现输入法。:((
因为从关于Twincontrol类的程序中可以看到,实现输入法的程序都
需要一个handle,而非Twincontrol是没有handle的。(TCanvas的
handle实际是一个hDC,申请后会马上被释放掉的,不信可以读源码)
如果使用imm的函数,应该可以实现,但太累,无异于写输入法!!
下面有一个变通的方法,我试过,可以做到呢。——不过,还有一
部分程序要你去写。
====================
type
TForm1 = class(TForm)
...
procedure MyKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
private
...
end;

...

implementation
type
TMyWin = class(TWinControl)
public
property Text;
property onKeyDown;
end;

var aWin : TmyWin;
procedure TForm1.MyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = vk_return then
aWin.Free;
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
aWin := GetAComp(self,TmyWin,'myHideEdit',Label1.left,Label1.top,0,0) as TmyWin;
aWin.onKeyDown := MyKeyDown;
end;
end.
============
这里已经有输入法了,而且看起来象是image控制的一样,剩下的
就是在Text中填入字符串值了。这些你可以参考TCustomEdit来写。
路漫漫其修远兮,汝将上下而求索。^-^
 
实际上可以在待写文字的canvas上方临时加一个TEdit, 使其背景色与canvas相同,
无边框,专门用来接受文字输入,输入结束后在释放他。不过的算好位置、文字高度。
 
同意huizhang的办法,这样最省事。
 
如果背景是地图,那么背景颜色不可能一样!做一个控件怎么样?透明的!这样的控件到处都有!修改源代码,不回显输入,当接受输入后(这不用我说了吧!还是说一下)判别其是否为中文,如果是则输出!一切OK了,当然这个控件要基于WinControl。
 
不好意思,以上答案实在有问题!太麻烦!
昨天晚上想了个办法:
1 在地图上放TEDIT
2 把它的高和宽设置为0
3 在需要输入是用 EDIT1.SETFOCUS;
4 当输入完毕,则判别是否为中文(不是字母和数字);
5 如果是中文则显示!
 
CJ老兄真行, 把TEdit搞成大小为0怎么进行编辑,如何知道你输入了些什么文字呢?

搞一个透明的TEdit并不难,只需继承一个TEdit并在CreateWindow时在dwStyle参数
上作一点手脚即可, 但是又有什么必要呢, 文字输入后该Edit窗口就被删除了,
TextOut时透明就行啦
 
抱歉huizhang
CJ就是CJ,因为不要把所有的内容都显示(只输出中文),所以才把大小改为0,然后需要
的话在CANVAS上输出(可能是TEXTOUT之类的),不就可以了?!当然需要在TEDIT的
ONCHANGE中写代码!
 
从VXD接口下手
 
VXD?高!
具体些!
 
???? 大家都说到哪里去了?本来是隔壁的事好象去趟了火星 )

记住 TForm 中有个属性是 'KeyPreview', 很重要啊!
如果设成 True, 在此 Form 激活时任何 Key 消息都会被 Form
的 Key 事件截获到...
 
这个问题已经过了一个多月了,问题也应该很清楚了!
ZZZ,做决定把!可以...
 
我前些日子也在作输入法,本想用VXD来作
while not success do
begin
day:=day+1;
look for the interface of VXD;
end;
后来得知像ChineseStar,Xdict公司都和老比有
协议的,$$$$$$$... :! :((
 
输入法当然有协议,看看有关于 IME 的资料吧
不过好象不做系统软件用不到这个
可以用一些系统钩子,一些都 OK 了。
求求你们多看些帮助好吗?
不然就相信我吧!
( VXD 可不是顺便玩的,小心死悄悄哟 )) )
 
我在摸索VXD的时候真的快死悄悄了,
那就请老兄给大家讲讲系统钩子的用法吧.
我保证则个问题成为焦点问题!
 
后退
顶部