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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//, F5 N% I6 M) s( b
//1 \5 q3 J  ~2 H! E7 z& V! I* p
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家& o7 m; M# z4 Z$ {: R$ L4 D
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-). ]$ [; R  k0 L, j6 O8 S8 }/ _6 o
// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
. b; K* i" q6 U, }. ]1 m- K// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT3 s) h1 K& d) n) \& \6 @
// 为显示信息用,可以用其他方法替换如 TxtOut() 等9 S2 A. m# x% V- A/ [
//
, N0 D! r6 |8 Y: }8 V//******************************************************************//
- j4 t; ^" p8 _) R8 F$ {  w0 _8 w4 \1 H1 o" a
//////////////////////////////////////////////////////////////////////! n- b) Z9 z( l( ?! D1 L) o' M) C+ t
//  t8 f6 f+ u; }
// IM.h: CIM class (使用系统)输入法类
2 B4 o; J9 X" g# p. M7 K% h// 2001/4/30 Write by Jerry Wang
, y- n/ j/ S2 w" I// 感谢大大鱼的帮助
# p2 U4 ~! u! C! Z# ]6 `2 C- S+ n// Need Lib: imm32.lib: x4 z1 F7 ?0 o
//
5 H; s  n" n& n$ s* B7 Q//////////////////////////////////////////////////////////////////////5 e/ F; @3 |3 W) g! q5 ]/ M$ d
% `% x$ W4 m& |' {" p3 z% m5 J0 }% P
#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
# |. C/ r8 L! N$ H% O3 n6 ?( d#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_+ @! d, o& h" e9 v

' ~* e! ]( g- r) U" ~% a#if _MSC_VER > 1000
$ V" D/ N1 q# e9 v( n* w#pragma once
* y6 O8 ]% ^" v3 C  ]#endif // _MSC_VER > 1000
+ u' @1 G- t% O( U/ L4 K& y8 n+ f6 ]* }
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数
" C5 {! E, \3 r" E
* o) L/ h$ k. i+ \: O, [# Y#include "FindMe.h"
5 V- ^/ h; r* U, H% v. h0 \
9 J" m. }$ m, \/ K$ kclass CIM 8 K: _* J6 J( ]( m0 i2 ]! P3 J
{! w! ~0 I2 ]4 w, y
private:# |+ ?. R) G1 X+ @' V! k
   CTTFFont ttffont;                    //显示信息
6 S& v( ^8 s7 }* z' R    LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表
9 d$ Q: R! {% Z3 |1 }    LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针
" z8 b: Q  H' |  Y9 r  r    LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针
7 b% \9 N; k0 }6 Z! S    char m_cCandidateList[255];          //候选文字列表缓冲区& M, @% z6 ]7 B6 ^
   char m_cInput[64];                   //输入的字母  ~6 l$ ?2 H  Y3 a1 e! O" B; i: F

- b' Q0 J0 ]7 V7 K* |    BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串
+ a( T! K; V8 q
/ h& w4 z% L. E; b2 X0 [public:
+ m; @0 B( ?3 O, o3 n3 G5 ?7 o1 a: H- ~* m" [+ ]
   CIM();, P! U. x% }+ W& G
   virtual ~CIM();
- `& T9 C$ H1 {/ P! p. |% A+ M" c! I
   LPSTR GetResultString( void );                     //取得输入的字符串
- e1 C1 c* s* N$ x3 ?7 q- g
9 b( X7 U# C! `/ D" V8 @& ?    void UpdateShow( );                                //显示输入法信息
: f, i) G. z4 c0 h, y" |; ^; z# ?# l% g
   LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述* B: _7 X1 `# S: Q. n
   void ClearCandidateList( void );                   //清除输入法文字候选列表2 H0 a5 B" P3 f4 `1 b3 r
   BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表
4 ~: g. L1 d6 K    BOOL ImeIsOpen( void );                            //输入法是否打开# R1 g' J! q- t9 U' G$ z/ }
   void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息. _6 A: t0 m5 K
   void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
: [5 r. g" Z8 ?7 a% s    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息3 ]/ \+ Y: F  Y! [% M" {, L
};- `! V0 ]% d) ?* C1 W7 e
1 C! o9 K8 U3 ^9 Z( x
#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)9 j; P) p& d$ r3 {) \( K/ e2 t
4 [3 V! B) M& m) D- B0 D5 V
  O6 I6 ?1 e5 C  v

4 E: c3 X7 Y% _5 i- F+ Z9 z/ [//*********************************************************************************************//
8 P8 n* O$ a. v( g4 @& }- M$ |3 j  N! y
4 O  i$ _7 b* N# D/ w2 }, [1 P5 b/ ]//////////////////////////////////////////////////////////////////////2 K2 Q/ z1 N! P$ I
//
; t0 k6 z6 Y8 w2 d- q  E9 L// IM.cpp: CIM class (使用系统)输入法类
) A5 H- F, y( ?$ O1 S" h: D// 2001/4/30 Write by Jerry Wang8 U" Z6 o# a$ T4 |  d8 j
// 感谢大大鱼的帮助
0 k" d/ H6 H0 i6 v" g8 J- ~// Need Lib: imm32.lib
; e/ c: b3 e' z4 m& P' \" ]//
" ~( t4 T6 @. B//////////////////////////////////////////////////////////////////////
) E2 c/ T: P2 ^# ~, e( u+ T# K) F8 V" g$ q( W+ }8 K# V
#include "imm.h"
" y# v, o; D0 e; Y' I, p! g
! }! Q& D# \9 |//////////////////////////////////////////////////////////////////////
2 a# v& E* q( u: y, |# c9 T" C( _// Construction/Destruction1 h' a; x0 S  G; u, C0 q
//////////////////////////////////////////////////////////////////////$ B- z$ E% Z% T* @3 x) [* ~& F

9 J0 k% l5 p; @7 mCIM::CIM()' q# v: }; R3 e# A/ q1 F
{: _$ y$ J0 A. w. T6 O/ d
   m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];
/ O  N. j/ t" \4 v7 u, R    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
: D$ A5 l5 R3 x- a- `    *m_lpszImeInput = '\0';1 [) }0 ^2 E2 h4 n$ j7 k6 t
   *m_cInput = '\0';
' R( @( t  L: W; }2 c1 T; a: @. G( B  ~$ r$ B0 [9 J4 t
   ttffont.Create( "黑体",15,RGB(255,255,255) );
5 f$ o, L4 L5 |$ @    GetCurInputLanguageDesc();& {+ D3 ?0 r3 p" ^9 j3 }
}
  A  P. c7 g' e, H" p/ |! f$ w6 |+ s& c" ]
CIM::~CIM(): J! w2 [. K& X* C* a  T& ~
{
& _! `# J& I1 j. [+ Z# R( q" X% h2 g    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
: }3 J* R' r! c8 Y) f  |" w) {- J' r1 b
   CHKB( delete m_lpszImeInput );
. T: a0 J4 l/ T$ B. y0 w# _& H    if( m_lpszCurInputLanguageDesc != NULL )5 p! t. R1 P- y5 v% O6 [" y
       CHKB( delete m_lpszCurInputLanguageDesc ); / `  {' I7 t. a; [# f1 h% Y
}3 h: `3 u! Q) @' ^- u* i9 o
! f9 R9 |- W; y
void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
7 Y9 Q9 d0 O/ C! q1 r{
8 c$ @, }2 _$ C) q/ x- l4 `    if (lParam & GCS_RESULTSTR)" n! V) g: j7 M
   {
4 c7 M* J% f4 z5 q* F; M* I) k        HIMC hIMC; //输入设备上下文
# m( q- s: {0 o# p        DWORD dwLen;
+ m) s2 L1 [, _* \1 u        LPSTR lpResultStr;) L+ E  J0 W& z9 n7 W
6 b: _6 Y( h7 q$ k. v
       hIMC = ImmGetContext(hWnd); //取得输入上下文
' o& F+ q/ v! M; r: N% B# Q6 u( y# T; [$ d5 U0 y
       if (!hIMC)/ d" S! ]  ^/ f$ ?
           return;
5 f/ ]  X. j. w$ ^) {2 R" r$ d' `* {8 a: Z5 f  W
       dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
3 ~( a9 I' M8 ?7 A        dwLen+=1;! s/ m2 N. Z* P4 \" ~8 n. `

2 V% V& H  q2 V( ]2 E' r3 s, i        if(dwLen)
  k  ^' k* G% ?, \        {
+ f) i  m9 [( E            lpResultStr = new char[ dwLen ];
, K: g0 z2 k7 Z& X8 |/ c# f: F' ~; k, P7 X/ s! z( v- p
           //// 缓冲区已经满了
0 c+ o8 d# X- e            if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 ). a( ?1 H8 W# J& B9 Z4 N1 w1 J# R5 W
           {
2 H: U, b+ W9 `: F1 R                MessageBeep( 0 );
9 c0 O9 U- Z7 `$ ?                return;+ v- A/ i; u; J4 T, `9 _* Z
           }# m* s+ b4 Z# N  \$ L
           ZeroMemory( lpResultStr ,dwLen );
2 N4 {3 R5 Y; ~) _* f. ~8 C            if (lpResultStr)
5 G0 }" m8 m' Y9 q2 o; ]            {
; L5 {. }% s% y( U2 h                ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);3 R. \2 _8 _' o- h" W3 p
               strcat( m_lpszImeInput,lpResultStr );
) r9 d  ^1 q; @, k            }
$ @+ |, O& @' Z$ ?  H0 \            delete lpResultStr;8 c1 t) y) ?2 J9 V
       }3 o; m1 h; U# p! B: j( |1 g# c' n, W2 ^

8 j1 q2 d. b! r2 s8 w4 Z- {        ImmReleaseContext(hWnd,hIMC); //释放输入上下文
1 Q) E. e4 |/ A, @# t3 V! f# Y7 m3 o    }
+ S* X7 y7 p1 K2 e2 w" t* [3 N7 a0 i7 S! [
}5 ~" u* B8 q% a& O& E1 y
- B' g" W8 ^+ m2 X8 A5 X
void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)3 G' u* V9 p4 |' `9 b
{
. Z/ a# Y: D$ I7 j: l# N    DWORD dwCommand = (DWORD) wParam;: ?+ q( v2 A, h6 @- f) I4 Q# C4 |
   switch( dwCommand ), u8 f  x& m( ^/ n  T
   {: @2 E" s0 u, y  T  N/ n2 d+ z7 V( |0 U
   case IMN_CHANGECANDIDATE:
/ |$ L# _% s" c        GetCandidateList( hWnd );/ K3 {9 Q/ \! {: \4 M
       break;
6 H. M, W: ^8 q& Z. A* N  W1 ^( e# k- A! ^
   case IMN_CLOSECANDIDATE:
; l& A$ z4 V9 P9 ]9 [9 m        ClearCandidateList();
7 o) ?" M8 F9 {+ `        break;
: }: m" X0 q! Z8 v3 C* ~) {2 C3 B# J3 B# V1 E, B
   case IMN_OPENCANDIDATE:" F. r) i+ P: o+ ~! P! C  v- F
       GetCandidateList( hWnd );
  T& b; a' @8 h        break;% D/ l1 D8 g( [- v' B8 Y4 ^$ h# C9 q. R+ ?
   }
. P  ^3 S5 S# W9 S/ ?9 k( d}
/ Y% h/ H! b  h& k( M
6 n3 A* k- w' y# O4 s" ?( {9 O9 U3 _void CIM::OnChar( TCHAR ch )# S: ^( Q. J  n+ z! o/ u
{
% Q( a% R7 B  d# }* h  @- \: b/ u: d: p6 @    int len = strlen( m_lpszImeInput );
$ O! ?7 b) J6 F/ f/ b: b5 Z% {- y9 u/ d6 e( [) L( I7 F
   if( ImeIsOpen() ) //输入法打开状态9 n( t0 Y# c+ a: {
   {5 M. b* i/ b: o- F

  L% q: W4 C) C/ c$ k' R    }
* W0 U: s1 Y/ b3 ?' E& Z/ X$ @$ R    else //输入法关闭状态( i/ F, ^, u5 Z( g- M- i- }
   {
& _, d9 n/ H  ?: z- |6 j' j: M        if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母
) i5 F7 p! R& ]" z        {" z, F3 Q. z& y+ d
           *( m_lpszImeInput + len ) = ch;
" Q& X2 ^. [/ i8 g            *( m_lpszImeInput + len + 1) = '\0';
! n. ~  }- j% Y8 ]: k+ {        }+ m  l: O& Z% m9 j
   }
3 o: @$ Z8 p! w8 P
) Z: Y6 C3 R; t: z( S# O$ H* N5 i9 L7 U    if( ch == 8 ) //BackSpace字符0 P& t; B3 }: x( d9 q* P
   {2 W/ Q8 G  l; ~0 i, q% v# B
       if( len == 0 ) //字符串长度为零
3 S, m7 i8 _1 i' z# |6 O; Q! B. R5 r            return;! D, ]7 u1 e. L" S9 [$ r6 ]

+ v8 H. S2 z7 s        if( len == 1 ) //只有一个字符* J/ }3 P$ h2 ^0 R  [+ a) i$ _6 h
       {6 b/ J" a1 Y. c! G3 `) [% q
           *m_lpszImeInput = '\0';
+ m1 q# p  |6 }. R( A            return;
. M; @. t+ C0 @1 @        }
7 h2 C4 H) e8 C2 e0 q6 h" z
3 O. p1 w4 Y. }6 O/ Y! ?        BYTE cc1,cc2;
/ s3 `$ ?3 R9 r# S        cc1 = *(m_lpszImeInput + len -1); //分离字节+ t& \' b9 d0 E2 p/ a+ w4 m1 |
       cc2 = *(m_lpszImeInput + len -2);' L) K  F- \7 i

' R5 P, x) ~$ V# A        if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0( k+ Z# `# L/ F8 X- }$ `0 c8 f3 k/ h
           *( m_lpszImeInput + len -2 ) = '\0';! w/ M% `: T* H! X; V7 L# k; n( ^
       else //是英文字符(单字节)8 E! S5 g3 c3 D/ c+ d- z
           *( m_lpszImeInput + len -1 ) = '\0';
8 B  q0 l2 G& x; [5 F" V    }" V& c7 W( ?/ t5 S# Q
}8 b; ~' K$ }7 O6 w1 `0 q: _* H, P0 j

6 S( O( M* H! T3 uBOOL CIM::GetCandidateList(HWND hWnd)& M) c# i9 z6 J9 g) a! R& ~5 V8 |
{1 R/ `2 Z! D0 k5 X2 Y5 `% h. w  q
   DWORD dwSize;
6 B$ O' C! v; U  J. w* `    HIMC hIMC;( j3 G6 P: o( u! F4 n- B9 z' v

3 R; _# h; H, u4 r# G    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
& E% N/ T4 T# t& D6 ^7 @' @8 y
' h+ O( I  O# J% D. o5 w- G4 }    if( m_lpCandList )1 p6 U+ x( |9 S; C4 R! {
   {2 _- Y, y. I) N' g+ _5 j
       delete m_lpCandList;
0 e' ]  i) f  K! `- h- W        m_lpCandList = NULL;. A5 ?( v/ \) R5 N
   }3 p3 `- ~& w/ K

5 H6 X! n2 ]& j. h9 S" H. m    if( GetKeyboardLayout(0)==0 ); H) Q# p+ _0 l
   {: n0 a% ~) j5 m5 q) P
       return FALSE;
% _" {5 W( q& y    }6 F) {; P5 m) ?0 v# @7 V' M

% B5 v6 A( s& b3 ~: \; ]    hIMC = ImmGetContext(hWnd); //取得输入上下文
& L: U' M4 S( ]) l    if(hIMC == NULL)
; B' X8 K  K& W0 E# |) [8 z    {
8 V& L. u0 ^: Y/ v5 B2 ~1 q        return FALSE;
3 M$ s0 O% C( U- F5 V    }9 m- h. b1 h" I9 U+ }/ @8 z
1 B0 V$ S, Y2 B+ _1 y
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
% a, F, L9 v2 g0 v: g! V2 ~9 b4 ^    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0)) 5 `$ b, L) I, r, e# ^
   {
' j3 r7 K0 ^. K  S$ C6 U        m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
& A/ c0 D; v, ~! q9 s# e        if(m_lpCandList)
* E# K5 ~1 B$ g: s) R! t9 [5 D        {
9 l  I* A5 ~3 W  v  K% o) w3 W6 l            ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);/ w$ g) U2 o- i$ J9 h
           CandidateToString(m_lpCandList);
  l' w9 P5 F4 ~/ j( H& X1 R        }# [  Z! E0 K& M( \; v
   } . w9 r: A; Y' }/ ~9 @! H! P4 y. {5 M
/ o) |. H- W! r
   ImmReleaseContext(hWnd,hIMC);
, ?9 T1 l- J1 `5 h7 l$ g
( L0 ?; P. G4 e4 o7 K: a3 g    return TRUE;2 J) E  S5 |1 D, `
}1 [* w$ d5 g& O( u0 N
# v, U4 v  f  O* w3 t
void CIM::ClearCandidateList()
2 l4 C- x, X; x6 E* v# e{! h& t. e/ r7 I7 ?7 q+ I
   if(m_lpCandList)% J+ O$ B3 s% c
   {
' Z( I) p  g  O/ |; _        delete m_lpCandList;$ B" W( y6 G! O1 A
       m_lpCandList = NULL;
. s3 ]; Q" G. l( }" X% T7 X    }
7 b& Z! S/ C/ N# Z  B2 D    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );$ u/ F) L, B* l3 C: W
}
9 V& N) y! V. n3 X$ ?8 i3 c& [3 c- U$ V, B3 n, \2 J
# f+ {" _, e6 K, Y8 L, G
LPSTR CIM::GetCurInputLanguageDesc()# Z1 p5 ?& ?- h' l
{+ U; G; e1 }8 l+ w
   HKL hKL = GetKeyboardLayout(0); 1 u2 o" R0 U! b- A* l
3 A% t1 j& }* V9 v
   if( m_lpszCurInputLanguageDesc != NULL )
