找回密码
 注册
查看: 4714|回复: 0

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//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
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-1 22:02 , Processed in 0.017990 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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