|
//******************************************************************//0 [& E Q& n. K9 f8 u$ D
/// o" g4 J1 Z# p7 k! J: S
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家
1 u( t1 I& U3 k, I" ]// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
/ `$ J7 w; Y U6 x; T9 L6 C) F- T// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
5 W7 p3 f* G9 p2 P: C// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT% g+ T& D2 o6 u* X' }" V
// 为显示信息用,可以用其他方法替换如 TxtOut() 等
1 z6 L2 s0 n) x" z8 X//
# I) @! l7 P9 ^+ R% j) H6 [//******************************************************************//
) r r5 `! w- i t2 m- I# p! s' d: v$ p
//////////////////////////////////////////////////////////////////////7 ^! ^9 Z# E# [! q. m' @
//3 _9 m. r$ j. d
// IM.h: CIM class (使用系统)输入法类$ Z3 Q! E( O5 W% @) U+ Q
// 2001/4/30 Write by Jerry Wang
& v4 @; w! J$ n7 o. H3 h3 g* y// 感谢大大鱼的帮助* k6 K$ w- [4 E4 W- j+ A& @9 I6 K
// Need Lib: imm32.lib5 N: o" R( b' D
//
. B4 F, I: Z2 d/ e//////////////////////////////////////////////////////////////////////; i J- t: A5 a1 F. x/ I5 ^+ W& a
7 t" ?6 O# J- s# E' {#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)7 k/ h. B0 a4 C4 J( m$ R
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_
, o8 ^' g4 A. R% d) E9 ^& _
4 P* n* H: S' W- R3 a) @#if _MSC_VER > 10006 g" H9 e. M5 B+ k& ?4 x# l! U* _; ~
#pragma once
8 c, s* a/ Y' y7 F#endif // _MSC_VER > 1000' a% v% X0 b, ^
& p \; U# G, S
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数
1 a" X/ e$ ^: B. P# y
# f8 _* K9 m- N7 L! S# z* o#include "FindMe.h"8 f, Z ~ G1 E( o
9 U' A! z2 J8 `
class CIM / l" k$ Y7 X# B
{3 k) l, G8 k! G* n
private:
# p3 W% S0 \1 K2 n9 |% b- {$ m CTTFFont ttffont; //显示信息
$ B. d" d' w' ]. k$ v. M LPCANDIDATELIST m_lpCandList; //输入法候选文字列表2 n- C& R! P; \. O
LPSTR m_lpszImeInput; //指向IME输入的文字字符串指针
0 |) ]8 }4 C# ]2 s& b LPSTR m_lpszCurInputLanguageDesc; //指向当前输入语言描述的指针, M* A3 ]: ~1 ~0 G! m+ H" r. [
char m_cCandidateList[255]; //候选文字列表缓冲区0 G5 V7 M0 M( ~6 @0 g
char m_cInput[64]; //输入的字母
0 T+ [7 C+ L+ y4 P* y4 A7 F$ {) X/ S# O+ K
BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串
r$ t" _( K$ s5 a/ ~
% `0 m6 }1 i' D, h. `6 [6 Upublic:' w$ h1 n" e( \1 d
4 W; x: G8 c* f" r5 Y: Y% x
CIM();
; _8 a4 i3 V6 m( g/ R: q virtual ~CIM();9 W$ K/ S9 l0 ]! F; `
4 T+ _: Q5 d/ T& @" I0 e
LPSTR GetResultString( void ); //取得输入的字符串5 k/ F% _ f) i- Z+ ?
! M; x! k- P$ n }
void UpdateShow( ); //显示输入法信息
7 R# t$ J5 z# G" o P0 V6 {8 N" g4 K" |4 {' O. K+ }8 e
LPSTR GetCurInputLanguageDesc( ); //取得应用程序当前使用语言的描述
@1 O; Z0 W; O/ w2 J2 h! ] void ClearCandidateList( void ); //清除输入法文字候选列表
+ B+ ]3 \9 J3 V: S" z% x0 p BOOL GetCandidateList( HWND hWnd ); //取得输入法文字候选列表- T' {6 r( C* f3 m& i; I) P5 K
BOOL ImeIsOpen( void ); //输入法是否打开- F4 ?( P3 f' L: O; J3 f/ s
void OnChar( TCHAR ch ); //处理WM_IME_CHAR消息9 Y1 Y. N6 r4 m. E/ @) \: x
void OnImeNotify( HWND hWnd,WPARAM wParam ); //处理WM_IME_NOTIFY消息6 k" i# _# }6 i% n$ E! g
void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
5 H/ Y8 q, c' j2 X! q3 c0 {};6 T7 c! N9 s- [0 i6 s
4 K7 w! h% v; A6 b6 f" a
#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
# _1 ]( K9 p7 v9 w5 k1 y$ ?- {% C/ m0 ]5 o3 D4 I0 P, s' X
7 U" h% _, y9 `/ L1 ?* U
$ P9 O, @0 g" Z" b0 T z8 o//*********************************************************************************************//
6 D/ n- ^4 Z3 T1 b) m
' V2 I4 s2 n1 G$ l9 ?" [. e//////////////////////////////////////////////////////////////////////
' {; Y d: R0 l" _4 ^* W! C//
- h. H% Q2 G: M; i# g; B0 g// IM.cpp: CIM class (使用系统)输入法类8 ?: D: ~5 ~$ U1 `* ^: r( c" O
// 2001/4/30 Write by Jerry Wang
- K% d, q! d# k* s// 感谢大大鱼的帮助
3 k3 m7 l* \' U. B3 \# ]// Need Lib: imm32.lib3 l- G' ` a- j
//9 |" p$ }7 Q0 u: y9 ]. E
//////////////////////////////////////////////////////////////////////
1 t' a% `: \# B1 y2 f: h R2 e
( I2 ?, A/ ` r) C#include "imm.h"
$ X2 ]: R$ Z# l% t t! T" X3 [" H$ |4 K
//////////////////////////////////////////////////////////////////////, B% B- m- y, M8 r$ D' p m
// Construction/Destruction" N0 K2 j3 y0 a, w/ ^" ^
//////////////////////////////////////////////////////////////////////& a+ t. Q5 h; V1 n3 a5 E% w
' z9 j6 K$ P! J; a( I3 r
CIM::CIM()7 f# d; M' o6 Y- E
{
' n' j" D& s% W. T m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];$ K! N$ X) K/ Q
ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
* ?7 ]: b( H# K$ l% l" V& _7 J *m_lpszImeInput = '\0';
: k* ^! g% ?8 P# P' I2 l *m_cInput = '\0';! E ]# B1 e* ?& ?4 p- |( o
$ s6 R3 E* t0 x
ttffont.Create( "黑体",15,RGB(255,255,255) );
: M" L! @: J( I* B GetCurInputLanguageDesc();
0 [; c! D; ]: s* A; m+ t}
5 l. [3 Q; z9 F& B! A9 a
+ W' Q P* U7 d/ w. {1 w7 X: bCIM::~CIM()
# Y6 u, y7 D: P8 P, _9 ?/ D4 p{+ I' W2 R- s2 F' \% o5 \: @
ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
) K% N9 q( J8 \4 N: f
) W) L# Y) o0 H6 L( _ H/ J CHKB( delete m_lpszImeInput );
) p& Y* c) {" _$ I/ E if( m_lpszCurInputLanguageDesc != NULL )3 C6 J+ m3 Q3 Q8 ?5 `: V" h( g
CHKB( delete m_lpszCurInputLanguageDesc );
: t5 ?9 k- k6 a2 ~}
; p- N8 k7 p" ~' s! Y% W1 x5 f% `1 g: M# B: \4 s
void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
6 Q/ D* S4 l9 i4 v5 T7 J{
' P3 Z) c" Q) N$ |4 { if (lParam & GCS_RESULTSTR)
% B( \) \* v F. h t {% }; e' l% b8 F( l+ j0 R3 }
HIMC hIMC; //输入设备上下文* P' }1 Y8 Q" u! G# s' V) w
DWORD dwLen;1 K( z F1 J" @( `+ R% R; P0 Q
LPSTR lpResultStr;
% s4 |+ N; u. h1 l+ \, ?, K6 J7 s6 I
hIMC = ImmGetContext(hWnd); //取得输入上下文
4 P5 |' l2 s! i$ q2 K0 ?" D
% h1 Y# t$ h t if (!hIMC)
4 R: z; p* l* ~7 r return;3 H2 T' R. I k
* f/ e' o/ p" @8 o. O2 ?+ ]
dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);$ I8 C8 k3 y& F6 D
dwLen+=1;
2 G& {. p$ ~- {1 o+ `
" C; P$ q- [$ R3 f if(dwLen)+ ]) E9 |& u7 L' U9 j
{
) p6 w: R2 T U0 D lpResultStr = new char[ dwLen ];
1 f0 l9 l) z0 ] ]' B
! O1 L# F3 } _; @ t7 s8 v! a //// 缓冲区已经满了
; ~7 e9 |# z, y if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )0 ^( v3 ~4 N$ x" X( Y- w2 M
{! H. W7 g, ^# F8 i# e
MessageBeep( 0 );% X. q% c6 r1 j5 U! j9 L
return;
1 `& d. K; m* ~, l9 P& e }
; k7 ^% F) P! y. Z: `2 O; Y. _/ i ZeroMemory( lpResultStr ,dwLen ); & ]( H2 \& x1 S
if (lpResultStr)7 X5 M) [7 [1 D# ~ _2 `
{
+ Q8 E7 w3 k- Y- P( ]) c' {2 A ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);
- g1 d8 D) I7 B, b; D strcat( m_lpszImeInput,lpResultStr );
: l& f2 G3 Y3 x$ } }5 i) {- m4 w7 ]4 X0 l6 U
delete lpResultStr;# ~1 Z; {+ a/ `$ p! h
}7 _. W) h5 |+ _5 B7 q
; _1 P7 X! `5 H ImmReleaseContext(hWnd,hIMC); //释放输入上下文* H* ^7 e ~9 |9 X
}. | T4 n+ X z
6 w2 ?( Q' v V
}4 e$ d! n3 I4 c) C: }/ V: O
# b# k4 i% m- b3 _void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
' x" O' C6 P3 v' X{! n/ n$ H g1 O8 X" C0 ?! ^0 G
DWORD dwCommand = (DWORD) wParam;' r' |+ b# x L/ b8 B
switch( dwCommand )
) L& A! v4 z, e& ~- ^6 m( F: a {) P' X: ^6 p: C. c3 t
case IMN_CHANGECANDIDATE:
- t( i# m7 Y9 Q$ z GetCandidateList( hWnd );
& O1 @9 T: K6 U0 ^( ` break;" D0 u* N9 R/ U
% q9 b7 O0 z6 J& l0 x5 o6 }% _' Q case IMN_CLOSECANDIDATE:& M# e- W2 n% n* R% y4 m* }
ClearCandidateList();
1 ~+ ~; y1 ^+ ]% y7 i# ~( F& ^ break;1 ^% Q1 p8 Y9 T9 m& y& G9 V4 G% p# e. o) b
, `1 n! v: e% }- C* c% x1 N
case IMN_OPENCANDIDATE:7 E8 P( S9 @: [9 s4 K, I
GetCandidateList( hWnd );
, k; c/ E- P7 G% t8 H1 E9 F2 E break;
& w7 L8 o6 G* i9 v4 m1 H }
3 i3 H! o6 i) y}& ^& J# I Z- q0 ]
/ V. V( k/ [' M3 @
void CIM::OnChar( TCHAR ch )' h Y& x' k/ a- }# Y
{
, X: ]5 ?5 I% F7 g int len = strlen( m_lpszImeInput );
- S- G- o/ K g
+ s6 w p5 f9 {& _5 z( Z: c if( ImeIsOpen() ) //输入法打开状态
! }3 t/ F, m! X0 @ {: q" ]: l) v, s
8 T- q; p" |2 x& c& i
}
. c% S; W4 B$ x) K else //输入法关闭状态
" F# P' D2 z9 n {
3 m9 N: z( R9 M2 t if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母5 }5 r) K; r7 ]9 _
{
- }+ E9 `: O: M *( m_lpszImeInput + len ) = ch;* b- p; g" ]* n
*( m_lpszImeInput + len + 1) = '\0';
, J6 r3 P3 H& a% N9 D/ W }
( D) Y' X5 w; t5 u# n! g }! R+ U, o7 a( C9 x" G8 I0 J7 i; K
( O. Q9 z* j: `1 |1 }, X
if( ch == 8 ) //BackSpace字符
" L: h m5 @% F0 e7 Y9 v' w {! v" V$ r6 `2 o2 q% b
if( len == 0 ) //字符串长度为零
) @* o" J Q1 x% ~3 D return;
3 G3 d" e8 g' \& |0 I6 y" s
2 A) {8 {2 k) @1 X: G" k if( len == 1 ) //只有一个字符; {& `, K' S" m, i4 | ?/ H
{
6 M- h; G, R% K# I0 ]' B8 g) l *m_lpszImeInput = '\0';
( b$ D/ a; x5 V& U$ h6 n2 a( r2 s return;- W/ K, E$ S- x0 _( P
}) E, y) B2 X5 T% _
& J: C ]* S; W+ q- X* [
BYTE cc1,cc2;
9 R8 h, B: Z$ v. B' X @ cc1 = *(m_lpszImeInput + len -1); //分离字节
- y- J2 S+ g( L+ g; C cc2 = *(m_lpszImeInput + len -2);
+ f$ D4 ?4 [8 i: t* ]! p
! ?; [, G0 H; E* d" ?# d if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
" K0 ~; @5 d" v: x& O *( m_lpszImeInput + len -2 ) = '\0';
" [& c4 ?# G7 S9 B" b else //是英文字符(单字节)5 H3 D0 V) C; s# x3 U6 t/ v
*( m_lpszImeInput + len -1 ) = '\0';: b& ^- w% a$ U, |' ]
}1 F; t0 [, @+ j
}- e- D3 i6 _9 E6 i9 x8 s
/ |+ h% R) x5 @
BOOL CIM::GetCandidateList(HWND hWnd)
5 g: m1 |% s7 }# ^{
) A( h5 W M7 S# d6 m9 \$ e DWORD dwSize; ( d4 v X( u3 o& a( b" J
HIMC hIMC;
8 H$ k$ u" {6 x8 D( t9 G* y
, {6 `: Q: z( R3 R$ I, _3 c2 ` ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );. e! B; C `3 u) [ P9 z4 a! T: `* t
- b3 D/ t K8 J' g6 D7 s1 {
if( m_lpCandList )
' l, b; p3 ]! s' T R0 h- t, o# p& S5 t {. Y* t6 M7 w; d" e# e: \( I
delete m_lpCandList;$ V7 g4 F: @: ^- ^8 l
m_lpCandList = NULL;
, [2 q7 Z/ [8 Z. }; V4 o6 ^: R }
$ k3 w1 Y$ F" e* @: R
y; }% N5 r6 [* d if( GetKeyboardLayout(0)==0 )
4 g0 ]: t2 j/ y) `. ]+ e {
( m' {# t# j& d% C! H return FALSE;
& v% N6 X1 @# l2 N6 a/ _ } H Y6 {2 {7 r# Z' v' ~
+ O: [! s B% x hIMC = ImmGetContext(hWnd); //取得输入上下文
( x5 i0 b, K6 e if(hIMC == NULL)( Q6 A, ?6 ?# X9 Z, W. ~+ C* ]
{
4 ^- z0 x/ T9 d# K, {# \ return FALSE;0 X! J% s% k6 }' `/ z
}- x. t+ |/ r6 g4 Z
/ E ?4 n; _/ L' x, S( \1 i2 J+ q' @ ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );( F% ~0 Y$ f/ x e% |
if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
/ L, r9 y5 v( U% S( q. N0 Y" I {
' ` `" z8 D# x. J/ _ m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
# L' ]( `% W& r$ ~ d! a S2 Q& m( \ if(m_lpCandList)* f% G' Q7 L3 W& X" V
{6 m5 K, o% }3 A- Y$ ~( Q
ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);7 }' _& f+ t7 q$ ]( H8 h
CandidateToString(m_lpCandList);3 O. X0 F- f. g* R" T
}7 K( g7 `7 m$ w# \" D) U) s' C0 |
}
4 H3 E! F; g+ h" v/ g: _: c7 W3 I5 d
ImmReleaseContext(hWnd,hIMC);
8 f z0 L, U2 J* x5 T
* {# X6 S5 I# a6 L- V* q return TRUE;' f+ ]4 ^ M" v
}
" B, \% L. [+ B/ l; e# x7 U* h6 x" p. R' \; y# P" e
void CIM::ClearCandidateList()/ h% ~2 K* z( c
{( }0 k1 x" e1 |
if(m_lpCandList)
; ?# P y! Y3 l0 E' r {
$ C) s1 n. O' Y2 Q delete m_lpCandList;* c0 j8 L! b0 d: a' }6 ^# e; M
m_lpCandList = NULL;- q/ Z. B( ~" H0 ^; k7 H
}: f3 U2 |3 P1 e5 v9 S& O
ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );
7 J5 U% M! F Z2 i}
1 B+ \0 K# [% I8 U" _0 E+ y; h4 g9 Z8 W$ s
& V, @" s0 ^& m( }% D
LPSTR CIM::GetCurInputLanguageDesc()
0 h7 P8 T+ k, [( P. w{
4 |7 I* w3 W& k, L HKL hKL = GetKeyboardLayout(0); ( [: K7 D7 {8 C3 S& G
+ d+ P5 j, V: H9 W$ T% n# h) J m
if( m_lpszCurInputLanguageDesc != NULL )
4 P% H& Y9 o2 Z0 C/ B CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^
$ t' h0 i% f# b% F/ v4 e, i7 w) m* ?5 B: i
int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度
; i) w/ w9 H# \1 \6 G* _
, w- Y6 w* @7 u8 L) O CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );0 }- I! p6 {7 X4 e% H! K
! [" i6 p3 v: @ C r' I V f if( lengh )0 `, y! v+ C% u6 N3 F+ \, Z
{) ]% \" H, \9 P6 D7 p! v8 `& g) r
ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);. ^1 r6 X( R G5 S
}: c/ P) S& J& Z0 W9 ^: a1 s+ q" `
else
5 \# R: t0 j6 G) `' q$ s4 [ {
7 I8 k& f( ?+ h( ] `( O strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );; a; [& n* j. b" l8 o
}
/ M! \* ?3 c& t3 f" s! a$ p
8 T8 M; U* \! s, D+ D: Q" { return m_lpszCurInputLanguageDesc;
+ Z2 o& U0 E( ^! h}; N; k- N `+ z8 x% r/ O: b# w
+ t ?, f0 ~% U3 p4 Cvoid CIM::UpdateShow()
/ R: k" `) r5 Q5 P% ?* P{: }, O5 W% \7 d2 N7 x6 u
POINT pt;% R7 f+ k( H' {; h
pt.y = 450;) {+ z r# h/ t* T0 I
pt.x = 400; 3 p' {2 ?3 @7 x
ttffont.SetSurface( DD_GetBackScreen() );
( C4 [9 ?! K2 Z& l ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述
7 }0 Y- h) h8 }) D8 ~2 w* M( y
8 @' W9 y, x9 ^2 }6 A; C# l# m pt.y = 420;
' q* \! X* _ Z+ J pt.x = 20; ~" C# {1 e9 ]" o. ]& g {
ttffont.ShowText( m_cCandidateList,&pt );
& w4 E U& X4 g2 d% v) \* C0 w$ k9 Y8 k! z+ Q0 `4 f6 Z
pt.y = 450;
3 @- S) q# V: _5 ^/ ~; ~( n pt.x = 20;8 w& V& X: k3 ]+ d
if( *m_lpszImeInput == '\0' )
9 _! u/ h5 R( [2 ?! k( A return;
! `+ H) |7 s! K1 Y" K1 q* @/ B V. d" W6 m% C
ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字& s& ]- B: Z6 z" V) I0 R
}0 t" a4 y& m- f N' o8 \2 w
$ G( x; D( ^9 x1 m6 R$ `LPSTR CIM::GetResultString()
5 L" q8 u, m/ t0 H- X1 W: r{$ k, ?( D/ Q$ |: w7 G$ j
return m_lpszImeInput;: M4 f5 t& v+ Q f
}; V2 {2 D/ p7 }# x9 Q( ^; w
' H% S0 s8 e- y0 `/ R3 [BOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
! o/ o. c2 C: `+ v$ o8 S$ c{- T' J! v8 x/ v0 D, k$ d P
if( !m_lpCandList )' U0 s7 T$ c/ a7 w6 x
return FALSE;
. j5 [9 `; d9 X/ T
: }; [& V1 R' O+ o- ]; z if( m_lpCandList->dwCount>0 )! V5 y j! d+ J4 n
{5 J+ }2 E0 S: \ a" Z8 c
LPDWORD lpdwOffset;* ~/ t& w3 T! @. F, d$ A# d. P
: k: `. F: L5 w
lpdwOffset = &m_lpCandList->dwOffset[0];
) s) v$ ^& L, a7 T q* l- p. ?2 P$ @( v2 s. d
lpdwOffset += m_lpCandList->dwPageStart;. e5 a4 N) z) t
+ L# r$ i, H& D& e& {) T
ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );
: u7 p" |/ n% |( G: d% M9 X
& n# o9 s U0 X( W DWORD z=1;
Y2 p( O4 G R+ B! Y! G for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) ; Y# | @' ^, N! V# H% X& W
{
4 d. {3 L: K3 ^) a2 x9 }% T- ]5 V3 x! d LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;
/ l1 ?; M }* H$ [/ f K: o char buf[255];
3 u) h2 T7 l( G9 C! m' [! z sprintf( buf,"%d.%s",z,lpstr );
, a( U! g6 S3 b, A6 M5 g( } strcat( m_cCandidateList,buf );9 L! h+ o2 h# }/ ]+ A$ T! K& b0 b2 S
z++;
0 g# Y! g# o( v }
( U; |0 w4 {' n; g1 d0 _1 A e9 w, Z; f3 A4 L
return TRUE;
# k) g; }# L) M/ U0 S }
+ Y; d: k+ a$ r( ?! _7 \( Q `7 J3 J5 A: a+ {" O# \2 {2 N% @
return FALSE;) e! }1 `5 W4 L9 d4 }( e+ P
}$ k# z/ _; g' C _+ b. Y
b' ]+ B) ^. T, h# z0 l
BOOL CIM::ImeIsOpen()
4 p1 }; Q7 k }2 H# F{9 m4 _5 d' \) y
return ImmIsIME( GetKeyboardLayout(0) );5 u# i0 H" b* ^! [$ i3 B8 |( V
} |
|