|
|
//******************************************************************//8 V6 _ X. M0 ]! M" x6 O
// K' E0 e3 @2 S$ x$ O d( o7 [. g
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家$ _9 @$ p! `: a5 w# q
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-). s( S7 u5 e. T. ]2 f, u( ^
// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
* e' C$ l. f7 e) f. v# U// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT
/ ?. z! ]+ d" }0 Q4 D// 为显示信息用,可以用其他方法替换如 TxtOut() 等
# T) l! c7 K/ G" ^. o//. n2 p0 s- |. j
//******************************************************************//
( o9 o8 v! D$ }: Z7 X, N, I `1 i* u! y9 i. ^
//////////////////////////////////////////////////////////////////////
. N* l2 f; S8 I* i6 x! u; B6 V# ~//
3 r! W r. C; m& s// IM.h: CIM class (使用系统)输入法类
9 Y" W6 B Y5 z7 Q// 2001/4/30 Write by Jerry Wang
" i& |7 v2 e6 i6 w1 T! k// 感谢大大鱼的帮助
. C7 l/ O7 j7 Z* ]8 W& R// Need Lib: imm32.lib1 w9 c( N" R0 M
//
( a3 p* d& j) V4 S3 U; |//////////////////////////////////////////////////////////////////////& a% n3 p3 a, T, s
- k# t- K: |4 X
#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)+ @. m+ Z) ]4 a$ n
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_' Q: I/ K! F% P7 d% k: ?
6 e3 U1 p8 G) w- L& k! n- |. w/ \#if _MSC_VER > 1000* D" L$ b" K9 C# J0 \# i- q. V c
#pragma once1 Q a% c$ i: o+ ? d
#endif // _MSC_VER > 1000
2 r3 i- n: ]- i' w/ N7 q5 Z, D) r- u3 z
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数9 {5 Q+ J* t( [
( ~( ?) d `' u5 c1 K#include "FindMe.h"
2 O. z# f) _3 [2 V5 o" V8 ~! [/ `# r) _
class CIM
$ i* B/ ]3 a( V+ w& U{
/ Z8 ^5 T# \2 ^private:9 z( J. G! b+ f0 ~& G' v
CTTFFont ttffont; //显示信息: `" u+ H$ T0 T. b0 w
LPCANDIDATELIST m_lpCandList; //输入法候选文字列表; T" `+ ]9 k* N4 K$ k7 k/ I; ~/ a( d
LPSTR m_lpszImeInput; //指向IME输入的文字字符串指针+ N. v& d) E8 x; A$ s) P4 @
LPSTR m_lpszCurInputLanguageDesc; //指向当前输入语言描述的指针" E( ^# T" q$ v6 b; Y
char m_cCandidateList[255]; //候选文字列表缓冲区: {: H) s2 ~; l6 t8 O& N
char m_cInput[64]; //输入的字母, V; T4 h3 I, j5 B6 _
" i0 Z3 W( W* `3 ?: j+ E
BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串# \7 A0 N. {; a4 Q
+ O ^, a4 @# }
public:
4 u( M8 `1 I: Q. l' h: {
% T- ~2 [+ b% y& T CIM();
" f& k, Y/ z8 Q; X: K3 J virtual ~CIM();: k( S- Q, W' T( Z% _+ O6 j
! Y; F/ ` L! g/ k: X7 t$ _ LPSTR GetResultString( void ); //取得输入的字符串
$ u' e1 ~# Q% s
% H) @2 |3 X1 E- \! C! T) X! t void UpdateShow( ); //显示输入法信息7 n4 }( h& p- U
) ]2 h. r" Y6 T: p c+ Y
LPSTR GetCurInputLanguageDesc( ); //取得应用程序当前使用语言的描述( G& C3 z3 e/ m) u; Q/ C" Q# i
void ClearCandidateList( void ); //清除输入法文字候选列表
4 d0 H$ P' j& x- y) _' z) ?3 R BOOL GetCandidateList( HWND hWnd ); //取得输入法文字候选列表 h) t# r* o7 m0 E. E" {
BOOL ImeIsOpen( void ); //输入法是否打开1 a! ~. J0 l% [8 l8 l3 u, W i
void OnChar( TCHAR ch ); //处理WM_IME_CHAR消息
1 q. L& D7 k; b% M6 D9 E/ ~ void OnImeNotify( HWND hWnd,WPARAM wParam ); //处理WM_IME_NOTIFY消息! B) H$ F# l- Z, x, i8 m& Q
void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
0 X4 m& `) F3 i4 r4 T}; O. {5 u+ o3 E. e9 d
" d. |/ Z! D3 N#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
. E: I0 A& u1 H. j* _5 `9 d
; N( N0 @$ z# N. ?; i
0 a- e+ D* ?( y& {# O. U: N
( F: k2 D! \) v( k& p% C+ r# v4 G//*********************************************************************************************//
* K2 [4 [2 F) `/ v: e2 n% C: W
$ d6 D- U4 o3 v) ~, V//////////////////////////////////////////////////////////////////////
' P2 m# m. s& ]( z4 H//- I9 `6 Z1 h/ d' ]/ E7 q- N
// IM.cpp: CIM class (使用系统)输入法类
1 Q: F# V# ~6 h: t# S# S; t// 2001/4/30 Write by Jerry Wang$ R' k5 ?& u, {* O" I
// 感谢大大鱼的帮助
" q+ J3 o- H( {9 b5 t. i7 k: x- u// Need Lib: imm32.lib& g+ e& e7 h! w7 T+ ^
/// y" L& P, I$ d7 C- F* x! [
//////////////////////////////////////////////////////////////////////3 m% h& ~+ ]7 a) o9 c0 J
* z- X$ {' ^$ z& d- z
#include "imm.h"
, E/ \8 W5 W5 `* |0 {2 {+ x J3 _* h4 d
//////////////////////////////////////////////////////////////////////: D Y7 f8 b( y$ \
// Construction/Destruction
" o* f5 }; J# {3 u//////////////////////////////////////////////////////////////////////- v+ h6 O1 m u
& r. W7 E3 ^. ]5 X" R+ W% U
CIM::CIM()
5 z- A6 u# K4 z; ]. n1 E{# Z, \8 \2 S) k2 G
m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];
1 @& y5 S2 Y) G" N8 \% b N ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );2 ]1 L* F9 v: u" p
*m_lpszImeInput = '\0';
' K1 B0 F& ?1 N: ?2 t2 n *m_cInput = '\0';+ j) ^% Z) |8 w l% f
w1 {9 j8 C2 Q- } ttffont.Create( "黑体",15,RGB(255,255,255) );
- R, X, E+ }$ a7 [ GetCurInputLanguageDesc();7 J5 z; L4 V2 Y/ F' _4 `# G4 u
}$ A& [0 \: q. y
9 N) n; E1 }5 [" h% J. P; G4 f8 E: O
CIM::~CIM()/ U9 J8 L8 S$ k8 W$ w5 t
{
* W/ ?5 V1 B; ` s2 }9 h6 e ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
( z- |) S3 |: M& o9 F+ r; r7 e4 V+ ]4 B1 |0 a1 U
CHKB( delete m_lpszImeInput ); / l' t: F5 t3 d: _; v. r
if( m_lpszCurInputLanguageDesc != NULL )& e' ~& `4 \5 k; w: U. a" X9 ^
CHKB( delete m_lpszCurInputLanguageDesc );
) w G4 `( H: u3 R- E! L: }}
9 |6 N+ d l6 v7 Q6 e# V `' y% L5 z# c( {2 Z
void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)+ \; W% V3 P7 Y7 ?# S8 O; l
{- B; G. `# Z" a% G: N
if (lParam & GCS_RESULTSTR)
5 Y: w7 l3 [8 y% y/ g- D {
; w5 h7 O7 T5 | HIMC hIMC; //输入设备上下文+ k: i1 {* n. y0 v( w
DWORD dwLen;
5 b4 d( A1 o E% N) A LPSTR lpResultStr;
1 n: a* i/ H- G% t1 z v. ]! l& g
U/ M$ E& Z* j8 b, u1 h- ] hIMC = ImmGetContext(hWnd); //取得输入上下文
5 u# |/ o/ F |, v6 v6 T* d8 L( a g( y7 z- c: \- V' W
if (!hIMC)
7 m+ c6 ~, ?, X- r return;
) w+ O7 U/ [+ d# i% M) E) P! P2 Y& b. U( x5 s0 O4 \
dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);" I3 S6 T k! @$ U! l! G
dwLen+=1;$ m* o, k3 t2 o0 q3 `
& y1 @4 Z) a8 l6 h9 m
if(dwLen)# w# i& H( t' M4 D
{4 t" a' Q' M/ B- t( D" y2 p
lpResultStr = new char[ dwLen ];8 U% x/ `1 m# k7 h8 X9 E% |
9 ~9 f1 q# h- D) @* o& M
//// 缓冲区已经满了2 l) [- M$ u- _
if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )
# l* x8 j6 R' c T( o, G2 @ {. E8 Q) ` U& x" G
MessageBeep( 0 );" P7 l8 q; c, I6 ]9 N
return;
' u) S9 n0 L( k; ] }
( p! S1 G; l6 @4 W8 V% ]$ m ZeroMemory( lpResultStr ,dwLen );
, x/ \! S6 i t' H if (lpResultStr). ?$ [! l+ A( F% ?' K
{0 a( N1 z, i. x0 Z( h8 D K
ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);
- R0 p; m" ~$ [, i" F strcat( m_lpszImeInput,lpResultStr );
, W# l. _9 {* P! Q }( R9 G- [/ o+ K1 X# ]- f
delete lpResultStr;
" L; {$ U5 X8 Z$ q7 Y6 V }
; k7 |* |1 y0 p
7 K5 S2 \: k F5 x& E/ o l) c ImmReleaseContext(hWnd,hIMC); //释放输入上下文
1 W6 B' A" g# y/ V, D/ C$ z) P0 I }0 o, e3 o& j A/ u! J
c7 m: U, h: a" \8 g6 ^1 ^
}
+ m' w# s7 d: K% G
% }( i: \$ n u' N! ^void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)' ^- k, V( @) r1 x2 J
{/ G# m! E4 E* x+ n W
DWORD dwCommand = (DWORD) wParam;
7 U7 i, Y7 A8 I- ]6 b i" s8 }& _ switch( dwCommand )
5 ?; b! T5 T0 Q# x! p {
2 l5 G, L b9 I: G1 G) d) H. V# j& i case IMN_CHANGECANDIDATE:
8 b& e- c4 y0 E* ?) E7 E! \ GetCandidateList( hWnd );2 p/ F2 H8 c$ D5 V" v* e. V! e
break;
$ Q: E/ T! X; t1 N l& B0 j4 u! J1 r
case IMN_CLOSECANDIDATE:1 G' F6 ~; |/ a3 w
ClearCandidateList();
0 d7 \5 k8 K" l2 J( D break;8 g$ Y# W3 C m& H9 i+ B
1 B0 ~" u" [6 Z! P
case IMN_OPENCANDIDATE:" U6 \# [* w6 `+ Y* G
GetCandidateList( hWnd );- {" X" z0 y4 a7 H/ `6 x- \
break;% D+ y7 {) S0 h
}! a8 K3 @) v+ Y5 h4 s; s
}* O: }5 N* l) t2 c9 ]/ J- T
6 U, Q) x5 S/ s( e9 l8 u: ~void CIM::OnChar( TCHAR ch )5 E9 d/ h6 Q3 g
{, K2 w+ v! M5 Q& i. _6 B
int len = strlen( m_lpszImeInput );
4 E8 s4 m/ o; Z- t! t3 [! ?
+ N& _5 S) z) M4 h if( ImeIsOpen() ) //输入法打开状态
4 N7 E8 g! a1 z. f6 w; p {
8 O* T: K4 e- y. b! e9 g- L- `; I
}
4 f Q# j: ^' W/ r# ~ else //输入法关闭状态
# h z$ C7 p: c$ t {
( C9 _! T) u& H4 s if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母
+ z) W2 ~3 A. v$ ?( l. K; V$ ]2 m {
/ ]: T: E! h* L* K9 q/ S2 }/ \) { *( m_lpszImeInput + len ) = ch;
& v, q% y. F3 o1 Y: P: N *( m_lpszImeInput + len + 1) = '\0';& d: K- L/ j4 s6 {
}( a+ X7 h9 F; ~* z( V8 y7 S" y
}
' x) l+ E$ T, C6 Y/ z, l
3 J, b0 O( O) D9 Z if( ch == 8 ) //BackSpace字符! z9 T& S4 ~2 ]/ e: p
{( l# l7 U' L; _' l8 K
if( len == 0 ) //字符串长度为零2 |5 ~, P' |5 }8 e0 y* k, P% o
return;7 x. I6 ]$ g" ^
0 K$ H, ]* @7 `, O N+ X2 w if( len == 1 ) //只有一个字符
' p& D3 j2 i; J0 F& }- P) u {
" Y+ c: X3 b6 t2 n1 `/ ] *m_lpszImeInput = '\0';
6 \. C, k k9 M% I5 w: b( } return;5 K2 s2 r+ G3 L. L, l, y9 r
}
3 O, G! {+ s# B& S" {
5 O) V4 A' S/ N( P& j; r BYTE cc1,cc2;
0 O! v7 A' R. l/ p cc1 = *(m_lpszImeInput + len -1); //分离字节
6 b7 ]# K. }: `; @" b* W. n1 @" M cc2 = *(m_lpszImeInput + len -2);! b3 X/ H$ G+ u0 ~- g
( A8 W" ?4 a( ]# s+ e: P0 S if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
" c: L) O) _' ?/ A& l. o *( m_lpszImeInput + len -2 ) = '\0';+ R: {6 ~, w S2 }& T" q3 c% D+ N" N
else //是英文字符(单字节): Y9 _: f$ e( J: Y/ ~6 n0 u$ N
*( m_lpszImeInput + len -1 ) = '\0';
7 f( `% T1 y, O! @ }
4 w% U; g' [/ z}
1 M* K. S' l! n# s& T/ R; ^; Y8 k( X% d. D$ }; x! Y' C, L
BOOL CIM::GetCandidateList(HWND hWnd)1 P" f3 e1 o4 Q! n
{
|) J4 M9 R" U DWORD dwSize;
5 H# y# N8 z* w! Y# {/ R( s0 l HIMC hIMC;
: N: R5 x1 |$ A
d8 O- X, [, n0 y k! e ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
. ]1 V7 S# c+ y; D$ c ]$ K4 H5 K; n9 o5 k1 k
if( m_lpCandList )1 \+ a1 U# a$ R) Y& O
{
! d0 z% L, B" b8 i& m1 j: L2 f delete m_lpCandList;
; r. Z2 L2 r5 x; R7 p9 [ m_lpCandList = NULL;
( t1 v: @! z( n4 x7 v1 Y5 ~* @& X }
6 G. e1 x& r. ~
' Y% S) ~" \* V8 g' l2 g, X9 @! o0 s if( GetKeyboardLayout(0)==0 )
2 [3 h/ h$ V. B8 a& g2 K. V/ l/ j {
' m. k9 j8 M0 B0 B: L return FALSE;' r T7 T& c! x5 N/ ?
}
' V# O) n: e3 Q; p2 E/ p3 D" Y/ `
7 a1 h4 F: ^- E" y hIMC = ImmGetContext(hWnd); //取得输入上下文 e# @( @' O) a9 T& Y+ e8 t
if(hIMC == NULL)
U, C9 ~) ? B" t {
( L2 ~8 `. o! X8 x1 v' X# L8 X" e" G return FALSE;
$ O- [ ?% M# U2 P7 g0 `, Z }1 C. E9 J- f* D* Z4 n2 V S2 e8 N
. X9 c+ _/ o9 w5 a* B% U9 ]
ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );9 |1 {; r# I) @/ H+ t
if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0)) 3 [5 {# |) c5 p' _; d( M% y* @
{
3 N1 S. p! H ^. Q0 f+ q& o( [ m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
+ ~8 E) @, W% q! J3 D if(m_lpCandList)% e9 J+ a6 U/ D; ^
{9 J8 |" i# Y8 U8 g
ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);6 [6 @2 S# y. ?4 M5 ~8 f
CandidateToString(m_lpCandList);9 R5 I! a2 V2 h9 F# L# Y
}2 U7 x; v5 N7 Q- V
}
% K8 u% g6 S; H4 ]2 }9 @1 u0 _. N- K) ^4 Y3 C: Z% W
ImmReleaseContext(hWnd,hIMC);
2 a, m3 ]1 K$ A( h# @, A9 n
5 o7 C4 i7 e: j return TRUE;
@' R2 [! j9 M# F& W4 k6 ]9 q}
1 p6 G- k4 I/ k5 r, h: h! l5 S& e3 y, u
void CIM::ClearCandidateList()
2 ]: a* x3 E: o! F% K9 ]{
# p! v! \9 q" J: l: G5 b- }6 D+ g if(m_lpCandList)
C4 a; Q$ f2 F' c8 t8 g { j# ^8 Z' T- y% J# t8 H6 V4 m; Y
delete m_lpCandList;8 N6 T, v. C! F. {' Z% c K
m_lpCandList = NULL;
$ w+ k3 x0 N& N3 X! W) E$ h" D }+ `# y' l' w$ G3 v( O1 e$ |
ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );$ i; e. f) v7 a" {5 V
}
6 P' W& x+ {7 z% d# z$ j7 o* f2 _+ \
3 J3 `0 d& V2 H5 d: y
LPSTR CIM::GetCurInputLanguageDesc()
& |0 k" j- w% s' D{
, y. P: N! o; T; O HKL hKL = GetKeyboardLayout(0); % u+ {$ W7 d9 G. `! T
; C9 ~! M$ N- ^- h" s if( m_lpszCurInputLanguageDesc != NULL )
: y: `( S1 p3 r9 u- t CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^8 Z' Z+ z4 E& g$ A8 m; O8 G0 O/ |
, T9 c" D4 l/ D5 \$ [) V0 _
int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度 m$ p6 l! F6 x0 f9 h0 t `
+ U5 J! h1 E. a" v/ n CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
( I. V* J1 c+ ^! t0 H0 h* P. J: J$ I, d
if( lengh )
* h; V4 E% I' P$ |* E( O {
2 {! r6 L% q5 Y+ T5 p ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);- S' T, _7 u F/ M( o
}/ s) A/ B' U9 ?- d( D5 z
else
5 I) V6 H, S2 P {# U! {( @1 W5 Q4 a+ [
strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );
. n: `* g$ V2 H6 d" [ }' ]9 U% \: ]% l* t
) Q( y. i9 ~5 k- n1 R0 m; r
return m_lpszCurInputLanguageDesc;
6 x9 [3 e- N" ~- c6 _) }; T1 z' p}
7 u+ ^8 s! Y% x8 b7 o- i" Y4 D) s
' G/ i9 t+ d$ i' A9 U, A! O6 E" j: nvoid CIM::UpdateShow()
& U' V! `# x( B# @# M& @9 d: E. X$ s{7 g3 d$ F1 {9 I) \9 n, Y
POINT pt;
$ m4 g" E/ c3 e2 M pt.y = 450;! I( v/ ?* p! j. N3 c
pt.x = 400; 4 ]8 S6 G/ c6 u8 \! h( m/ U
ttffont.SetSurface( DD_GetBackScreen() );
7 ^: D, H; R) V ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述
$ A( Y8 \! M, |2 r F% D5 n8 ?; ^2 I5 @( l
pt.y = 420;5 b5 [& H0 m/ B* ^+ @6 V
pt.x = 20;& _4 ~7 y6 h! ~4 i6 B0 _
ttffont.ShowText( m_cCandidateList,&pt );1 h1 T5 l( ?+ q$ {, |5 W; e
! `9 u, s0 J: i% W, _4 K pt.y = 450;5 i9 ]/ B8 p/ c
pt.x = 20;
6 r2 Q" b: r, n/ S7 N if( *m_lpszImeInput == '\0' )$ U0 O9 L$ J g2 t- i
return;
3 K9 t9 e; l. p, C; a* H) _8 r; W9 H) e5 s/ U
ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字8 R8 D- e/ P' y2 k
}
9 T/ N3 V7 c; D
- `3 [$ W, G7 c4 xLPSTR CIM::GetResultString(). {0 t1 Q/ ~( J2 e* W
{
$ u- t: o: F5 R6 m8 R# j return m_lpszImeInput;
, |5 i! _- P: `+ o/ J5 x/ @+ R( W}! t/ B7 o# N% |2 C% @
9 L- ~& F9 \2 S8 P7 ~) EBOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
" r4 ]/ I' V' Z% X{: f6 T4 R% k: ], d# d* _
if( !m_lpCandList )
7 C. J: Y3 g( F4 }- N, k# V5 W return FALSE;& o1 |7 v- i* C7 j0 N# g! q. X
9 f" G8 `& d2 _4 j
if( m_lpCandList->dwCount>0 )2 Q6 t: S4 i9 e5 K+ Y& y$ k
{; P { A( } J5 M( ~- {' c+ @
LPDWORD lpdwOffset;9 r( ]4 U/ q- @ ?- b
% X* h& X+ F z3 Y1 R8 y lpdwOffset = &m_lpCandList->dwOffset[0];
5 g# s* E, q0 E! b5 Z
9 |4 i: G) D/ Y9 T' l8 H lpdwOffset += m_lpCandList->dwPageStart;# l( ~& l9 V, |/ J$ V, n B
t1 U3 b3 K/ A/ I$ M ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );6 h. C5 n. C1 t& `/ Q, t
S; S4 _2 V, d8 ?8 R# }5 ^ DWORD z=1;1 U m; V4 L2 f) Z V
for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) + H$ f; D5 g2 }0 e! }
{ 5 p! J, @4 X: z- d$ F, R9 l
LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;
, j. Z0 }) h: p4 E char buf[255];
6 ?: [" Z( C$ J" v sprintf( buf,"%d.%s",z,lpstr );
9 i+ O) ` u) ?. B strcat( m_cCandidateList,buf );1 H8 [) u* ~, R3 t, R
z++;: D% y* _# n, R6 Z4 m8 p1 o
}
7 _; [$ o8 k6 K) D% e
7 f6 ^6 K+ e) i: Z return TRUE; L- [: d& {& v/ A5 t$ b
}% Y: s& x: ^1 z, e
i7 K, }+ |8 R return FALSE;$ _) t# {7 i; E. Z/ E; o
}
; r" |2 D/ Z. ~0 R7 H
" F9 z' x( A+ H5 _' @) SBOOL CIM::ImeIsOpen()
: S# `9 l" m B5 V/ ~% q{* J a! S7 o" E
return ImmIsIME( GetKeyboardLayout(0) );- Z+ I J: m; |0 J* v+ A
} |
|