; `; G% b2 X; ~1 o; b+ N! m        CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^' @* t# E" d) I. s6 p6 y

: ?" d- h/ ^" ?. t    int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度
; ^) F7 L8 S* d& F+ o! [5 B. P
1 q# i/ _6 `' {# K& w    CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
) b4 K0 ^/ J( _  ?- x/ w1 Q- \
( G4 H( a% e; S# u' J- v    if( lengh )+ z" l3 d; R/ A/ l( z: k
   {
9 Q- ?( A: e) n% j0 w        ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);4 c) z! u; u! _! K' T  a
   }/ Y3 j/ q( n; m5 \8 |+ W$ e
   else
8 Z" P- G) E& L- ]$ {- G    {' h7 K9 H# ~$ W
       strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );
9 I9 K# P4 e9 N$ E    }
; I0 u" j# M6 r* y6 o  {
7 e0 @% @" V/ `2 L    return m_lpszCurInputLanguageDesc;
- i, ?$ V" v. V) ?}
- N& v0 a# O) m5 a$ W% n8 X% B9 u* O& t! V% l* [6 ]
void CIM::UpdateShow()
! b0 f& U/ T* l! ]{: j' c# U9 n7 q: k4 G
   POINT pt;
3 ^# x& F) U# C) _0 b    pt.y = 450;' L( ]. @) G. C1 q
   pt.x = 400; 7 B' m, x' H. ]& @# l2 b
   ttffont.SetSurface( DD_GetBackScreen() );2 x( D, D6 a# ~; v1 S% {
   ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述
7 `9 i  n6 I, a: V9 s. \* H. b' Z! C2 k0 W; p
   pt.y = 420;
1 Z7 C& e% p! H& L$ h* U2 v$ W$ x* y    pt.x = 20;; b: L' V+ Q  g( v
   ttffont.ShowText( m_cCandidateList,&pt );$ @! T& E2 g. X& B. J& u
. \+ y, t2 z  i& i! J
   pt.y = 450;7 l- R5 N) S' w# M. O6 f# k# S
   pt.x = 20;
( j0 e& V! Q4 Y% O6 o: e    if( *m_lpszImeInput == '\0' )2 V  M7 [% x2 N! a. X
       return;! A# L& s' L; L

/ a) u/ Y: _7 J    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字
! K% y- K9 n  O1 R}
! r. H% P6 t7 P/ i0 C4 p' x. Y, X# L2 t- Q  f; Z
LPSTR CIM::GetResultString()
6 h% V6 X; H" H; |/ Y{3 _1 n. E& O1 i6 C
   return m_lpszImeInput;' T& Y; L( v4 O
}
% E/ r( G8 Q; o' y  e# D. e9 [2 h4 O# N. F0 i, |
BOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
/ [$ ?% C8 H) k+ |) K* Y, n{
0 D  y; w5 A/ d& t: j    if( !m_lpCandList )
2 q# p6 {4 }: O7 k1 Q# m! s. v5 I        return FALSE;9 v+ g' t# J0 g9 P9 F
$ ^' p6 I- O3 s7 S: Z- U
   if( m_lpCandList->dwCount>0 )
8 h8 i7 A5 J+ Y& H. a, j/ V9 }    {
6 D# s7 [! f1 P2 A        LPDWORD lpdwOffset;
* U/ d/ [+ |, ~: J7 z) O! n* o4 U  A3 h: u- w
       lpdwOffset = &m_lpCandList->dwOffset[0];" T: _, H$ f& p5 f( N- Z2 l% T

+ D1 d& H0 V: K        lpdwOffset += m_lpCandList->dwPageStart;
; d) q6 h5 Y% l; G' p* q$ Q4 V, j0 n. I; ^: d, x
       ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );- d( X9 d6 \$ h& V% v9 S
/ R, f7 ?4 a! i; G
       DWORD z=1;
8 \% W* C( u0 B' Q: N! C        for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) " x  d) o1 P( C
       {
9 R- v2 Y) p2 l# C2 _            LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;6 i: _5 Z. |/ g4 K1 q; Y9 K+ _
           char buf[255];
+ _9 k" ^  _8 s9 X            sprintf( buf,"%d.%s",z,lpstr );
. W9 U: _5 M4 b$ C: R            strcat( m_cCandidateList,buf );
, Y# o7 U) P8 {. T* d            z++;; J; X8 l4 X3 |  F! m" ]  x/ v
       }0 Z7 C3 f) }' y( J/ r: X

* c2 x( K, m8 |; `6 W        return TRUE;
0 F+ W$ }( c6 j. B' e    }
& r: z* R5 {$ v$ s3 ~- f' C% ?2 [8 P2 `* l3 R5 u) J' n' B! a( ?% N
   return FALSE;
% K. V5 X, z  Q& b; |  M0 x}
4 i' y+ |! a3 K) j
: N7 `8 t. x, e+ i" ~9 T# }2 DBOOL CIM::ImeIsOpen()
$ h7 }" e( }* L- d2 Y+ `3 L2 D: m7 b{
' S9 ]* h. T7 G6 [8 {* r' i8 a    return ImmIsIME( GetKeyboardLayout(0) );( P8 P) l4 [- b6 ]  Z6 w0 S* @4 G
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 22:48 , Processed in 0.020284 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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