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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//
4 K# a; F' a- X" p8 I, Y9 T8 o$ Y& `& h//
4 v8 X+ v9 J4 G' V- Z! Y// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家) P0 N: q+ J8 @
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
/ L3 C0 R/ @2 g0 @. R* z// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net7 s7 ?% \3 p$ ]: |* A
// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT
3 b/ w  t) t" s( c8 D8 `// 为显示信息用,可以用其他方法替换如 TxtOut() 等: F& r. C. }! J0 t+ L4 G
//
* ^* F. _0 Y( ^/ p% i: M//******************************************************************//% L( a7 a* r: Y+ R8 |9 F! e
5 O5 s5 J, j/ d: ?/ m
//////////////////////////////////////////////////////////////////////
( U6 Y- k7 `* M: X: N& Q//
0 U% Y, T% @3 T3 r0 `- X, {8 O// IM.h: CIM class (使用系统)输入法类
0 q5 L9 N% S. o// 2001/4/30 Write by Jerry Wang$ o( E5 X; |2 M( _% o# S
// 感谢大大鱼的帮助
# Z* M% M6 A: k$ S7 Z// Need Lib: imm32.lib4 b; E# A+ G4 n! i5 I5 Y
//9 ?2 T: a2 E! i/ ~" [* ^8 ]
//////////////////////////////////////////////////////////////////////5 r: G" R$ `- Y/ }( u% [3 L# o+ S

' K1 K% G# y/ @#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
5 h* ~+ }1 T$ D8 @1 S( [#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_
0 N4 N! m: C/ L4 ?& v7 @7 Z. n: n" ^! e. d
#if _MSC_VER > 1000+ Y) j' w) c! C
#pragma once
& O6 u+ a- V4 x#endif // _MSC_VER > 10007 p( Q! h6 ^+ |& q$ j# I* b' Y

' N" _4 Z$ p% _4 ]2 [- V#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数4 E: ], ^& u: t5 B( O, m5 W/ C
/ }. z1 d* Q1 ?' c# y  d) X
#include "FindMe.h". N( D  V: H/ o/ M
* l! m1 O. M% H6 ~
class CIM
# a- W( _: x' {+ \  w. e/ ]{
1 P% l/ A2 t1 r0 e( A. Fprivate:  V& T+ ~) q6 N) E2 U
   CTTFFont ttffont;                    //显示信息% A& h8 z; J. A6 f/ X
   LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表4 J! {& J& {( U- @; C- D: V
   LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针
0 Z; @6 W2 |7 n4 L. S% t( Y' z    LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针( D/ a& ^6 H$ U& r
   char m_cCandidateList[255];          //候选文字列表缓冲区: \) |1 O9 c. G. m. m
   char m_cInput[64];                   //输入的字母& j/ J) C# x; r
: c; L% m( y( n. T' {$ |
   BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串* F) [5 I0 _' X* D

$ q( }1 b2 z) R% K/ V# @5 e' Apublic:
# |3 v7 T6 L6 g& g8 f! t* P1 }. \( X* z0 e* D
   CIM();& x5 F+ f: m/ I7 {$ ]
   virtual ~CIM();
7 o; A5 g( H+ m
' O* E1 P$ w% r+ N    LPSTR GetResultString( void );                     //取得输入的字符串
5 h! ~& l1 r6 C9 N( Y9 l7 ?; e* \
   void UpdateShow( );                                //显示输入法信息, {4 H+ x0 w+ }. y3 O* }
6 g1 P8 M5 C/ i$ ^
   LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述
4 D# P$ A# t) t1 T# Q% X    void ClearCandidateList( void );                   //清除输入法文字候选列表
/ W* f1 c7 j/ h+ q5 _' u' m3 ?    BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表
; P* [& H- D( Y$ S" g# ^    BOOL ImeIsOpen( void );                            //输入法是否打开
5 U$ _/ g6 P# Q& J    void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息+ B( o7 I; l7 c( k) v. n8 `. B3 U. X
   void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
3 {) T2 r1 H% f+ E% {, R- \# P. T    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
+ _, n$ o& ~" l};
- o, I" F2 `# a1 u2 M8 f" _+ @/ V7 x
#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
6 l' f0 R6 @8 F. |6 y3 V: s# Z' P: b  K

1 _/ |6 Z) N0 L- X* K$ s- ~& }3 P  W$ y
//*********************************************************************************************//7 G" }/ H& F* ^: j! ?1 z
6 O& U- w4 B7 V2 x& _5 p+ w7 j! Y
//////////////////////////////////////////////////////////////////////" R7 G4 o& x! \& x" G. X( g% V
/// z+ }) \( G! D9 B; \
// IM.cpp: CIM class (使用系统)输入法类
# k& o! U1 ?4 N$ W// 2001/4/30 Write by Jerry Wang
! @- o6 s8 w+ k& A) j% ^// 感谢大大鱼的帮助; F/ O1 p: F  r4 U# Y# D
// Need Lib: imm32.lib
. w8 [9 m" C& j2 V//& Q( X" d' C4 R- Q
//////////////////////////////////////////////////////////////////////$ ?, C; @1 l4 q9 C8 V; d7 [
2 r. x  h/ R: E: T$ V% h
#include "imm.h"; m) M4 R3 [% H! H/ U" T2 s
* S; S) f, M! {) s% \9 i9 b3 l
//////////////////////////////////////////////////////////////////////& `  t/ L4 H6 p3 B3 \2 _7 _6 f, z
// Construction/Destruction$ U! v8 M  [8 i* t/ N& J3 T' @
//////////////////////////////////////////////////////////////////////
# J0 i  G: b9 z% h; Q
3 X/ M4 `7 o+ m9 d8 X* a2 vCIM::CIM()5 i, H- C/ E- q
{1 D* r8 a1 o' @5 o, ?8 K  K- k
   m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];6 l+ \9 P8 t5 S6 ]! {! X* W. l
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );$ |# {. Z: |8 j/ U# \, }
   *m_lpszImeInput = '\0';( q( U0 T0 g7 w8 S. s  c: k
   *m_cInput = '\0';
  T! Y/ p3 U4 v! t8 `: B0 l5 _) f) K+ b- v
   ttffont.Create( "黑体",15,RGB(255,255,255) );
& y0 v7 ^/ I7 I; [7 R3 e    GetCurInputLanguageDesc();
' ~1 g; P) t: {9 g1 w  [; o( Q}6 W' Z5 q! O, e' H

' T( B8 i% G5 e9 M" N& P3 gCIM::~CIM()
$ D0 L! _. \! G# e) l2 h{3 j; C9 I" f4 z
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );( }+ S- o2 `2 }; Q! q

" I8 v, d" Q- R. O5 Y6 }    CHKB( delete m_lpszImeInput );
6 R, j2 f& l/ X! _    if( m_lpszCurInputLanguageDesc != NULL )
; Y7 J' u. O8 a        CHKB( delete m_lpszCurInputLanguageDesc );
% }& y* m& k3 c}
0 |8 X* B8 g) }" R) _
" N# L: M4 h& r4 ?5 E' v' Uvoid CIM::OnImeComposition(HWND hWnd, LPARAM lParam)' [* |, y4 J+ L
{9 b: B. V: z9 t' f( w4 g( T* M
   if (lParam & GCS_RESULTSTR)
4 L4 H9 `4 L. X3 I6 G+ N% D    {, K! m- `: y- i) [% G: N9 a
       HIMC hIMC; //输入设备上下文9 G1 I8 ?/ v, R: u
       DWORD dwLen;  M. R# {. {/ `
       LPSTR lpResultStr;5 Q% ]+ w3 ?& E% @9 G4 {

7 V7 U0 U/ t, h# H# x        hIMC = ImmGetContext(hWnd); //取得输入上下文
2 D0 C+ n. b  C) i( P: j7 ~& O1 `
       if (!hIMC)
5 |8 q( L, {& `  F$ Z6 H            return;4 R) M8 |4 W; P4 }- z  `
: ~6 M( Z) m; w5 x: y/ s5 R0 ]
       dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
4 d$ f. L8 \7 v6 \& _( a        dwLen+=1;
  x# U* A" m0 B6 a1 U4 l
0 ]" M9 ^- k6 g        if(dwLen)
! Y$ ?2 G4 O5 S        {3 M% i5 }- N- o( O
           lpResultStr = new char[ dwLen ];
* K5 k% c8 _5 s
% Q; z9 ~" h  ?$ U- M6 P/ _4 H            //// 缓冲区已经满了
, P) w. l4 M) M5 ~            if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )
& k9 K/ G, _6 U* J            {) C  ~1 O7 S- `/ q
               MessageBeep( 0 );- i" x9 H5 W) z& L+ f0 n4 k, y! B
               return;
3 |# d7 m% A2 J! U9 g! }3 y            }
0 D# s/ u8 k2 |: |            ZeroMemory( lpResultStr ,dwLen );
, I4 g! R  s& Y' D# D5 E. F/ S            if (lpResultStr)' ^4 D$ U" I% Q2 d- R
           {8 S4 j8 {" m( T6 V& M6 f' s5 z
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);6 O, W8 l2 T& z! T! ^8 L+ L* f/ k9 }
               strcat( m_lpszImeInput,lpResultStr );, Y1 V3 E9 R9 v+ v+ |6 H3 @
           }, u; d* Z- t) J% M8 c7 X
           delete lpResultStr;
6 G2 g) s# k2 F: x4 I6 i        }
; D9 `' [2 y6 O( |
6 E& n) ^5 ~8 ?/ A' A( T        ImmReleaseContext(hWnd,hIMC); //释放输入上下文- Z+ a/ R8 X+ h* }* d  u
   }3 n0 ~$ V6 q0 n  P8 [, r& m

) z: x( s: m; C) a1 `- d}
6 D0 {5 U" H1 c% y* ?- \8 `
6 g0 c( H, ~5 Y7 I  D& d7 m* \void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
. M3 v/ S& [0 f1 c+ V( g5 A& n& f{
$ |: A6 m% @, w% }; n    DWORD dwCommand = (DWORD) wParam;# C& _* J' B* E7 P
   switch( dwCommand )6 a7 Y7 |: R( }; K4 l
   {
( e$ Y8 m9 }' Y" b6 _* V    case IMN_CHANGECANDIDATE:5 F0 O0 \: ^9 o+ s0 U2 Y
       GetCandidateList( hWnd );% p$ ~) t) y- R. n
       break;% S# z6 B9 n) H: g

! I6 J! g$ {# U; V    case IMN_CLOSECANDIDATE:
+ Y& H. z7 g4 _  b* T1 s3 _/ b        ClearCandidateList();# ?# `7 G0 A( H, g8 w, ?
       break;
/ _: a  X  _3 B! \2 {! j5 U
; J( W6 S  }6 V% Y: y7 u, u    case IMN_OPENCANDIDATE:
2 z$ e( f9 `4 S5 q: U        GetCandidateList( hWnd );$ @2 T2 M) T/ `* I% [  a
       break;
3 S+ V3 X/ n0 }7 _    }. Y, ~$ W' V& d* P+ n
}
5 I8 y3 Q2 y+ {9 h- b$ @2 `; A/ Y5 N3 E1 Z1 E
void CIM::OnChar( TCHAR ch ): c' w# i8 q9 i) {) X7 S
{9 h' ]! R6 R* z" i6 R
   int len = strlen( m_lpszImeInput );0 y! g. P/ r! C5 S( X# L
0 \/ M3 n3 T1 _9 t" {8 `# o
   if( ImeIsOpen() ) //输入法打开状态6 ^( v6 ^, m0 ~$ y4 v. |
   {
! ^/ x) T- Q6 O9 n  I) M/ G4 Z
  B: Y9 ?% b5 f0 g. T    }, i8 Q; j; S( }8 O- V7 f
   else //输入法关闭状态
- u, @/ m* f4 B    {
; H9 {" D- ]+ z0 v# t        if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母( @* b5 ~- M/ t7 Z  n4 Y
       {
2 j# T: k. R% M( m6 m; c* q: V) D5 R            *( m_lpszImeInput + len ) = ch;: q5 d2 W8 R# n' [/ c7 R7 K
           *( m_lpszImeInput + len + 1) = '\0';
4 n: Y6 i  n8 F+ T        }8 p) n8 `' `7 L* K
   }6 \( L1 B' a, M# _- f
, a3 U1 f, N% l- Q1 v/ }; f
   if( ch == 8 ) //BackSpace字符3 S% Z& Q  [' o/ m- S6 n. n0 c
   {
7 B4 @. }- `) E! p. l8 A        if( len == 0 ) //字符串长度为零: A2 U9 p7 n; c; ~+ n
           return;
0 T  D3 H" Q2 C* c4 A
- q* T6 D; y) I7 g  p! m        if( len == 1 ) //只有一个字符
0 v+ {$ d6 u) b- p        {
( t% [/ g& _' h" Q% P( s& i            *m_lpszImeInput = '\0';
1 H; p3 p4 _8 [- _/ I/ [            return;
/ |4 \$ A  L/ X$ W        }$ p) K" `, F5 c

' W% T  }5 I2 T* P6 m; }; Q" t8 w& l        BYTE cc1,cc2;" X. }5 F/ x7 x( L
       cc1 = *(m_lpszImeInput + len -1); //分离字节" L! [7 L2 ~5 K7 J2 R3 x' V
       cc2 = *(m_lpszImeInput + len -2);
: Z' X, L/ Q' {/ J3 t) R% s* L6 M/ `. n' w0 \' N$ K  j. K
       if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
, C4 w+ t4 `# N            *( m_lpszImeInput + len -2 ) = '\0';7 x/ {2 S0 f# G: \7 U
       else //是英文字符(单字节)
2 `# z- t9 f0 Y0 v- u1 o) H- J# |3 V            *( m_lpszImeInput + len -1 ) = '\0';2 V" a6 x3 v* `1 C9 }3 K2 Z6 W3 Y
   }. O6 m4 {* _9 h3 }& A
}" `/ ?, }* Z+ U1 [) L" {6 j

& Z! J: X& r% y' a/ {& S+ n% ?+ mBOOL CIM::GetCandidateList(HWND hWnd)& f9 Y3 g! I9 p) |$ F% I" V
{
- D" e7 A  A- T6 u7 r    DWORD dwSize; : r7 J+ ~& A$ O& h  z- t  L# \
   HIMC hIMC;
5 O3 v8 t0 U+ S& Q1 o( d4 y6 m- T# [, U  n
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );- i3 n8 d; j7 ^4 Y
) W1 W( W. g' c/ ~  h: |) C
   if( m_lpCandList )
  a& M; r' C4 d5 g. F2 z4 e& o5 M    {
+ j- H4 {' g5 p% t$ s        delete m_lpCandList;
0 x5 {0 F" {3 P# N* F( S        m_lpCandList = NULL;
2 W% ?4 N; l* V% z# |4 e+ X" ^0 T  C    }" M% g4 k$ e( f( x0 y
" ]% z1 v; V: |4 k
   if( GetKeyboardLayout(0)==0 ), I" L" \, G6 ^* G" F  l% _
   {
! F0 H. e7 |% J; x        return FALSE;
" s+ F2 f6 Q' i+ j    }
, J6 j) w. S$ Y* p4 E8 x/ c- t4 Q
8 }  z2 I" }. w# X- M/ v    hIMC = ImmGetContext(hWnd); //取得输入上下文
- V* ~+ |7 Z: Q" O: T    if(hIMC == NULL)
& \6 C  z- a+ _* x, S* D    {) }$ j, }( g2 T  l2 }
       return FALSE;) `$ i  a+ Q: J* A4 q
   }& X$ U* D1 V, s" z9 ?% R; L

: L9 S6 S* C$ F( a    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
5 {" _4 i9 o7 I2 z" N+ D( p    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
( T% B" w$ J3 O0 {5 z    {  S( j, M( u, {, n" {
       m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
) R2 `# m2 E) @: b4 w, `        if(m_lpCandList)9 J2 c( b' h7 g. V
       {3 B) X+ d  U. n% h0 w$ i9 {, n& b
           ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);
4 c3 V4 a1 U, p2 c            CandidateToString(m_lpCandList);7 E: g2 d- y  H- z2 B# K
       }
2 e5 ~# f( M/ f' e    }
7 X7 u! T) R2 m/ l2 E0 ?4 I( T, e& o. V; T. a: n2 Z
   ImmReleaseContext(hWnd,hIMC);# D" j& W" @; U6 ~6 o4 E8 b/ I* Y4 S  H
! J2 `( x: ?8 O5 {& H- @6 B  L+ }+ p
   return TRUE;
& }, ?; o. a6 P" s}/ z, ~9 Q; U  t/ K, ]; D* N' W' X

  q; n0 o9 \$ Cvoid CIM::ClearCandidateList()
  O+ ~8 d" L3 X4 }- F{& B2 a: m5 W* ~/ n0 l/ Z
   if(m_lpCandList). n0 K3 ^5 R% C  e0 |
   {
' Q, \0 Q: a! a        delete m_lpCandList;  ]* L. M$ L, c* g& t/ J0 {3 Y
       m_lpCandList = NULL;4 T" O- Y3 t5 J
   }
+ o, K$ A1 a1 @' q1 p7 P1 Q& t( e( k6 o    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );
! l# b' C7 a$ o" ?4 X}
5 d; Q6 P# f6 g; S% d
# w# |+ o* t$ r: V% g" U* i. a6 Z" ?3 Z$ I
LPSTR CIM::GetCurInputLanguageDesc()) W: l" R# a' j8 A
{/ H; G- [9 D, R/ T6 K) c
   HKL hKL = GetKeyboardLayout(0); / R4 L/ f: n& t

& o4 W% k3 i( I/ P& a+ P    if( m_lpszCurInputLanguageDesc != NULL )0 \: ~4 \& ~8 l& M, y( P
       CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^$ J9 c2 o9 T- b1 C, s  y, W
' g+ v8 Z/ c5 t) p- b
   int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度
# x; x$ f' k- T0 Z# `
3 L5 G$ m2 m' Q- k7 v1 Z    CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
/ o# c$ R3 [4 B. K9 J( J& s! F& e# ?2 e% R& \! L
   if( lengh )
& y! ?) A0 m( T5 v9 j    {
1 V5 Y( [" u8 ?# o- N        ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);: [% L. j4 K1 Z% k
   }, ?4 Z, c$ @& U7 V. t
   else
* f1 F) z' |. e0 m    {
* S) f; B3 j6 t; l& I        strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );
5 K& N1 R! s. q. c6 v6 a' ^    }; v( y& l9 ~; M* ]
6 T; x# B1 |, y
   return m_lpszCurInputLanguageDesc;  u) v) r3 M9 c# {* R# V* K( ^
}
3 n# t+ e/ r% |+ D9 I+ Q8 ^) N* k$ w, P: N% V
void CIM::UpdateShow()
% Q* [% s+ I) f" D1 Q5 k% {{( G  A2 x2 ~, Q/ |0 Q- ^* N' h
   POINT pt;
