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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//
& _! c+ }7 Q& \% Q; X: \//: i* R2 G( V9 @3 y& P* u
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家7 D8 X2 O2 f9 O4 N/ ^5 |
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)2 c$ b# p5 n( B# ?
// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
- O4 M2 e2 v0 a6 U8 J' |// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT% ]4 z4 J8 d# I/ S4 r
// 为显示信息用,可以用其他方法替换如 TxtOut() 等. r# a( b4 {+ ]+ m' z
//
+ T  `, ]8 i  a' h: |* r% R% S//******************************************************************//
$ T# C4 b+ f4 M; o! w# m% E3 }7 @' l, f+ d- E- s
//////////////////////////////////////////////////////////////////////
8 T# W( ^  H( o( A; x- G/ n//
- U$ w, y& c1 ?) @3 S3 Q/ {5 [$ m. J// IM.h: CIM class (使用系统)输入法类7 J' `/ n+ x. D- D% ]& ]- S+ {% h
// 2001/4/30 Write by Jerry Wang
) |! _; T! Q5 C/ P// 感谢大大鱼的帮助; b3 D$ b' U. P* O" ]7 p6 L4 h, I
// Need Lib: imm32.lib8 u7 D* E3 `4 e+ k
//  D& z1 y& X4 ?. e8 k* L& T, _
//////////////////////////////////////////////////////////////////////
( l1 C0 ^% e/ d. p: U" c" S) y7 L" {, b; N, L
#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)8 h; E$ Y$ a$ _5 w0 ]  L# O
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_6 N& @* H; D/ A* I6 b7 E

3 B" x" r2 ^- v- I#if _MSC_VER > 1000, H! J. Z/ F( f) U6 [( }0 X7 ]* S( Z5 v
#pragma once( S, Q2 H; h+ i
#endif // _MSC_VER > 1000
: Z! t- E. c1 |' e4 h4 v
) \- c  T4 M( ?* d#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数
- r  V* ^+ p* n
# [, h# [. V/ Q  P" H3 h4 o6 t7 m#include "FindMe.h"$ w) T! h* I0 s+ R

# r$ b( W  B# X# o& f/ f  iclass CIM * K0 w* |: y; T' {5 U- P! g
{
' _2 I3 v& e1 f; Z* dprivate:9 H4 u! ?; E* U3 d
   CTTFFont ttffont;                    //显示信息
  r. I5 ]: A1 J$ z8 B. T8 Q    LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表
- C. h$ V2 G. J) ^: b    LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针
4 d; ?: K: Z1 G  H: i# K    LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针  _, R; C, k# @, L2 f" j
   char m_cCandidateList[255];          //候选文字列表缓冲区7 A+ d# c8 J0 y/ W' v/ |, t
   char m_cInput[64];                   //输入的字母9 r- k# O0 M; p/ w- X

! H" p: M( M- Q: O2 Z    BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串
$ E  P9 }% D7 J8 N/ X) C- t' ]% u. e* w" u6 y( Z/ K
public:% ^# K/ e; Y/ B2 [3 h0 I6 q

6 b$ L& A' P' z+ Y5 |" F: z    CIM();7 z, Y/ \2 f- y- ^/ P3 M9 U
   virtual ~CIM();
* ~8 S1 L8 w! D. f
  ~+ S& G; _, t    LPSTR GetResultString( void );                     //取得输入的字符串9 f: G) J- C( O& f
* G/ I8 I$ D: e5 c1 f# r* L& W
   void UpdateShow( );                                //显示输入法信息
