找回密码
 注册
搜索
查看: 4675|回复: 0

[收藏]DX下使用系统输入法

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//  w8 @  N0 e3 @; N, [4 A) j
//: Q  ?% c7 F5 D/ v1 A5 [0 V
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家
7 Q6 A8 l- g, I* l) ]' \" z- ~% g// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-); W: Y& h5 @' z! o( h8 e) l4 r
// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
3 y7 I! a: N, B8 \- E  V/ }- x$ X' Q// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT/ r* b6 e: y( C8 L& `- ?# _  f
// 为显示信息用,可以用其他方法替换如 TxtOut() 等
0 L# u: n0 i  _' I/ d//
# i+ [  Y2 n  x- i//******************************************************************//7 `/ ~# \; q# x* g& E" @; L

* D* P' {. t% F- H1 L1 a//////////////////////////////////////////////////////////////////////
4 m: T/ i' i; n' v8 A//2 ]! K7 K* o. a9 l- H
// IM.h: CIM class (使用系统)输入法类
; B# I" @0 b% W3 A, C$ {/ k8 ^// 2001/4/30 Write by Jerry Wang& l" ~3 d* c& h8 J' V6 k7 _4 j
// 感谢大大鱼的帮助; O" |( G. C3 V" L$ ]0 v
// Need Lib: imm32.lib
7 m6 W% o' n4 L; }2 k% q//
$ d" ~( y% W% M! y. l0 Z9 i3 B/////////////////////////////////////////////////////////////////////// j  W4 y: ]6 ]# D+ p0 l

" _! E% ?2 v: D* w#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
' H1 }" B# m$ v. D' v#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_
6 W+ \- A0 p3 ~# N5 u7 W4 j/ `) h4 d1 t' J
#if _MSC_VER > 10007 |: V- Y6 ^) y8 [. b
#pragma once
7 B' w& z# R# @1 D2 i" J  E% T#endif // _MSC_VER > 1000" [, U7 Y4 j- [2 h( z- O3 f! b* I6 ]

- q) U) R7 U# Z3 X! _3 q8 M#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数
3 u1 d9 b! _9 @( `& `; ~# ~
* U5 p, p/ a# a& x; O+ k#include "FindMe.h"$ x0 w3 D- N. j6 c: O

; C# x9 p1 i6 ?2 j6 Iclass CIM * y: d2 ~0 Z. B4 P3 k
{7 q4 y2 [0 k! _" l2 ^/ u
private:
5 A0 S+ B5 Y) y; x- G1 Y    CTTFFont ttffont;                    //显示信息; k: G+ T7 w" K, t* _+ ~3 O
   LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表
) u! _3 j8 z$ \& Y7 t    LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针: d) f0 {: E7 k3 o. i* G* u  c
   LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针( V( i  G. Y& S/ X) u
   char m_cCandidateList[255];          //候选文字列表缓冲区
4 B6 j" s' v# \' h8 \1 {( z4 ^  N    char m_cInput[64];                   //输入的字母
& s3 g0 w) {% L0 j) x- x4 g
) b% F3 H4 A2 U# H0 r* [    BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串
+ }+ v, H% ~8 a+ v0 O
4 E* l) T% @! c- n& `. B1 Y* qpublic:3 u( j" E. t7 h! T1 n( `% h

* R8 v. }  w6 z2 x  s3 I2 P    CIM();
( L4 X4 E! l' J    virtual ~CIM();
1 M$ n* r' n# t7 L
+ s! Z% h3 o* W- a    LPSTR GetResultString( void );                     //取得输入的字符串
- K. g7 }1 m2 N1 R' N
  l& e, V+ o7 W9 V" \3 G    void UpdateShow( );                                //显示输入法信息, [  C1 e( v8 U
