📄 输入法编程指南.htm
字号:
needs to generate. <BR>*lpdwTransBuf++ = (DWORD) msg;
<BR>*lpdwTransBuf++ = (DWORD) wParam; <BR>*lpdwTransBuf++ =
(DWORD) lParam; <BR>// Count the number of the messages that
the IME needs to generate. <BR>dwMyNumMsg++; <BR>. <BR>. <BR>.
<BR>return dwMyNumMsg; <BR>}
<BR> 系统提供lpdwTransBuf参数指定的缓冲区,IMEToAsciiEx函数可以一次存储所有的消息到该缓冲区中,缓冲区的第一个双字给出存储在缓冲区中的消息个数。如果ImeToAsciiEx函数需要生成比这个给定的个数更多的消息,函数可以存储所有的消息到输入上下文的hMsgBuf域中,然后函数ImeToAsciiEx返回消息个数。当ImeToAsciiEx函数的返回值大于lpdwTransBuf中指定的值时,系统不从lpdwTransBuf中取出消息,系统查找作为ImeToAsciiEx函数参数传递的输入上下文中的hMsgBuf域。
<BR><BR>2、使用消息缓冲区
<BR> 下面的实例显示了怎样使用消息缓冲区:
<BR>MyGenerateMesage(HIMC hIMC, UINT msg, WPARAM wParam,
LPARAMlParam) <BR>{ <BR>LPINPUTCONTEXT lpIMC; <BR>HGLOBAL
hTemp; <BR>LPDWORD lpdwMsgBuf; <BR>DWORD dwMyNumMsg = 1;
<BR>// Lock the input context. <BR>lpIMC = ImmLockIMC(hIMC);
<BR>if (!lpIMC) <BR>// Error! <BR>// re-allocate the memory
bloack for the message buffer. <BR>hTemp =
ImmReSizeIMCC(lpIMC->hMsgBuf, <BR>(lpIMC->dwNumMsgBuf +
dwMyNumMsg) * sizeof(DWORD) * 3); <BR>if (!hTemp) <BR>//
Error! <BR>lpIMC->hMsgBuf = hTemp; <BR>// Lock the memory
for the message buffer. <BR>lpdwMsgBuf =
ImmLockIMCC(lpIMC->hMsgBuf); <BR>if (!lpdwMsgBuf) <BR>//
Error! <BR>lpdwNumMsgBuf += 3 * lpIMC->dwNumMsgBuf. <BR>//
Set the number of the messages. <BR>lpIMC->dwNumMsgBuf +=
dwMyNumMsg; <BR>// Set the messages that the IME needs to
generate. <BR>*lpdwMsgBuf++ = (DWORD) msg; <BR>*lpdwMsgBuf++ =
(DWORD) wParam; <BR>*lpdwMsgBuf++ = (DWORD) lParam; <BR>//
Unlock the memory for the message buffer and the input
context. <BR>ImmUnlockIMCC(lpIMC->hMsgBuf);
<BR>ImmLockIMC(hIMC); <BR>// Call ImmGenerateMessage function.
<BR>ImmGenerateMessage(hIMC); <BR>}
<BR><BR>3、WM_IME_COMPOSITION消息
<BR> 当IME生成WM_IME_COMPOSITION消息时,IME指定lParam参数为GCS位。GCS位的意义是COMPOSITIONSTRING结构中的有效成员,即使IME没有更新,成员目前仍然有效,IME也会设置GCS位。
<BR> 为IME定义服务
<BR> 当IME生成WM_IME_COMPOSITION消息时,IME可能会立刻改变字符串、属性以及子句信息。IME使用下列定义:
<BR>GCS_COMP <BR>GCS_COMPREAD <BR>GCS_RESULT
<BR>GCS_RESULTREAD<BR><BR>五、关于ImeSetCompositionString函数
<BR><BR>1、ImeSetCompositionString函数能力
<BR> 如果IME没有ImeSetCompositionString函数能力,IME将不能在IMEINFO结构中指定任何SCS能力。如果IME可以处理ImeSetCompositionString函数,IME设置SCS_COMPSTR位。如果IME可以通过写作字符串生成解释(本文中的“解释”是单词“reading”的直译,真正意义可能是“原始输入的”,例如输入的汉语拼音字母字符串,下同)字符串,IME可以设置SCS_CAP_MAKEREAD位。
<BR> 如果IME有SCS_CAP_COMPSTR能力,ImeSetCompositionString函数将被调用,IME从应用程序获取新的写作字符串并生成WM_IME_COMPOSITION消息。
<BR> 如果IME有SCS_CAP_MAKEREAD能力,IME可以通过写作字符串建立解释字符串。
<BR><BR>2、关于SCS_SETSTR
<BR> 如果ImeSetCompositionString函数的dwIndex参数值为SCS_SETSTR,IME可以清除hIMC中的COMPOSITIONSTR结构中所有的域。
<BR>如果IME需要,IME可以更新候选信息并生成候选消息IMN_OPENCANDIDATE、IMN_CHANGECANDIDATE或者IMN_CLOSECANDIDATE。
<BR> 如果ImeSetCompositionString函数的lpRead参数有效,IME应该通过lpRead参数中的解释字符串建立写作字符串,另外IME为新的写作字符串和lpRead参数中的解释字符串建立属性和子句信息,IME生成lParam参数为(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。有时IME需要自动确定建立上述信息,这种情况下,IME可以生成lParam参数以(GCS_RESULT|GCS_RESULTREAD)代替GCS_COMPxxx的消息。
<BR> 如果ImeSetCompositionString函数的lpComp参数有效,IME应该通过lpComp参数中的写作字符串建立写作属性和子句信息,IME生成lParam参数为GCS_COMP的WM_IME_COMPOSITON消息。如果IME有SCS_CAP_MAKEREAD能力,IME应该同时建立解释字符串,IME生成lParam参数为(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。有时IME需要自动确定建立上述信息,这种情况下,IME可以生成lParam参数以(GCS_RESULT|GCS_RESULTREAD)代替GCS_COMPxxx的消息。
<BR> 如果lpRead参数和lpComp参数同时有效,IME应该建立写作字符串和解释字符串,这时IME不需要完全按照lpRead参数和lpComp参数。如果IME不能建立应用程序指定的lpRead参数和lpComp参数之间的关系,IME应该修正写作字符串,IME为新的写作字符串和lpRead参数指定的解释字符串建立属性和子句信息,IME生成lParam参数为(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。有时IME需要自动完成建立上述信息,这种情况下,IME可以生成lParam参数以(GCS_RESULT|GCS_RESULTREAD)代替GCS_COMPxxx的消息。
<BR><BR>3、关于SCS_CHANGEATTR
<BR> SCS_CHANGEATTR只影响属性信息,IME不应该更新写作字符串、写作字符串的子句信息、写作字符串的解释以及写作字符串的解释子句信息。
<BR>首先IME检查新的属性并判断新的属性是否可用,然后IME设置属性到hIMC中的COMPOSITIONSTRING结构中,最后IME生成WM_IME_COMPOSITION消息。
<BR> 如果需要,IME可以更新候选信息并生成候选消息IMN_OPENCANDIDATE、IMN_CHANGECANDIDATA、IMN_CLOSECANDIDATE。IME不能确定写作字符串。
<BR> 如果ImeSetCompositionString函数的lpRead参数有效,IME使用lpRead参数中的新属性。IME也应该为当前写作字符串建立写作字符串的新属性,这时子句信息不被修改。
<BR> 写作字符串、属性、子句信息、解释字符串、解释属性和解释子句信息必须有效。IME生成lParam参数为(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息,如果IME不能接受lpComp参数中的新属性,IME不需要生成任何消息并返回FALSE。
<BR> 如果ImeSetCompositionString函数的lpComp参数有效,IME使用lpComp参数中的新属性,这时子句信息不被修改。
<BR> 如果IME有SCS_CAP_MAKEREAD能力,并且解释字符串有效,IME应该为当前写作字符串的解释建立写作字符串的解释的新属性。
<BR> 如果lpRead参数和lpComp参数同时有效,并且如果IME能够接受新的信息,IME设置新的信息到hIMC中的COMPOSITION结构中并生成lParam参数为(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。
<BR><BR>4、关于SCS_CHANGECLAUSE
<BR> SCS_CHANGECLAUSE影响写作字符串和写作字符串的解释的字符串和属性。
<BR> 如果需要,IME可以更新候选信息并生成候选消息IMN_OPENCANDIDATE、IMN_CHANGECANDIDATA、IMN_CLOSECANDIDATE。IME不能确定写作字符串。
<BR> 如果ImeSetCompositionString函数的lpRead参数有效,IME使用lpRead参数中的解释子句信息。IME必须修正写作字符串的解释的属性,IME可以更新写作字符串、属性和写作字符串的子句信息,IME生成lParam参数为(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。
<BR> 如果ImeSetCompositionString函数的lpComp参数有效,IME使用新的子句信息。IME必须修正写作字符串和写作字符串的属性,IME可以更新解释属性和解释的子句信息,IME生成lParam参数为(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。
<BR> 如果lpRead参数和lpComp参数同时有效,并且如果IME能够接受新的信息,IME设置新的信息到hIMC中的COMPOSITION结构中并生成lParam参数为(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。
<BR><BR>六、软键盘 <BR><BR>1、关于软键盘
<BR> 一些IME有特殊的解释字符,例如一个IME可能使用注音符号作为解释字符(这里指台湾中文版Windows
95,即CWin95中的注音符号,PWin95中可能指汉语拼音字母或者音调符号——译者注),另一个IME使用了一些字根符号(原文单词是“radials”,但实际可能是“radicals”——译者注)作为解释字符,IME可以提供一个软键盘显示这些特殊解释字符使得用户不必逐键记忆解释字符。
<BR> IME需要根据不同的变换状态改变键表示的解释字符,使用软键盘可以通知用户键的改变。在选择候选字时,IME可以只显示那些选择键给用户。
<BR><BR>2、使用软键盘
<BR> IME可能需要为软键盘创建一个更好的用户界面,或者可能需要系统预定义的软键盘,如果IME需要使用系统预定义的软键盘,IME需要在调用ImeInquire函数时将IMEINFO结构的fdwUICaps成员指定为UI_CAP_SOFTKBD。
<BR> IME可以调用ImmCreateSoftKeyboard函数为软键盘创建窗口,还可以调用ImmShowSoftKeyboard函数显示或者隐藏软键盘。软键盘窗口是UI窗口的一个组件,所以软键盘窗口应该附属于UI窗口。
<BR> IME可能需要决定是否在无论何时焦点移走的情况下删除窗口,软键盘可能占有一些系统资源(可能需要释放——译者注)
<BR> 软键盘有不同的类型,一种类型可能是为特定的国家或者特定的目的设计的。为每一种类型的软键盘改变解释字符的方式可能不同,有两种改变解释字符的方式:使用IMC_SETSOFKBDSUBTYPE或者IMC_SETSOFKBDDATA。不同类型的软键盘有不同的窗口过程并存在不同的用户界面给用户。
<BR> <BR>七、IME接口 <BR> 在Windows
95中,IME与设备驱动程序一样是动态链接库(DLL),输入法管理器(IMM)应该处理所有安装的IME。因为IME在运行时是可以改变的,不需要重新启动系统,IMM有一个结构用于维护每一个IME的所有入口点。IME函数列表是所有远东版本Windows
95公共IME功能函数的描述,这些函数不应该在应用程序中直接调用。
<BR> <BR> UI窗口中的IMM函数
<BR> 下面是可以在UI窗口中调用的IMM函数:
<BR>ImmGetCompositionWindow <BR>ImmSetCompositionWindow
<BR>ImmGetCandidateWindow <BR>ImmSetCandidateWindow
<BR>ImmGetCompositionString <BR>ImmSetCompositionString
<BR>ImmGetCompositionFont <BR>ImmSetCompositionFont
<BR>ImmGetNumCandidateList <BR>ImmGetCandidateList
<BR>ImmGetGuideLine <BR>ImmGetConversionStatus
<BR>ImmGetConversionList <BR>ImmGetOpenStatus
<BR>ImmSetConversionStatus <BR>ImmSetOpenStatus
<BR>ImmNotifyIME <BR>ImmCreateSoftKeyboard
<BR>ImmDestroySoftKeyboard <BR>ImmShowSoftKeyboard
</P></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2>
<TABLE
style="BORDER-TOP: #6687ba 1px solid; BORDER-BOTTOM: #6687ba 1px solid"
height=50 cellSpacing=5 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>
<LI>上一篇文章: <A
title="文章标题:一些国外的BCB编程资源网站 作 者:佚名 更新时间:2/19/2004 17:48:53 点击次数:159"
href="http://www.9983.com/sunboy/newhome/Article_Show.asp?ArticleID=29">一些国外的BCB编程资源网站</A>
<BR>
<LI>下一篇文章: 没有了 </LI></TD></TR></TBODY></TABLE></TD></TR>
<TR class=tdbg_leftall align=right>
<TD colSpan=2 height=20>【<A
href="http://www.9983.com/sunboy/newhome/Article_Comment.asp?ArticleID=48"
target=_blank>发表评论</A>】【<A
href="http://www.9983.com/sunboy/newhome/SendMail.asp?ArticleID=48"
target=_blank>告诉好友</A>】【<A
href="http://www.9983.com/sunboy/newhome/Article_Print.asp?ArticleID=48">打印此文</A>】【<A
href="javascript:window.close();">关闭窗口</A>】</TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
<TBODY>
<TR>
<TD vAlign=top align=middle height=13>
<TABLE cellSpacing=0 cellPadding=0 width="99%" align=center
border=0>
<TBODY>
<TR>
<TD class=tdbg_left2
height=13></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD class=tdbg_leftall vAlign=top colSpan=3>
<TABLE class=border cellSpacing=0 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR class=title>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=title_maintxt><STRONG> <IMG height=16
src="输入法编程指南.files/TEAM.gif" width=16
align=absMiddle> 网友评论:</STRONG>(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)</TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<TABLE height="100%" cellSpacing=5 cellPadding=0 width="100%"
border=0>
<TBODY>
<TR>
<TD vAlign=top> 没有任何评论
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=778 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top align=middle height=13></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=778 align=center bgColor=#dddede
border=0>
<TBODY>
<TR>
<TD align=middle>
<TABLE style="FONT-FAMILY: verdana,arial" cellSpacing=0 cellPadding=0
width=750 align=center bgColor=#dddede border=0>
<TBODY>
<TR align=middle height=22>
<TD width=760 bgColor=#dddede>| <A
onclick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.9983.com/sunboy/newhome/');"
href="http://www.9983.com/sunboy/newhome/Article_Show.asp?ArticleID=48#">设为首页</A> | <A
href="javascript:window.external.addFavorite('http://www.9983.com/sunboy/newhome/','编程小站')">加入收藏</A> | <A
href="mailto:sdf110@sina.com.cn">联系站长</A> | <A
href="http://www.9983.com/sunboy/newhome/FriendSite.asp"
target=_blank>友情链接</A> | <A
href="http://www.9983.com/sunboy/newhome/Copyright.asp"
target=_blank>版权申明</A> | <A
href="http://www.9983.com/sunboy/newhome/Admin_login.asp"
target=_blank>管理登录</A> | </TD></TR>
<TR>
<TD width=760 background=输入法编程指南.files/dot_line002.gif
height=1></TD></TR>
<TR vAlign=bottom align=middle height=20>
<TD width=760>版权所有 Copyright© 2004 <A
href="http://www.9983.com/">编程小站</A> 站长:<A
href="mailto:sdf110@sina.com.cn">Sunboy</A> 页面执行时间:62.50毫秒<BR>本站所刊登的各种新闻﹑信息和各种专题专栏资料有部分为网上收集<BR>如果你认为侵犯了你的版权,请通知我们,我们马上删除。
<BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -