将选好的字串发送到宿主程序是输入法程序的目的,这个过程就是程序的核心,其它的工作都是围绕这个核心而展开的。初学者首先要认清这个事实,不要把输入法编程想象的很复杂,学任何东西都一样,一定要把握它住的本质,然后逐层展开,最后搞清楚它的方方面面,这样才能学到它的精髓,这样才能事半功倍。
我们先来看看示范程序是如何把字串发送到EDIT控件的:
case MY_WM_IME_COMPOSITION:
//获得最终候选串的指针
lpszResult = GetCompResultStr();
if (lpszResult)
{
while(*(lpszResult) != _T('\0'))
{
//用特快专递将字串发送到EDIT控件
SendMessage(hWndEdit,WM_CHAR,(WPARAM)(*lpszResult),0);
lpszResult++;
}
}
//字串发送完毕,隐藏候选窗体
MoveCandWindow();
//对组合串结构和候选串结构初始化
InitPYBMStr();
InitCandStrPage();
break;
再来看看标准的输入法程序是如何做的:
BOOL MakeResultString(BOOL fFlag)
{
HIMC hIMC = NULL;
LPINPUTCONTEXT lpIMC = NULL;
LPCOMPOSITIONSTRING lpIMECompStr = NULL;
LPTSTR lpConvStr = NULL;
GENEMSG GnMsg = {0};
hIMC = (HIMC)GetWindowLong(GetUIWnd(), IMMGWL_IMC);
if (!hIMC)
{
MessageBeep((UINT)-1);
return FALSE;
}
if (!(lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC)))
{
MessageBeep((UINT)-1);
return FALSE;
}
lpIMC = ImmLockIMC(hIMC);
lpIMECompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
if (fFlag)
{
lpConvStr = GetConvStr();
if (!lpConvStr) return FALSE;
_tcscpy((LPTSTR)((LPBYTE)(lpIMECompStr) + (lpIMECompStr)->dwResultStrOffset),lpConvStr);
lpIMECompStr->dwResultStrLen = _tcslen(lpConvStr);
}
else
{
*((LPTSTR)((LPBYTE)(lpIMECompStr) + (lpIMECompStr)->dwResultStrOffset)) = _T('\0');
lpIMECompStr->dwResultStrLen = 0;
}
InitCompADT();
ImmUnlockIMCC(lpIMC->hCompStr);
GenerateMessage(WM_IME_COMPOSITION,0,GCS_RESULTSTR);
GenerateMessage(WM_IME_ENDCOMPOSITION,0,0);
ImmUnlockIMC(hIMC);
return TRUE;
}
一直到if (fFlag)这行代码为止,之前的那些都是为了取得IMC结构中存放结果串的内存块,没有别 的目的。你选好的字串必须先放到这里,然后才能帮你发送出去。你可能要问为什么不能直接发送呢? 先来看看我们现在是怎么杀猪。农民兄弟把猪养大了,一刀把它杀了拿去 卖钱行吗?不行,政府有规定生猪要定点屠宰,理由是:一、可以防止病猪、老母猪、灌水猪上市, 二、各种收费有绝对的保障,你明白其中的道理了吧?
[ 本帖最后由 路路通 于 2008-6-22 12:42 编辑 ] |