4 e1 }( u& b. D7 x! Q* A, \9 \2 r% c
   LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述3 C- e9 {+ A  I9 a4 w% j9 T
   void ClearCandidateList( void );                   //清除输入法文字候选列表
) i$ I  l, y$ a( m    BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表3 u/ O- ^) Q% j% x1 o
   BOOL ImeIsOpen( void );                            //输入法是否打开+ {8 z6 Y+ K+ l1 f/ A
   void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息
! t  C% d, h6 W+ O' q: A    void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
8 ]4 g; G! |/ h# S# M4 ~    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息3 K9 a& Q! P8 l  t4 Q3 u! O
};# C# E5 f+ c5 M

5 L1 b1 A5 M+ l3 i! A4 F#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)3 k# ?( x/ h6 ?+ v
- P) b5 n. n3 n% H
+ r: j* [4 Y2 L* {

5 s& b( x2 {. g6 I. L$ N//*********************************************************************************************//
2 j$ p) m3 o9 O- N1 z. L  u/ n
& _/ U# {1 X, c0 T$ d& k+ [8 Q//////////////////////////////////////////////////////////////////////& M. O2 @! \" |/ v9 a/ b
//
0 d0 ]: n4 I8 J// IM.cpp: CIM class (使用系统)输入法类
5 C) g" B9 \2 y8 A// 2001/4/30 Write by Jerry Wang: J$ g) x" q  J( Z- w
// 感谢大大鱼的帮助
; a6 e  s$ h8 @  ^4 C5 o, o0 ]// Need Lib: imm32.lib
( N  ]# K: y3 }. d8 O0 T/// \. `9 G* G& S  |& X
//////////////////////////////////////////////////////////////////////9 N- t! d- |- b4 M6 \/ I
  Y" u! i2 g+ ^2 G9 F
#include "imm.h"8 @! c* k# s# ^5 p8 r  z  q
2 n# r0 w# I1 z+ _  Z. r# ^
//////////////////////////////////////////////////////////////////////
0 m  u/ s$ k: p) N/ O3 c// Construction/Destruction
3 K% J2 A$ Q9 t% h//////////////////////////////////////////////////////////////////////
0 ?8 P5 `# {$ z) s
5 I( z4 g' d+ p5 D5 k- QCIM::CIM()" ?/ C: U9 a: {; W/ {5 X( w
{. T. F1 {" U! b  ]
   m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];
; F! J9 J; D0 ~" k& ~    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
% s: z, X6 G6 F3 n    *m_lpszImeInput = '\0';. e2 H1 D% b! T- v
   *m_cInput = '\0';' I8 X+ j3 o* t5 F7 B* Y! q
" }" E' v9 ?# D" G! J
   ttffont.Create( "黑体",15,RGB(255,255,255) );# x; s" z1 g. p. ^1 C" h7 O  m9 d
   GetCurInputLanguageDesc();+ j. d. z5 T6 _  b
}
* I# t" [% K# p3 r  E7 `& U1 n! V0 k/ ]6 F
CIM::~CIM()
# b& @' S+ i% C( S/ S% _{
/ X9 x% z0 x- e% D* t2 l    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );7 ^0 C, n. A; q1 {, N5 w

# q# Y$ Y( {! ?/ b    CHKB( delete m_lpszImeInput );
" r; R% C, [  U# A    if( m_lpszCurInputLanguageDesc != NULL )
, K5 Z- g0 Z9 I( p- ?, g- Z        CHKB( delete m_lpszCurInputLanguageDesc );
4 a! ^  ^/ i0 \( o}
# a' b4 T: S2 Z) e1 @, t7 U. L
9 M  d" b: w! g# @! `  P9 ~void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)- s# r% s5 F+ E2 b7 h# w
{
% U& f0 i$ B: j    if (lParam & GCS_RESULTSTR)) {- A+ w: c: \" w1 f2 k" L& g6 H
   {' l$ u6 U# p, w7 P
       HIMC hIMC; //输入设备上下文
/ C( r) f4 r- z* {% U5 t7 V        DWORD dwLen;
' J) t- z# o8 K. V5 p        LPSTR lpResultStr;
, g7 P% n: ^- b$ X4 y  K$ e  p. z3 H' G. a9 P" G5 [+ J! X0 h0 o
       hIMC = ImmGetContext(hWnd); //取得输入上下文' I- B4 O! j4 n% U! G, N  d1 a

% \" e8 p! r9 `) T8 O! V' }$ m        if (!hIMC)' I0 ~* k  @! g: j1 c2 I. g2 o
           return;
/ s4 z2 k* ?& }9 a1 r1 B' v: `1 O) B* }" R! a
       dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
  F9 w6 c2 p0 B# ]  G        dwLen+=1;
. r! q! c4 X, c1 k1 y6 f2 _% I7 g) M
       if(dwLen)8 D# p1 P% B% ?( ?" ?4 M6 F
       {
3 M, I8 H' e+ W; |3 }! G            lpResultStr = new char[ dwLen ];5 P% }0 q' S" W

2 G7 J: G+ R/ L) G- F            //// 缓冲区已经满了
: X6 f5 V+ C- i4 {            if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )
+ Q# a+ o. C' u            {  p8 V  F( v3 m+ S# Y
               MessageBeep( 0 );" z" u; g0 l) h: r
               return;
+ [3 ^! _4 D  d8 y' G* [& f: N            }
  E2 l* H# |  K/ y            ZeroMemory( lpResultStr ,dwLen ); ! q: u8 W, w8 k7 s2 N2 ]. b: w0 O
           if (lpResultStr)+ ^1 Q4 {2 U2 {  k* t% i
           {- R$ P2 ~* U% i$ p- Z8 i
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);
! ]+ q$ c3 k! u: V/ ]; S                strcat( m_lpszImeInput,lpResultStr );: X& Z7 p9 [# Z" l
           }
. S) K9 i% a- O% n3 B/ u) F            delete lpResultStr;
, C; o7 r7 d  ]' j, ?        }
( g4 k# \  u( \6 c- F2 X9 ?4 U# B, x: |0 D9 ^( S  H" a
       ImmReleaseContext(hWnd,hIMC); //释放输入上下文
  z4 m2 X+ m2 L3 ]" o( }    }5 U. G1 g, q- @6 I7 [