7 [5 l* x6 t  W, z* B# [$ `+ c' a) r: Z& n
   LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述
& d9 v' c8 p* Y1 d- x1 Y8 l" ]7 ~% H7 m    void ClearCandidateList( void );                   //清除输入法文字候选列表& N& F* |# v9 E- q* d8 |/ _% ~5 F  U9 \
   BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表
6 K" Q* _3 \8 n) p    BOOL ImeIsOpen( void );                            //输入法是否打开
1 w( V" R* ], G- F( ?* |- L    void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息
% T0 m3 \4 i$ k    void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
( q% y, H2 k+ b, }* `3 a+ c    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
  ]  @: ^% z  q! S& i( v( H};( e, A, C5 z0 n- }
. o- O$ B0 v5 g1 a5 u) k
#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)4 s/ H7 K; ]' O& a# [
$ J& n5 o6 V4 D. t6 d. H

& e5 R7 [$ e+ m9 @6 l
- P3 R7 C9 W4 x//*********************************************************************************************//* O) N/ E1 `! [1 m& o: r
; Q9 ^" h3 S; v) \5 ^. I
//////////////////////////////////////////////////////////////////////
  X3 u% ^# ]+ {/ F+ @//( H. H4 {2 e1 F# L4 v3 V$ M
// IM.cpp: CIM class (使用系统)输入法类% M* V, E5 t& @; u" F  B" {. t9 s
// 2001/4/30 Write by Jerry Wang1 n, Y6 E/ r& v
// 感谢大大鱼的帮助
* |' @  s% k7 d, g4 N1 j4 _// Need Lib: imm32.lib6 m- d3 p4 R0 q
//
5 |6 l* f0 A2 A/ b# o! ^2 n//////////////////////////////////////////////////////////////////////3 f' N) B- H$ k; e! D# a
+ E' l" T# {0 Y0 X( M( r5 c
#include "imm.h"; ]. W* x; H0 [) R
- U6 {1 d4 x% p, G
//////////////////////////////////////////////////////////////////////0 E! K1 v3 J7 O6 m) E0 Q
// Construction/Destruction
' R" y' t3 ~, {9 F; B//////////////////////////////////////////////////////////////////////
* h" j' B* b9 U
% n7 o; Y  i& W8 Q( ]" L0 xCIM::CIM()* w2 [# e- y4 Q6 x) Y9 `
{; n! g1 u$ p/ F+ \8 S
   m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];
& A% b" d2 k: u0 f    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
( d5 Z; T0 X. b0 ?    *m_lpszImeInput = '\0';/ l/ l! f$ |- [6 y3 N) ?! t7 J
   *m_cInput = '\0';  k7 A, @. q% n3 }. v
, c; B( r  y: q6 `: l+ W; j0 {
   ttffont.Create( "黑体",15,RGB(255,255,255) );
; R/ A5 t" D  |& ~    GetCurInputLanguageDesc();0 M; Z' W, N, X8 q; ]4 y) h
}5 S: Y0 U* c6 D1 O: ]
5 ]4 P% u& k& H- x4 k8 c, T
CIM::~CIM()
- h8 @! D* x  w5 |3 d$ o! L) _4 A) u{5 e& ~5 ~. N  P0 a3 \/ r. }
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );; y3 E" X' U* _- g/ e: B
7 y: t4 o$ g7 ~" o. }( K4 `
   CHKB( delete m_lpszImeInput );
7 J7 w( v. C' {& q9 W% c1 L3 O4 D6 _! X    if( m_lpszCurInputLanguageDesc != NULL )8 r2 H. j, C2 x2 r: w  \
       CHKB( delete m_lpszCurInputLanguageDesc );
. s- k5 V5 E/ {7 p}
+ j. T' Y+ T6 l- ?( t" l/ q& \+ P. M9 n8 @2 t3 R
void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
# G7 a: _$ `1 I/ B5 {{6 F- G$ q9 q) G, Q+ s% o  F
   if (lParam & GCS_RESULTSTR)$ u9 c. v$ g+ c8 J( z' Z
   {
/ F' g) e( I9 G) {: C        HIMC hIMC; //输入设备上下文% D9 o) b1 z9 w& k) \
       DWORD dwLen;
) @1 U( V; ~) k# X& v% E  v- {        LPSTR lpResultStr;
6 L, g! Q8 N( w& I1 \! P+ G0 R6 T5 z/ s5 l. F0 D( B( v
       hIMC = ImmGetContext(hWnd); //取得输入上下文+ p! d7 m  l) v& S5 N5 n

) l9 _" p# o% `9 Z; C; |        if (!hIMC)! U% ^+ p+ W2 q6 _+ S7 O, b
           return;
4 M9 W* l3 Q' E  O' L) b5 m3 P6 u" [. [+ `
       dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);$ w: ^, h; a* |( I; @# U5 C0 f
       dwLen+=1;
/ L4 W- ?6 H8 n. a' o4 X  Z/ ]8 q& @
, L4 F8 d. C7 }" ^9 h; e+ k+ b        if(dwLen)
1 v* }9 K3 ~1 q        {) U. ?  \3 E% S$ ]5 X. s
           lpResultStr = new char[ dwLen ];* Y, X; d7 Q2 ?
+ T% N3 P/ P. v+ _
           //// 缓冲区已经满了
( _) \1 `% I( f2 i/ A0 z            if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 ); M) d* P2 c( R0 }' Q8 A5 j, q
           {
) h8 ?/ o0 ]3 X: R/ [/ V                MessageBeep( 0 );
* _% h0 n; E+ Z5 ^& b9 \, c% J                return;
7 Q8 \; Q3 A( T; [" F            }- Y: n* E* Y- U/ e3 @
           ZeroMemory( lpResultStr ,dwLen );
! Z( K9 B5 V, T5 Q0 |8 W            if (lpResultStr)
3 e/ u: Z+ K. n! p! g1 I* A' T            {9 r, H( D0 V: J
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);- U; p, ^6 \! R% j8 f2 a4 w8 w
               strcat( m_lpszImeInput,lpResultStr );  c( M# ^6 V2 ?9 d' E& l
           }
/ N* w+ c( d" S0 t2 W+ L1 c            delete lpResultStr;# D  j8 [) r! ~+ @
       }
& m2 C" B6 U9 A6 u* Q) f$ T5 w! `9 f" z; F' m5 d3 }; e- c
       ImmReleaseContext(hWnd,hIMC); //释放输入上下文
/ y2 q% F, l" x/ f    }
! d& z: B5 E+ t6 a; H" ?
+ z5 f. S( J0 c, S6 @- ?- z/ Q( k}# P: g4 u) O. D- w* b+ `
% {9 T3 U! U8 Y' b/ j& h
void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
  }& h: a6 f8 l{
2 v8 `+ V8 ^- e) Q) l    DWORD dwCommand = (DWORD) wParam;# h3 Y7 V! _/ b5 c! c+ G" u+ e9 u, Z
   switch( dwCommand )
+ P4 U( _- i( t3 _6 r# b    {" G. h- l' ~. p! {, Q1 v. Q. e0 u
   case IMN_CHANGECANDIDATE:
$ U% E, I) N, Y( J        GetCandidateList( hWnd );! n( z. F7 ]+ Y' S7 J
       break;: C! q2 C' I7 U
3 i" h, g( ^7 R# \
   case IMN_CLOSECANDIDATE:
& ~; r+ ~0 Q  X5 E; V        ClearCandidateList();4 C6 G. V/ [6 ~4 n8 `0 ?
       break;
4 d( u- B. P. x) y( f/ W8 q, M+ z
   case IMN_OPENCANDIDATE:
0 l3 q: R3 C/ X  d# `        GetCandidateList( hWnd );
, y3 |/ n7 c- W  C* l        break;
& a1 m* K' O0 P" s( S! J( K6 K    }
4 Q( O5 `8 _' e0 C9 l}& e2 a' L- S+ h2 p

* h2 K" Z% B& J7 S+ w1 |void CIM::OnChar( TCHAR ch )
3 b$ g# l) B( S# |9 R3 D{
! Z! U  _  [' k    int len = strlen( m_lpszImeInput );
( a0 m6 c7 s* n( Y% V# L& I  r+ a, s0 e" ~3 b0 V
   if( ImeIsOpen() ) //输入法打开状态5 e- d  n: j9 f# {" G8 \. z
   {5 M4 X2 \6 V8 k' {
& @" \+ a1 i5 j( b7 H
   }
) ^/ {; P# N8 |" n0 T9 R0 f# T    else //输入法关闭状态, u% z) E, j9 s5 D) z( i
   {# [8 D. ?0 N' M6 Z0 ]$ Z2 q0 E( ~$ b
       if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母
$ G; m$ G* K2 }# B. F& Y& N$ _        {
! F  F) |. t. ]' L' p, j            *( m_lpszImeInput + len ) = ch;( g/ V( a( w& E. {5 ^4 i3 c
           *( m_lpszImeInput + len + 1) = '\0';0 J1 Y3 x3 D& m5 x( x. _
       }& s0 K# V, _1 [  }3 X8 e) C6 @6 d
   }5 Y, D# G* Q4 g% {4 f2 t

4 M$ n: j# v. h' {* M    if( ch == 8 ) //BackSpace字符
3 b- O# I$ A5 Q% \    {4 D' V/ G5 d+ w% [9 g8 J
       if( len == 0 ) //字符串长度为零. h. e/ b5 Z7 L2 t* F& R/ }* b
           return;7 I. D+ F) F3 B$ c# z& o6 a" z
* ?- c7 S: K6 `, r' D& M
       if( len == 1 ) //只有一个字符
6 s7 A: L/ B% f* K        {
! B- u3 r6 f5 L. D/ @! ^            *m_lpszImeInput = '\0';
5 W4 h/ N0 @4 P9 G, a2 K; P2 |2 J            return;
. J! V* _8 ~6 A8 X1 J        }& G# Q3 B% ~& ~4 Z# s7 s+ K
0 H4 s% x4 R+ }
       BYTE cc1,cc2;
3 k( S$ ?  d' v; N3 s& m5 S        cc1 = *(m_lpszImeInput + len -1); //分离字节# N+ N9 I6 n' J0 q: Z
       cc2 = *(m_lpszImeInput + len -2);2 ^/ M+ W; G$ w, ]

4 p3 C9 d7 f- Z8 u: L        if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
1 y4 l, I: e) x' _4 @            *( m_lpszImeInput + len -2 ) = '\0';
6 }7 t1 B4 }; |% m1 j$ x        else //是英文字符(单字节)
/ _$ ^. u; D5 G; G6 i% N' F/ h& j            *( m_lpszImeInput + len -1 ) = '\0';
" @8 \" M$ o+ q2 h    }! @- Y! A6 _1 i8 |. K
}
* @( m" W! E6 \3 e9 A0 P0 S
( f* ?% W  ]$ {+ _( KBOOL CIM::GetCandidateList(HWND hWnd)5 B* Q  N/ }! Z2 {9 x% _
{
0 Z& b: `: T# ]4 W    DWORD dwSize; : k% l& I$ R5 @5 f/ M1 G8 @$ D2 i
   HIMC hIMC;8 |" i( Z+ E, r$ w* X) H
  `: b$ p: v  t  F% R6 B( _
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
5 l2 a1 q& ^6 y( G; f* I3 b
7 S) \( U" l. i' ^9 h    if( m_lpCandList )
: J1 N" ]6 O  d    {
9 Q% X) T' z* \9 C* x, t        delete m_lpCandList;
9 C0 q; K% }# L; B" v        m_lpCandList = NULL;
* C7 A3 B) J2 Q& B4 n% T5 t" o& I2 x    }/ [$ N, b, ]. E. f

* L* C+ H* Q1 S7 i2 d$ ^( G+ ]    if( GetKeyboardLayout(0)==0 )  r2 c1 e2 m, j, |+ d. k
   {
. n" K8 }2 m" P        return FALSE;- v5 j+ x1 |  u) U
   }
& [$ D0 _+ `* v/ ~  {% Y$ @9 p  J( g. e* \0 G/ k/ P
   hIMC = ImmGetContext(hWnd); //取得输入上下文& }" E0 f# x4 O: `
   if(hIMC == NULL)7 \8 l3 {! K7 q/ p# n6 b2 e/ {0 U
   {. S- X% O) Q6 Z) _0 B# k
       return FALSE;0 A) N8 [/ }7 J* t; ~
   }
% v* ~" e& J" p0 N5 q0 `% u
5 S6 ^+ Z4 Z3 B6 }, _  R& ]4 U    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );2 a; G- \4 ?0 a; `
   if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
- T, Z4 ~( i% q  U/ D    {$ @/ n, y$ b3 I$ B5 e1 w: v
       m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
: e6 \7 Z1 Z9 w  s        if(m_lpCandList)" N/ P! h- R8 D  V' j! n
       {
) ^& t- S( j1 ]- g, @- L" {            ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);
0 n/ P( L$ `: ~3 L2 F& c* b9 F            CandidateToString(m_lpCandList);3 X! R! y+ a! f: D( l
       }4 D* j; I. q, r! x, |
   }
. `# h! J7 U7 m2 ^6 I- ~! Z1 [7 n8 L' w% J8 f- R  E
   ImmReleaseContext(hWnd,hIMC);
: |3 ?5 d, X! m5 f
/ ?" Q: y# W& q5 W+ J    return TRUE;
+ k( K- @! Q) G% r. G: _* T2 ]}
$ K9 g" q( o  C/ u+ h( b
/ K  W/ r( V% u, }0 Lvoid CIM::ClearCandidateList()' V6 l$ ~# W4 N  b& U; V$ D7 [
{
* V2 ~& P$ B9 e  P    if(m_lpCandList); s, J0 B4 c# a: e6 U. m2 v7 g# d
   {1 y) \. ?# G* M) i
       delete m_lpCandList;
- g2 U" F. ^  z% T$ Y, ^( W        m_lpCandList = NULL;! X# _3 I% v- ?$ C9 t5 d
   }! d6 T, [, N! h+ \2 _8 a
   ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );
+ ]" k3 a: L5 n}8 B6 H2 [4 ]0 S6 f" f8 n2 g
1 v+ K) A4 p4 V9 U
3 x$ k; m1 e0 \4 a( i
LPSTR CIM::GetCurInputLanguageDesc()
$ o9 ]5 h( h" ^9 v{
7 h; w: L1 `+ B4 P/ I    HKL hKL = GetKeyboardLayout(0);
8 `( U  p- U% M; n4 j" u: S: G' r9 z, P4 }
   if( m_lpszCurInputLanguageDesc != NULL )
7 ^1 y* P$ w' W4 ]        CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^
5 U( F/ t$ o$ ]& ]4 V3 x' D$ D
1 P1 R% u0 T1 Y  n. m    int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度. c7 L, W) `0 b+ C5 U3 @8 ^

# K7 Y# a. z! f+ j( y! b' P    CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );6 W8 t! P" L$ Z9 [: J! p' @2 ?

9 Q" w9 C8 N  u& \; L$ x# v1 J+ B    if( lengh )# T8 l1 f+ B/ C
   {5 O: I  Z" Z, u' }$ Y
       ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);
: p$ z7 ^3 {. H: f  @9 l    }  B5 O( d; C2 L
   else
# B& W) o2 r0 \- U- C& l1 K    {
5 K3 \( b# e5 f/ C8 \8 r        strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );
( _5 M, j2 ^8 V7 N- ?, J/ A0 ?6 [    }
+ I( @  r  j; G8 t, Y  K6 M( C
* u* T" r* y: Z0 t# s  C0 z- _    return m_lpszCurInputLanguageDesc;
% Y( |( r# h0 _2 R& c}% _' s9 U: I5 U. Y4 Y) ^8 K9 A

0 m0 e) R3 d  e% A$ V# W7 jvoid CIM::UpdateShow()( o9 K* I7 f; y$ M: M8 n
{
/ I1 E% V. t/ j. U- S# j    POINT pt;, |& M% R6 z4 y: n! f+ R
   pt.y = 450;) ~+ x' C! ]3 U$ d% v- ]/ W  b% E
   pt.x = 400; $ Z- l# }  o# o' i
   ttffont.SetSurface( DD_GetBackScreen() );& ^1 T( O. p, V* x% F
   ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述
/ K( S! l( z. s. f- _/ b* E
2 n' c  P1 l/ ~0 C2 d3 ^    pt.y = 420;2 v% O  ?' p7 r3 O2 {' u( |
   pt.x = 20;  y( `" n3 E# {! v& [
   ttffont.ShowText( m_cCandidateList,&pt );& `' v! C2 }% |- ]; x/ C( M
$ b! {+ X) w" }) m* `8 t) z' q
   pt.y = 450;: I2 L- X  G5 h! ?( H! S, L* c
   pt.x = 20;7 E/ M% F  g6 O! F
   if( *m_lpszImeInput == '\0' )
/ l& D8 ]9 R. j! p6 \0 {        return;) U! b8 Z/ U! _1 v- u' U
2 g7 C! m) J! `; }) g, {8 m
   ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字8 o2 F+ A* l) b6 u9 K& M
}6 ?, c: O# V& _7 q9 j, ?

" F2 a6 R; k8 Y7 \7 RLPSTR CIM::GetResultString()
$ `0 c' O- N- x* f{& K: m9 G. B. T! a
   return m_lpszImeInput;
) D! T3 e5 b  N3 n) s# m}* h( b! n2 B+ @: o0 \# q7 d3 [  Y
* o0 `. W4 T7 s, U  w9 X. q$ g6 P
BOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
7 e& ?- Z" J! P% ~{
3 i* W% O4 O# O  B- ~    if( !m_lpCandList )) }4 `# a, h. i. _# u9 f& k# L
       return FALSE;& @+ m% \# \. q1 M) w
4 h! R$ G5 y1 t- l2 d) r
   if( m_lpCandList->dwCount>0 )9 o+ u" [7 }+ J
   {
+ J3 C* I4 N3 p9 E$ t& B* I- T" p        LPDWORD lpdwOffset;
# R- `- n3 c) W) ~; j9 [
2 B, _! d7 D$ }( D8 m# T7 K7 S; z- o        lpdwOffset = &m_lpCandList->dwOffset[0];1 F7 L0 A; w* J7 `) ?: W+ v6 K

, D7 e# p& N2 r2 D) R! G* O        lpdwOffset += m_lpCandList->dwPageStart;: D4 g" D+ j0 o( O
' g; B$ l2 k5 a: I
       ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );
' @' z) x* H( E& r
- ]5 G( N6 j  @& K" Y6 o        DWORD z=1;/ e& s; a, D( |5 _/ p' B
       for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) ! ~8 w0 Y4 k% H% z) F; ]) X- p4 M
       { . i" }$ i4 a! k. X" B
           LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;4 I9 m' Q: B, i6 `& D/ S) E
           char buf[255];
- w# q9 ~6 O3 |# s# i            sprintf( buf,"%d.%s",z,lpstr );5 A+ l9 D* D- P
           strcat( m_cCandidateList,buf );
  {4 V+ _( Q4 @) u            z++;  ?( y& I; l, s% }$ G
       }* W# u* T# x( [4 g+ P0 o- B
0 @" B5 ~1 g( A; e7 R
       return TRUE;3 W( \2 b& |. H3 p0 X3 ]
   }+ }5 F& q2 u- h1 v( i0 }2 g

: ~' {. b7 D- @6 }0 e    return FALSE;8 b; f& A" c  R! O8 P, d
}/ H) H$ |" Z+ m7 _5 R# K& x+ i$ c
" a: H4 o8 C; P7 W% g
BOOL CIM::ImeIsOpen(), r8 D) M# O, x7 p  ^1 U
{
( b) R/ y$ Q$ G    return ImmIsIME( GetKeyboardLayout(0) );3 C4 d2 D( B# ^, m# z! [# O7 ~. X
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 09:11 , Processed in 0.020200 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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