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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//
; k" @7 N8 I) k% X//
/ [4 u0 x+ O, e# f6 g// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家- ]4 R/ q: u, u
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
* i& Q. C$ O# J  W6 O/ Z// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net, ]; c  W! h( P
// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT/ s+ N7 V" S4 m9 ~' ~, q1 n
// 为显示信息用,可以用其他方法替换如 TxtOut() 等% z. D- e" H! G2 `; Q+ [
//, V( e/ K$ B8 r- y9 Y. @
//******************************************************************//
4 R5 ^) L+ L% x# ~1 ~+ P; [* c0 ?* [) \4 O6 g( J* a- b
//////////////////////////////////////////////////////////////////////
7 r2 }9 w! S* k. Y/ r//
( \* t# n; }" v( m: g" w// IM.h: CIM class (使用系统)输入法类
. F8 P/ v9 [9 u( h* A' T// 2001/4/30 Write by Jerry Wang/ M+ E8 [, q  s( h
// 感谢大大鱼的帮助5 v8 f9 K) w, t, }+ X
// Need Lib: imm32.lib9 R/ [, l4 ^+ K4 |* v' v0 J
//
$ [! w; f; w; R6 C( ~//////////////////////////////////////////////////////////////////////
7 |  B6 }* ~- o; D5 y8 n- B* X1 l5 U' Y
#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)( z) a2 o0 @. L$ P( E
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_) U. k' V% d' u! v$ e7 h; {& K* H
$ s" D1 k. f+ ~: Q
#if _MSC_VER > 1000
# `2 M9 i+ s  G: P#pragma once
0 Q% n3 C2 b4 S" \$ S#endif // _MSC_VER > 1000
9 \" E+ h/ o1 X) W$ b% \) o; X' ^% a5 u  D  Z! `
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数
& H* q4 M* A$ [! ]+ e/ h) f
, v3 |, o* Z" \) C# c" n! N#include "FindMe.h"
+ g  w2 k& \, i: N# t
. [3 s8 ^# a1 a* p5 n+ V5 i; s, |class CIM * i$ P  O; E8 F+ o
{" |: p0 d) G6 D$ I1 K; s8 p% k, @
private:
+ b$ Z7 u  S- r8 q    CTTFFont ttffont;                    //显示信息$ y4 j  s5 H3 j4 R
   LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表
: Y- P3 [: z4 ?3 D$ S    LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针5 b0 E* y- R6 a' c) D9 V/ N2 e
   LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针/ P& I  B0 }& L" I( B9 O
   char m_cCandidateList[255];          //候选文字列表缓冲区8 I- j/ m3 i5 C- X$ a, T
   char m_cInput[64];                   //输入的字母1 @/ d8 J8 N8 [+ U# ^
' b  X  q: K& {1 s8 U, E
   BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串. h; V; h2 G! x* g7 Y

( p% n$ Y" \$ x$ P7 P# y8 w& ~public:& f6 i) [# B7 Y( Q
7 f' I0 n- A: r# k; ]* e( N
   CIM();
; ~6 I5 _3 V: M" K9 Y8 v    virtual ~CIM();
% }) d1 w1 N2 j( y. L( C" f2 r( `, i" u
   LPSTR GetResultString( void );                     //取得输入的字符串
) ?/ O6 T; `0 V9 _9 N1 Z, D* }; a# J" A% W: [0 S
   void UpdateShow( );                                //显示输入法信息
9 e3 r( x( w2 J- v0 a; o& u6 t
# w' [4 u0 Z; z7 a4 g! v    LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述( j4 X/ _; I, x7 Z
   void ClearCandidateList( void );                   //清除输入法文字候选列表5 ^. z/ g: P, U2 p0 t0 c+ c
   BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表7 e+ Z/ H9 w5 G+ N: c3 C
   BOOL ImeIsOpen( void );                            //输入法是否打开
, A2 C( {) |! Q( g2 z7 w& b    void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息; J& N. E6 |- z" U
   void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
; t7 Z' J  H$ ]" M& o5 }/ q    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
/ g. H' L7 f$ ?( m/ [  z' k};% j8 v8 d9 z8 [8 [. j+ C+ ]

' Y  q$ e9 b7 z0 E% L% v#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
5 m' T2 A8 ~8 N! Z, F: r6 Q! J1 k! i# K" [+ }! r) [7 y
# v/ O2 {" B, B" T' M0 [8 S

4 l- f% V0 q3 J1 Y% v2 ]+ T//*********************************************************************************************//, X2 K+ _1 D* s
5 n: X) q5 ]  B( @9 W
//////////////////////////////////////////////////////////////////////
) g! R  A, v' n, O  H. f* A6 R//
$ N) }. C) g* D. B( B) V// IM.cpp: CIM class (使用系统)输入法类
/ w" e+ a& b' H) x. H( h6 C// 2001/4/30 Write by Jerry Wang
* Z1 x! \* D. J# J' }: M. X+ y// 感谢大大鱼的帮助  ]: Q, C$ d+ }! I# ~% R9 G0 o1 s
// Need Lib: imm32.lib: y4 z4 J9 `0 [8 R' O1 X
//
$ \& X: c. n8 k! W( R6 s//////////////////////////////////////////////////////////////////////: a( b  m# s& ^. z. ]8 S/ c
7 V8 C& ^0 g5 @9 i# f: B
#include "imm.h"
% t  x3 A7 j, V3 O" o0 @; v1 h$ _% m6 B/ E) |$ i" K$ u" I2 V
//////////////////////////////////////////////////////////////////////3 m9 N2 }' o% l! |
// Construction/Destruction) ^4 e4 }9 ^) ^" D" R; q$ _. ]$ s
//////////////////////////////////////////////////////////////////////
7 [( Q1 |+ n, J0 n, p$ g/ N' f( _: c& z" ]
CIM::CIM()
# t. A/ U# k4 K. P4 l% v{
; j. {6 ~$ I- K% L  o& I  A    m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];
9 Q. Q- V6 R7 l: ]9 Q    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
2 }& K. |; f0 b" I7 ]; Z    *m_lpszImeInput = '\0';
# i, I& T! n. g! ~- x0 @5 Q    *m_cInput = '\0';
6 Z) g" e1 B6 `& G( G
+ n' P! p3 v  l8 W8 m) d2 t/ e9 S4 N    ttffont.Create( "黑体",15,RGB(255,255,255) );! q" p3 T! R3 C. F  b$ ]
   GetCurInputLanguageDesc();
6 B( {0 H6 v. p; I# c7 W8 ^, O& @}
8 `# E6 T3 h, M! ^% y9 ]8 n- ?+ S9 {" @: p  B
CIM::~CIM()
# `0 A7 }+ E# A& M9 d- m  D" G{
$ b8 ^  ?- G! h! o$ k' R0 n    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
( T2 r; \, p1 P) C7 A5 e# _* }! F: R& Z# w3 w
   CHKB( delete m_lpszImeInput );
3 k1 h: G2 S$ ~    if( m_lpszCurInputLanguageDesc != NULL ): q3 s8 s  p. k* H) g
       CHKB( delete m_lpszCurInputLanguageDesc ); 2 h5 S* [6 N1 P
}7 {, ^/ l1 W, D1 z' c

2 g1 g- {* `5 Jvoid CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
9 ?0 N, q/ A+ E5 V6 I{
, h0 z4 B) J  |( W4 U( Q    if (lParam & GCS_RESULTSTR)
- t; L0 L1 Q# T  O    {3 G1 Z# J7 f. E  w# j0 D9 h: P
       HIMC hIMC; //输入设备上下文4 r% l& R! N6 m
       DWORD dwLen;8 D' D) ~9 T& }2 f, v
       LPSTR lpResultStr;. E/ U% }5 {: g
" h" l6 s  S( i' k/ V
       hIMC = ImmGetContext(hWnd); //取得输入上下文
: e! v# X6 v6 f: G1 r$ F6 ~3 d
! ?. ^$ i4 ~2 E; X/ r6 `, l        if (!hIMC)
! _0 |2 ~7 ^# P7 K/ _" {( @; O& e$ u/ G            return;
& U5 C8 K  c8 U, q( L/ m' U
8 v- J+ r! G( n( @( c( Z        dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);( l- v6 S- q/ j& f
       dwLen+=1;
$ i9 @3 Q' N" W9 o8 T1 \! {! l: ^; n) j) [
       if(dwLen)3 o% H2 J3 M) P  n
       {5 [5 v" a7 j" T0 l
           lpResultStr = new char[ dwLen ];
, ~% X- S9 i- G' [9 W/ E0 i9 l" `8 b& Y2 H9 ?. V
           //// 缓冲区已经满了7 A; a* Z0 T, x' |4 `; Y6 j* H
           if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )
7 A4 G5 d5 [% ?' N            {) D4 ?" G! D3 n* c: V
               MessageBeep( 0 );+ a) h  Q( F; u4 |% b) ^
               return;4 c$ N6 A' _+ [& Y) J1 r
           }
5 d7 |' g/ H$ K2 g( P5 z            ZeroMemory( lpResultStr ,dwLen );
$ k* p- Q7 m  z            if (lpResultStr)  D  d1 e( X" O  X: }; y" b
           {
* Z& ^$ H. s; l6 D                ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);
! ?' I! O7 f6 `* X/ G- h                strcat( m_lpszImeInput,lpResultStr );+ n3 {: x% J& p, K0 O1 }5 i' y
           }
0 F& w" v1 X6 S( {            delete lpResultStr;
, O$ X9 x; h9 p- J        }  h" j, |$ M8 T: B$ \) Y% `. d  P

' V7 b2 N+ w" d! t# @        ImmReleaseContext(hWnd,hIMC); //释放输入上下文6 b6 x- w  H; j9 C
   }
$ U/ I3 h5 k/ O% K6 d" \8 K& v' }# R$ e4 V3 ~
}
: x: s, ?9 l. h( @4 c& y5 v6 u# n1 c3 @: F& U6 y
void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
$ n" O, y- s" j1 n{
( f' u1 Z/ {2 p: l: K8 Z    DWORD dwCommand = (DWORD) wParam;
( r/ `: X- p5 m7 z( |2 z! ~1 K    switch( dwCommand )
, p# x* |+ ~* ]. j: U7 R& O    {" j, }+ o6 N6 \9 J/ |
   case IMN_CHANGECANDIDATE:1 @0 a, n) ]: ]! q9 B
       GetCandidateList( hWnd );" c* |: F& ^0 M7 _
       break;
1 @9 s& y8 J. R. A% j2 n% L- x" y% Q/ G8 Z1 K  ^4 F
   case IMN_CLOSECANDIDATE:
' F  t; q; I( G' ?0 @: k        ClearCandidateList();2 c+ E+ a& `1 D9 R
       break;
6 C& X5 g+ K# w/ a/ U$ P
- r  B$ q6 ^1 s8 M6 T7 R    case IMN_OPENCANDIDATE:4 j0 [. n6 W* s* ?* H
       GetCandidateList( hWnd );
' E' ~$ o% d- C! o( D3 Y        break;+ Q! k4 A5 z! P8 ]* t, C
   }
: E) Q6 y7 e9 M. d2 z6 W% d! z}
( z, r1 r- X- i" `* e$ Q9 V+ \+ `, D$ C* L! K
void CIM::OnChar( TCHAR ch )
$ {. H- x7 p, e! p. r{5 J* P0 [5 C4 y
   int len = strlen( m_lpszImeInput );
4 J* v5 Q, P$ I& O" o" r
1 b( J$ A  T3 g- b; q    if( ImeIsOpen() ) //输入法打开状态! x* F9 [' r2 E! m9 j
   {3 G0 J  g. F8 z3 h6 O  f

! N# C2 W( {# K" |8 L% X    }
* @) ]+ ], P" v3 n) J  I) h    else //输入法关闭状态
$ |; u* U/ x! m( @8 j+ U1 Q  i    {) {# C* k! h& O3 @, f
       if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母$ @- c# l* R$ i" {  r9 d% C
       {7 S$ W. f6 H5 Q
           *( m_lpszImeInput + len ) = ch;
$ y% h3 r5 Y' l+ |9 u6 H$ U            *( m_lpszImeInput + len + 1) = '\0';  x6 i3 J! M( I  K8 K6 j/ D; N
       }* a. c. |% e7 L" ~
   }5 r3 ?4 H4 p8 K& _
$ u# c% x3 F$ j) C4 a- t, _
   if( ch == 8 ) //BackSpace字符& e4 L/ h% c) I8 h& Y
   {
: ?2 u1 Y" z. I' T; T/ ?        if( len == 0 ) //字符串长度为零
7 {3 m. T" l9 U3 v* e& h            return;- m- F1 O+ @! l$ ^( y4 B- a
* a( c4 g  H6 r
       if( len == 1 ) //只有一个字符: f6 w) q2 H0 p0 j
       {
1 ?7 B7 [% \- ^: o5 ^* X) r/ w            *m_lpszImeInput = '\0';
* E: i- l% n" T& J1 I            return;) |& u7 s$ h+ P) j1 ^2 i
       }+ r& Q) W1 m9 c9 c
9 L1 o9 i5 |# u, ~' r: O) |$ P
       BYTE cc1,cc2;
% E* c# H; U! d* J        cc1 = *(m_lpszImeInput + len -1); //分离字节+ ~1 D* e# n4 {; d; F# S% O$ y3 s  O
       cc2 = *(m_lpszImeInput + len -2);
* W: V7 Q$ N) Q6 n& O
% n9 L7 q% P9 p        if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
8 T6 o6 h3 g" P$ x3 S            *( m_lpszImeInput + len -2 ) = '\0';8 a% g9 i  _" K5 \
       else //是英文字符(单字节)
' f2 p0 F% n. y9 Y! f* {% H1 s# p; d            *( m_lpszImeInput + len -1 ) = '\0';+ a3 h+ M5 _- H5 L9 ~: Q
   }2 A3 q: y* \4 \/ i
}
1 g+ `/ v! N9 w6 M: @8 h* R4 s9 B$ s5 m$ R
BOOL CIM::GetCandidateList(HWND hWnd)6 l5 u* w' k4 }# t# Q
{
2 |4 C8 g) C0 |5 j    DWORD dwSize; 0 p) ~! y* X+ x1 T- g! J
   HIMC hIMC;
/ T9 w8 H; O8 d4 [6 I# T- T( D% w- q
0 i( A. H3 m; P7 \    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );- k1 J) Y& B. J2 [

7 Y) q/ ]* R: c$ B    if( m_lpCandList )3 S( q8 `; K1 O$ ^$ r9 I
   {
# _8 e: U8 Z6 x0 l1 q+ P1 K0 A        delete m_lpCandList;+ m  N" o" R6 ?4 a$ H) m
       m_lpCandList = NULL;
0 o! T  C: c, n3 z5 n9 S) [    }
" E9 Z+ n/ f+ j$ }8 ?
; l/ H& Z' \( W    if( GetKeyboardLayout(0)==0 )7 K9 g* p3 `3 t$ ^9 ~" ^
   {
, B2 T) U! r  k1 H4 h/ `        return FALSE;, j1 \6 {1 o8 U0 M
   }
6 z! L8 {9 v/ f6 i4 C% f% d! j: q2 g2 b2 J; `# r
   hIMC = ImmGetContext(hWnd); //取得输入上下文
$ e" a" c" m( R; u    if(hIMC == NULL)1 Y. V( G" b# j% p" d
   {6 ~' V. e" Y( T3 X4 V" c
       return FALSE;
2 [* R* [( X' O5 j& [    }8 \9 C* c0 x! V" A
- o- O3 g$ m' ~3 G
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );' a6 E- j# T4 ^# _
   if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
( Z; x& W3 H) d& u: t4 ~$ A* s2 m    {
+ e0 U) J/ i( m        m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
+ S3 x9 s0 o4 f& c& `        if(m_lpCandList)2 y) r2 ^! h' M5 V
       {
/ O* M: _4 ^; n" \9 O            ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);
# N' b1 [% w! C1 t6 Q4 i1 @            CandidateToString(m_lpCandList);8 M4 w; F/ x3 I* B" v/ `# h
       }
2 L; Y6 o& g+ c6 y; \    } 4 [) a% G9 X  Z2 c. o' T: t
! b) B, G! l2 y( N
   ImmReleaseContext(hWnd,hIMC);4 G; g- [( x' t7 ?2 }) I
; h9 i6 s( i$ E$ r
   return TRUE;- b$ g* Y5 {1 B1 I
}( g4 v# ?6 P! l) q5 H

5 N1 {! |1 D4 ^; M, `% P- Uvoid CIM::ClearCandidateList()0 b9 a' r$ S" T, B
{
- v5 @, t6 ]) a; j/ x9 c! \5 Y! S    if(m_lpCandList)
6 v5 @% P8 u" |( x% `" l    {( L) B: r5 s1 A' u4 G# a
       delete m_lpCandList;
# {( U# U. t+ A, H0 c2 Z2 {        m_lpCandList = NULL;
9 z2 }5 Q9 n( g2 i: r    }
( K) u4 M) y& v- G2 d, j    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );
7 U! A8 y% m1 G$ C}3 T* w" U2 X! K$ }/ a) ?/ N

6 v( D5 H9 G0 C+ P; I& i! V+ I( Q' C4 Q& C3 \6 `
LPSTR CIM::GetCurInputLanguageDesc()
% X/ x, \- c+ t* h{
2 d5 y8 n( H8 |4 c9 C    HKL hKL = GetKeyboardLayout(0);
. q+ t/ o. F; K1 _& s* N
" Z! K0 r% i/ H# N% V+ ?- u! R    if( m_lpszCurInputLanguageDesc != NULL )* {  L9 {) [/ q9 p) |
       CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^, k2 h6 X+ y) r
3 f' U5 U% }1 x
   int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度
) U$ O+ y( C2 J1 _9 O$ p9 Z. j
& s' e. X$ B) @+ D  v! l    CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
7 F0 G' O4 N5 d! ~$ Y/ b! y. w, x! w, o- D' p, Y7 G5 R8 [1 A' M+ b
   if( lengh )/ Y) q- y( o3 y" Y! T
   {
" L1 t, c0 c0 x        ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);
4 _' R( C: P1 f    }
  h3 ]+ @* B0 T; v0 _    else
$ x* F3 G+ P% e. ?6 J6 Q4 E    {$ W4 U% q: M# _; }
       strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );
# W8 \* N' d9 D# ^: w- C    }  }0 t6 ^0 c6 l; C( Y) J% G

. N5 ?3 g5 V% ], G+ W    return m_lpszCurInputLanguageDesc;
+ x4 N; C) y* k: e- R' ?, l}) C, M0 @9 q) F$ h5 q
- O4 ?* ?0 G$ h9 f3 ?) t' g3 U8 l
void CIM::UpdateShow()! K; z# b6 u; U
{
; e0 X: }2 W2 X9 o' i( L4 ]1 x    POINT pt;! u! W0 p4 _* W( V8 R
   pt.y = 450;
7 ~" x$ e& K$ U( {( o    pt.x = 400; ; n& K: k: x/ ~# T& l
   ttffont.SetSurface( DD_GetBackScreen() );
6 T" ~! Y, D0 e" p    ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述9 o4 l( t- o) Z2 |/ X$ I

+ E3 R# G" s% R  ~    pt.y = 420;
% f: Z8 A# i9 i    pt.x = 20;. p2 [3 J6 w( G1 V, A7 x; ~
   ttffont.ShowText( m_cCandidateList,&pt );
' @# p1 _+ X$ i/ `3 K' H( a; a/ {5 @3 N3 E) s9 Y, W' _& L/ g
   pt.y = 450;
# W0 Q* `* V2 ?$ O  N    pt.x = 20;, D. {- |' @5 t- ~( z
   if( *m_lpszImeInput == '\0' ); N5 `/ K" @( M3 d( [* {
       return;/ @7 Q7 C9 |+ p& n$ J3 X

: D2 e# x( S' U& g    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字
6 O  G3 d0 W, B' d  B* z}
' f7 _% A" ~0 b
& ?" b: Q) P% f  z" U- {, ALPSTR CIM::GetResultString()5 Q" X& s' G  }; u5 u
{* A# e  F. [5 _7 O* @
   return m_lpszImeInput;, C' N3 X+ A: Y! \
}5 [, U- n/ o9 \# b; {% q. \

6 A" [7 t& B! `( r2 MBOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
0 O# t2 Y$ W* I{
4 ?2 \: q: T, u  o4 U. B6 `    if( !m_lpCandList )
1 \2 @8 X; E3 ?. m  H3 E; k4 o! O% s        return FALSE;
. R* i. b" {& p7 m$ Z; _
3 ^2 \! {; k6 \" ]- i, R+ S# F    if( m_lpCandList->dwCount>0 )
) w8 k; n3 U+ ], z5 g- U9 V    {, X: ]& d6 w; f8 d9 L/ C
       LPDWORD lpdwOffset;8 i0 V2 V( ~9 J* o
3 k& H& g3 I' ]6 _1 F7 D& w
       lpdwOffset = &m_lpCandList->dwOffset[0];0 ?, l0 ^9 T* F$ ~9 N. j" c$ L

% }* H% _0 b$ R. e. m/ o5 j9 ?( x        lpdwOffset += m_lpCandList->dwPageStart;
* z, R( o0 R. v, \  Q: J0 W
( [0 \0 Z* b0 X2 M1 y! W        ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );
+ G6 E& y5 z4 J( ^# f. `
2 p8 f. A% g1 O" c/ W' J        DWORD z=1;6 Z. e* K- m7 y; [) `' l
       for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++)
) D( X4 G6 V# L& u        {
' l) C5 G$ }4 _: A# H            LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;
* ?& m. F  e" g1 }- Z            char buf[255];% Q9 z+ `  y" L; k3 z
           sprintf( buf,"%d.%s",z,lpstr );, Y" S. n7 r1 k7 w; e
           strcat( m_cCandidateList,buf );0 J. K- H  N7 O
           z++;
; r* M0 S% r7 h9 }7 d" l5 _        }
  O- A% ?& S& O% z( P: }* R" A; J6 J; I+ A/ P9 d4 R
       return TRUE;/ Q: W7 A5 U7 c8 O% b- j8 f; S( x# p
   }/ z" B7 D4 z9 z2 M; z
; p  S7 t2 X* }# E
   return FALSE;
; p( e0 d' k4 }% Q7 F! [! U}
3 p  r/ ]: H& \# e
& w  r( y8 n( t7 c( n! d* n$ q. U- uBOOL CIM::ImeIsOpen()
: n( y9 @0 X& B2 L{8 T$ m0 N6 |0 W6 T" a6 _! m
   return ImmIsIME( GetKeyboardLayout(0) );9 j- Q+ z2 f8 U* B) R
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 20:12 , Processed in 0.018251 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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