2 Q6 @( y+ a+ `( S
}3 I* T' [. ~8 w7 ]
3 c& N! |: Q9 N5 J! j
void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
! {7 W0 C4 D% l0 ~" Q. U1 f{
) \# C6 R; `5 K( D5 h    DWORD dwCommand = (DWORD) wParam;! _4 K5 d& Z( G1 L( e6 R
   switch( dwCommand )
/ x/ b, ^+ d9 U7 w8 C3 ~5 m    {1 l0 H* d2 k! ]* ]% g4 c! [3 f  [
   case IMN_CHANGECANDIDATE:3 G4 K# `, o2 X; m, |0 L9 p
       GetCandidateList( hWnd );; j8 k8 p9 J& _9 s
       break;
# G% d. F( d; v& ]8 r
; y! i( C2 V1 K! R" Q6 N3 F    case IMN_CLOSECANDIDATE:! C2 k2 \* F) }5 U2 Q' T- V9 S
       ClearCandidateList();, N: p4 x3 V/ v
       break;" D+ e- u# J7 X  R) g: O
5 }9 Z1 R5 }0 Y* d
   case IMN_OPENCANDIDATE:
. y$ `0 r% Q, O, K% {5 I  s        GetCandidateList( hWnd );* C& p8 U0 Q+ f: a
       break;
0 O: g2 Y+ G, F' x5 O    }, U( [* b. t* ]+ ~0 X
}
7 j& S/ w+ E. C3 g1 ]3 _3 `
, L7 e4 S! c- @1 Z2 evoid CIM::OnChar( TCHAR ch )
  y) L* U$ d1 Z{
" g: ~, w& Z- V* @    int len = strlen( m_lpszImeInput );
+ v: Q  }/ }) |$ R) [; g2 F
3 w" t; R5 s7 A8 z, N  A$ G- E    if( ImeIsOpen() ) //输入法打开状态! C9 S2 c- G0 Q
   {
) Y8 a# }# C: d
$ p$ m3 V0 S9 ?9 {8 b    }2 I8 u+ U/ y$ W3 N" {. V' e* j, R8 Z
   else //输入法关闭状态
3 F3 ]6 x2 c7 o4 X: F    {
# {5 E5 l# J7 z4 q' H        if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母" D3 m/ Q' l) K% o# _
       {
+ E$ V4 A+ m  H            *( m_lpszImeInput + len ) = ch;! H9 \& N8 }+ H5 S1 v
           *( m_lpszImeInput + len + 1) = '\0';
5 l4 C5 ^% o+ ^, K, K0 K        }
# Q$ ?4 ?% \" {  B) J4 C4 g    }: z3 h. M& w: c# f: V& `' t& ~

- v- z/ I0 U/ t6 g    if( ch == 8 ) //BackSpace字符
: j. V0 I, g+ |0 H* e( z% y4 r* q    {6 R% e/ e6 k' k2 f
       if( len == 0 ) //字符串长度为零
. n  z1 |, v, R            return;
% J# B! e0 s$ E) F1 G! m6 P, b. L/ x1 K
, y7 n/ N+ G6 i4 u        if( len == 1 ) //只有一个字符
9 b, H0 b2 \4 o, S6 X        {
7 j& Q( ?$ N# [3 r+ Z3 H            *m_lpszImeInput = '\0';( a# g- B# w8 [# c5 e& m5 L2 a
           return;1 Q7 X6 V" X; i; P, W; ?
       }8 e8 A% r' P7 C) c; O; p2 |
0 D% x, V6 l" Y2 A9 m" V1 U6 p
       BYTE cc1,cc2;
4 G" P" C. Z) m; T( S2 B; K6 Q        cc1 = *(m_lpszImeInput + len -1); //分离字节" i2 x5 n9 p3 F* D
       cc2 = *(m_lpszImeInput + len -2);% _+ a5 q( u; F% _4 w6 X2 j
; m0 B( V3 O; j0 b3 P2 H
       if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA01 h6 a0 ~  o% o6 e: }5 S  d9 x, T
           *( m_lpszImeInput + len -2 ) = '\0';0 n0 ^7 F1 J: N& m
       else //是英文字符(单字节)
0 ~" A+ ^% K4 C/ f            *( m_lpszImeInput + len -1 ) = '\0';$ B# M+ n& o9 K8 l
   }  q( H/ E- q5 ^5 U+ r, e5 G  Q* Y
}! ~3 y) {  s" e1 u! O
) E* n1 Q' Q$ B' A
BOOL CIM::GetCandidateList(HWND hWnd)
: j& j$ C* c2 D4 ?0 N, W0 l{
$ _' P, D' k4 ?! _$ B9 c+ e    DWORD dwSize;
+ k- ]% P; W7 U* E  R9 ]    HIMC hIMC;, H8 Q/ f  a3 i$ I" j

- ]) l  I* V) D, u8 y, Y    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );- I- b4 {8 L+ g7 m4 Y  a

! G( @! k7 z) L% _    if( m_lpCandList )
& G- }) s5 G4 X: w    {
3 Y1 w2 i' f( v1 V. Z" Q6 ~        delete m_lpCandList;( W" \" l; b) F: F
       m_lpCandList = NULL;
8 e( H( s+ [. p  e# w    }
& v+ ?, y* E% |5 e- B
: G# e, ?$ a0 q0 J, f5 G    if( GetKeyboardLayout(0)==0 )$ s$ ^; ]3 r  P- }( N
   {
  j9 S8 \" b# \: ?$ A* E# ]        return FALSE;
! x) K  w! a3 h: |1 `# z6 o    }& d6 I" K3 \( T1 R: H0 Z7 n5 e- f

% K4 d: S5 I5 L( F) `1 M    hIMC = ImmGetContext(hWnd); //取得输入上下文8 |# y, R; s, r; i
   if(hIMC == NULL)
8 \6 b$ o/ S1 A1 p    {$ z/ Y- V2 Y5 \# u- r  @/ m
       return FALSE;4 G+ K: ]8 R- H) E
   }4 R" g0 n: a1 {

' p: J9 f5 h% Q" b    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
$ [( z) }& p8 p+ w* ~, {$ z9 W    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0)) 3 T6 }( o$ r! R. K; m6 d( Z
   {
7 f3 N2 n4 D) L; K7 d        m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
/ l6 b; A! `3 \4 ~! u7 c        if(m_lpCandList)# o) `$ L: O. z+ f$ N" S# V: J3 e
       {$ G6 d) G5 R6 n% x
           ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);
2 O" W: [! L/ V7 ?# h, b1 o            CandidateToString(m_lpCandList);1 D8 V3 Y) N* J' I0 Q& X8 O# F; `
       }