3 m/ n& v, C$ P* D    pt.y = 450;. D& Z3 k% b& N3 y0 M
   pt.x = 400;
  r; F5 _' c) b9 g7 A0 |    ttffont.SetSurface( DD_GetBackScreen() );
3 |& l7 \6 v9 Y; S: _8 I    ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述2 r* U, X4 Z4 |. T
3 F. [1 D8 q+ B$ p, j4 g
   pt.y = 420;
3 T5 t3 ?" o" @5 J% y) F/ x* O    pt.x = 20;
& D! n) I, O1 x1 m0 ^. z2 d6 D    ttffont.ShowText( m_cCandidateList,&pt );" o  G7 k  x# M$ i/ q

1 H" X* v; Q) j0 ?9 u3 x    pt.y = 450;
9 R, \/ n6 j5 E8 q. F. |! R    pt.x = 20;
' Z& }# b( p3 S. E/ I5 k    if( *m_lpszImeInput == '\0' )% |) j6 g/ q  E0 i& r9 r
       return;
! K; f* Q0 t2 x( J/ `) r7 s4 U
/ r- C0 L6 U) R7 y5 f1 k4 h$ ^! f    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字
, X5 I: L* h+ z# j}
: P8 B' S3 b  g$ e9 x
1 I7 l7 _: A6 h: j$ z. I/ w% mLPSTR CIM::GetResultString()! {6 m! o) p% b: F+ ^
{
) j1 E1 J# r# ]+ K+ w: {    return m_lpszImeInput;
. w: C. h7 O- S}2 Y! H# f' H, m+ u" ]

' {4 s+ d# ~; z5 H' P" eBOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
7 t) M+ \' P0 g+ J# l{3 q7 I. J" d) z' F. _
   if( !m_lpCandList )
* `8 p& M$ T" ?4 Y3 c  \# _        return FALSE;
& \; {7 c3 V- t+ e: g$ @- j- y# v! m6 n0 `, y5 [. O# Q5 n# g
   if( m_lpCandList->dwCount>0 )2 h$ y8 h; i) T# H7 h4 [
   {& S6 ]  X/ S  Y( @8 f; N
       LPDWORD lpdwOffset;
+ A( W3 U: O* p% h" {4 N3 @& @
: g$ i- z& }( ?4 R6 {6 _        lpdwOffset = &m_lpCandList->dwOffset[0];
* L, k9 o# E; a& L% m# P( S2 P7 ~* ]. C( g6 z/ o3 M
       lpdwOffset += m_lpCandList->dwPageStart;8 I6 b! R# q  k1 d' Y2 @
8 l$ }1 H9 i' j
       ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );0 S+ g% ?, z9 I
1 }/ X5 [0 J- L' `6 T4 b
       DWORD z=1;! }9 C9 A7 M- S8 w
       for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) 3 l4 w+ O+ v9 ~5 u& u. _& R0 B
       { ) v) P2 {$ e9 r* ^' @% u" Q3 O
           LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;3 N. K& m3 }4 l- q- M
           char buf[255];+ a, N% j# }4 a! \$ J' W
           sprintf( buf,"%d.%s",z,lpstr );
4 n$ G4 v- W/ E7 t+ {. g            strcat( m_cCandidateList,buf );
# ]+ o8 `( o; a) s+ r9 Q            z++;
# S+ Q% e  Z' ?9 |* E        }6 t9 @1 E  g- T) f$ c
9 U2 N  T9 y- z; f7 \% Z
       return TRUE;
4 ^- D$ w% L) u2 u) M/ _6 h    }$ z0 s6 C3 ?: J- i7 P0 |% o
0 t9 T- f: J3 V; S7 Y, {9 g( F; k
   return FALSE;- v2 v0 Z) T& P% S  e+ o" y9 g
}
, L+ O) j0 g0 Q' S* Q
. z! K0 s, r4 }3 [! e  o0 TBOOL CIM::ImeIsOpen()- C+ _4 A, K8 h! x7 O
{
3 n8 a) P3 N9 B- K: D    return ImmIsIME( GetKeyboardLayout(0) );$ i9 D2 w$ o* w2 T/ ], x- e
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 01:43 , Processed in 0.035367 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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