% l' A2 m* u6 p0 @; s& T2 Z    } ' o( B& d# Y3 D0 l
* m" m$ E3 _8 g2 F7 ^
   ImmReleaseContext(hWnd,hIMC);2 D& o) U: a' \9 R

1 M8 I* C9 j% @+ r4 @% i  W* }    return TRUE;& i: j) i* `4 J. x) Z8 I
}+ ?# x& b( f" a7 b% u
$ g- b+ ]1 e9 Y8 L  k
void CIM::ClearCandidateList()# g3 |8 x8 d/ n  c) I; d5 A
{* A8 _" }& n: T4 \0 B( y9 R
   if(m_lpCandList)
7 N/ _8 I9 S( f" s! d: S8 N    {
/ B' L8 S! l( j: b        delete m_lpCandList;
/ n) K4 I* A# e7 K( _: c        m_lpCandList = NULL;
& n, J* y9 a6 B5 s9 r/ V    }+ B! W$ v# O5 C. t- e
   ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );
1 u  G2 w; u( q  n- H+ R' n# ~; b8 P}0 U. I$ z% @' B) p5 ?4 \

( U& g5 W! n, a
% _* `1 `0 i0 C9 }( c' S/ W9 vLPSTR CIM::GetCurInputLanguageDesc(); c% i4 J; A+ Y* G0 y+ g# F9 F, Y
{
7 f, ?/ j8 _! G2 s, a    HKL hKL = GetKeyboardLayout(0);
6 r) E; }. X3 Y5 L# Y+ U1 Y9 F' ]6 X# x1 C) g5 A. s% L8 {
   if( m_lpszCurInputLanguageDesc != NULL )5 F9 B- {% V; ?$ `2 Q, l& q
       CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^
4 }8 q8 }5 W' X% |0 |8 U
9 G: b1 |3 O& ?! ^3 a& R    int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度
: z+ y, e' `* I
8 R3 l( r1 o' t  g    CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
, r7 s" a! ]! F; `) }1 m. u0 `" i: r; O
   if( lengh )4 w. J) U9 G" Y3 q0 l' J
   {9 x+ {8 ?2 x, E5 _- `
       ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);
  Y5 {3 [3 K9 O- U, o. T    }' v$ |/ X* m% f- D) x
   else
+ d5 Y8 D( f! I) d/ _) W    {! v8 u2 g* N' V2 Y0 d9 z+ P
       strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );. K  o- ^7 [. Q% ]" L! r) Q
   }
: {' k# q" E" c& I, a( v1 H& Z) m9 f
   return m_lpszCurInputLanguageDesc;
$ I8 Y. O( i2 x7 w, I$ p* Q}
1 R% Q+ I( w7 k7 w3 g
) u; D. ?$ ?4 Jvoid CIM::UpdateShow()
1 q" X( O2 d5 F{
( z. Y( Z* w! H6 b# [# ]    POINT pt;! r! |8 ~, e8 ?: ^4 X# Z: L" I5 M
   pt.y = 450;
# c( f! H3 U6 f/ q    pt.x = 400; * a; q8 e/ y. E- v1 c2 K$ v/ ~
   ttffont.SetSurface( DD_GetBackScreen() );
# o0 }6 R3 O( |( _" D2 R    ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述
7 F- l5 d$ l, m- A
, S1 o4 B/ i6 O2 @3 }    pt.y = 420;9 ]$ a: x5 z! c% I  T
   pt.x = 20;
) u: W* v1 r  t. l/ A    ttffont.ShowText( m_cCandidateList,&pt );; @3 M5 V5 u$ F
& C& |5 v; e' K; D% [5 S/ E0 Z
   pt.y = 450;
" t6 f4 g/ {. U2 [; `  r    pt.x = 20;
2 V2 t3 w2 \6 o3 d/ n5 u    if( *m_lpszImeInput == '\0' )
/ {* \& S( o& W        return;7 H; S4 p3 L/ q, q' ~

! V" W- Y$ z8 s. U7 S7 l    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字
8 k& o% Y) h: g' ~2 a}! Y" A" A9 }. U  V& ?5 T

: ~+ i8 C9 u- ?. S$ @9 VLPSTR CIM::GetResultString(): z4 }* Y. f; L' G' j
{
% B3 E; p8 O5 n* A, A    return m_lpszImeInput;
, n4 }: f2 V8 c8 s: ^  ]. a}/ U+ }( W" M2 O

; N& p' R$ h2 h3 \BOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
. V: t" c$ G, F, ]0 I{
# }. I: b- y% a) l    if( !m_lpCandList )
9 [, y8 T' ~; @        return FALSE;
( c( }, E3 m! W6 p, r+ G9 P2 `& m7 M* Y3 j7 b
   if( m_lpCandList->dwCount>0 )
0 C2 b7 f3 q+ Z4 s% Z0 p    {
) _# P0 w# C; d: o6 T        LPDWORD lpdwOffset;
2 w/ g1 ^: O, S( ^
* R7 ?5 W; u4 f, g        lpdwOffset = &m_lpCandList->dwOffset[0];
( _; w$ }- `* W
& N. S# O' G7 ~+ |+ z. i3 m; e        lpdwOffset += m_lpCandList->dwPageStart;) A' f  D1 n' K' X

0 f  f1 ]* p; l1 H  B" R        ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );* W% }& a. D3 g$ \! o) ^
9 c. {$ ]* v2 U2 I, W' e
       DWORD z=1;
1 }$ r0 ~! W& R9 h. p        for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++)
' w: ^& N6 p; y4 h        { 0 F; P. D- |3 X. j% M8 o& `9 d# V
           LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;
0 M+ p; g( _+ x5 ~. K) X1 S            char buf[255];7 ?2 F5 O( ^$ @8 \# F4 B: m
           sprintf( buf,"%d.%s",z,lpstr );
0 B) d8 O( w- C( [/ U+ ]            strcat( m_cCandidateList,buf );
( H0 r7 v6 a9 `+ u' d. k            z++;
4 J) b9 `& b6 e8 x7 c/ H        }
9 r; n. _+ H, A0 W  x; r6 l+ _6 |/ `3 w, c* K
       return TRUE;
6 c* |7 f$ A1 l4 M    }% z3 |1 A4 p9 C' O* Q
: Z. y+ R6 ?9 R9 @; N
   return FALSE;0 r+ q/ y; H; j9 Y
}; o. A3 U& o" G  P4 e( S  Q/ n7 K
$ q+ a9 u' U* P% x7 ]
BOOL CIM::ImeIsOpen()
& A0 X( E8 ^0 h% V$ @6 m0 u( t{
: q9 @8 T4 W( ^$ r9 A: s2 N    return ImmIsIME( GetKeyboardLayout(0) );; _" R( o  ]! Z: G
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-8-13 23:49 , Processed in 0.019758 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表