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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//8 ]# F# y/ g- C! T
//
; {1 _7 ^0 F3 ]( s6 a7 M// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家+ E/ p% R: q6 j0 n
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
1 d+ c1 B/ g3 K% q0 {' A" y// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net! w% ~. i: m9 E& g! u. U' I: V
// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT3 y9 F1 q2 n6 u9 [0 a. N0 w  U/ Q5 [7 q) \
// 为显示信息用,可以用其他方法替换如 TxtOut() 等4 r. ~6 I  Q0 A9 B1 b" A
//
, Q- x8 e8 o) a# [! G4 F//******************************************************************//- V- e* b) h) h
6 f9 T9 \: {0 j# {( k
//////////////////////////////////////////////////////////////////////( O2 v+ Q, \+ ~3 n& V' p( I
//- S. ?0 l- y1 s# G1 O  D3 g
// IM.h: CIM class (使用系统)输入法类
) m* `1 `- t( u4 @7 }, }8 Y// 2001/4/30 Write by Jerry Wang
) ^, z; p; y2 l* W// 感谢大大鱼的帮助
% `, M5 k; b! Z$ k7 T) }) l// Need Lib: imm32.lib
% V: \9 g0 b; k( I2 v: M! V% c) m8 V//
1 y# Q- D. V" D3 I" [# v* ~//////////////////////////////////////////////////////////////////////: y9 ^) B% R5 E; J1 U
' I& X. [% T' _5 d- `
#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)* ^8 {0 x% E0 x4 P7 _
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_
) b  l0 G. ~8 B6 T/ C
: P( r, V; I7 U' K: c  M7 z5 z#if _MSC_VER > 1000" ]" z. ]: ^  W+ {
#pragma once9 I3 U: e& G' I6 X( |) I. k! r
#endif // _MSC_VER > 1000  w3 c4 A$ q. p3 ~* w
, L% j6 P9 Y' ?0 v3 F( c
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数4 p& `1 K' y% M, H

% M# H6 E0 p8 k' @& D#include "FindMe.h"
1 v  j4 I  A$ Y) U* J% M" Q+ B% Y6 v! f# C2 B% j' P
class CIM
# |. M8 g. \- d& ?; B' E/ b! {/ `{- U! J& H8 D$ B4 U3 `( j
private:
3 D  K& [+ T1 I    CTTFFont ttffont;                    //显示信息
" Y; S! \& H8 B+ b0 o4 f% a    LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表  c+ L+ `  d& z9 g' I& j
   LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针8 l$ N) i0 ~/ B. G4 `! o
   LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针* n$ E0 b8 `5 G/ C6 j
   char m_cCandidateList[255];          //候选文字列表缓冲区# Y' V. _1 n% y& J8 L3 N+ {1 L# L
   char m_cInput[64];                   //输入的字母
* }5 t  v4 N' T& W, @3 ?' i
, X3 o/ |9 o/ Q, n) [    BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串
6 A4 L  g6 }+ n* ]2 J; ?. p8 |& Q" h$ t4 S) F2 p& R
public:! O+ `. ]6 Z( y: a; H

" [! V2 D' ^1 {* k7 r" Y+ q    CIM();
$ B6 {3 I/ G/ Q' W  y) w" P    virtual ~CIM();
) [* [) k; x& m$ E# L4 Z# Q6 Q0 x0 f: D
   LPSTR GetResultString( void );                     //取得输入的字符串( _9 e$ J% @5 c) X0 z2 s

4 k% n& B+ x8 n: Z' L1 m/ q: r! C    void UpdateShow( );                                //显示输入法信息
# U; u! y( s  p1 Q2 W
  G8 J! u$ e% }- _3 p# i! p- W: U& d    LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述$ t' p2 Q) F5 S: D/ \
   void ClearCandidateList( void );                   //清除输入法文字候选列表* x% s2 u. j( g. s
   BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表
/ ?$ Z4 u6 Y8 b! ~* H" z+ f% L    BOOL ImeIsOpen( void );                            //输入法是否打开
; [6 c5 J! O  @0 g    void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息' S& [3 g* S1 _. v
   void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
9 ?9 B0 o  X( ^, ]) Z    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
9 r8 q, T9 W  j};4 H2 a  g* T7 g7 M4 }0 `+ T

& B/ V. }- B+ k' j9 q% c( q8 Q#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
7 N; d1 S4 a4 w$ E- J% O1 _; Z5 {  s' V7 o: Z
: e/ {0 K5 ^7 a$ n* O
" Z5 Q- b, b( }0 Q% S1 x
//*********************************************************************************************//& N  s7 J: i! J" Z! k' d/ N3 ], r
+ L) Z- @, Z8 H: T1 L
//////////////////////////////////////////////////////////////////////
9 ^  Z$ c0 _3 O//1 y" K0 o, \9 I1 E$ B$ J8 o+ G
// IM.cpp: CIM class (使用系统)输入法类
5 H$ t. \" R: {: R- a// 2001/4/30 Write by Jerry Wang
* I; |, _/ b& X1 J7 M// 感谢大大鱼的帮助% `; J! B; k+ d/ O0 w2 ~
// Need Lib: imm32.lib7 U3 y' }$ D  s8 j" g0 s
//9 Z4 H/ i9 }6 w( N2 @
//////////////////////////////////////////////////////////////////////& d& Q* q5 Y! B- p+ ?1 K5 z
+ L8 e/ U% l  D' O+ a! l* O
#include "imm.h"0 p2 S5 z& i2 l8 ?

7 W3 b. E, y7 U- [. j9 N& G//////////////////////////////////////////////////////////////////////
% Y! m. C6 D" X: @// Construction/Destruction6 s+ x$ j6 u- o4 x3 T
//////////////////////////////////////////////////////////////////////
+ @) W, C+ _' Z9 `1 C3 T1 h( k& C5 k# m3 B$ e$ W
CIM::CIM()
: {$ A/ Z) a$ P3 h" g* ?{) G. c( Q! t3 Z: s' ?
   m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];0 Q9 G9 [9 J. P  H/ F
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
6 ^$ P- g' O. e- p2 x    *m_lpszImeInput = '\0';( J* M, [: f. h$ Y+ {. p2 {/ h8 ~- i0 Z
   *m_cInput = '\0';3 j) P3 W$ t) \
7 w4 K% P* Y& a9 c/ `
   ttffont.Create( "黑体",15,RGB(255,255,255) );% S1 {( y" N7 w- W. y3 f8 N
   GetCurInputLanguageDesc();1 @+ P- w! g% \
}
' y2 I6 M$ Y1 K( C5 w, h0 C2 k
0 K$ T# b# r' uCIM::~CIM()! y) N) n- J! l+ f) R: G- c
{% ^  n% Y7 p5 j9 @' P
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
) M) i$ }. N# ?3 T: f& d" ]% H
( r+ t4 i4 V. _( b6 [! r    CHKB( delete m_lpszImeInput ); 9 }9 A" s9 h/ P; \& M) l9 ~
   if( m_lpszCurInputLanguageDesc != NULL )
9 L$ E2 k- g/ ~        CHKB( delete m_lpszCurInputLanguageDesc ); 5 I$ o, o5 F& z6 ^1 @3 q, D
}/ C, Q1 t9 [2 r% p% V% y; L
, P/ h# k0 L* i: P; C4 E" L& E* U
void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
  O" @+ {; N6 t; t% U7 \5 \{
1 L. m; v& w5 s# ?    if (lParam & GCS_RESULTSTR)
. j+ L! g# u( Q5 h9 M+ |5 [    {
% j4 v, f$ U# k* J4 ~$ d        HIMC hIMC; //输入设备上下文
2 p+ I9 R! n% h" H        DWORD dwLen;# z. X. m; M( U; H/ ?4 Z, t, L/ x3 l( N
       LPSTR lpResultStr;5 S( d9 c  O, \7 t; M# M
( X. L! e3 T, d
       hIMC = ImmGetContext(hWnd); //取得输入上下文( F+ {" r! o$ M9 c) D9 D
3 v, i$ t: F. b  y* l* a  B
       if (!hIMC)7 w2 l# b# w3 p6 o
           return;
8 n" o0 @$ G5 Y; S' F2 m4 `
. w, j6 m1 `- t$ X. a7 D7 n        dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
/ U8 Z; E. z: _. _        dwLen+=1;, y) P2 _2 \9 e) r5 X9 q/ |0 W
, n: T/ Y, |$ x
       if(dwLen)9 H. d: R" f  E" K' W  U
       {
, D/ Y# v, N2 {3 O3 E            lpResultStr = new char[ dwLen ];( z& k1 _8 y+ l1 j; P

  o6 X; @* z0 T            //// 缓冲区已经满了0 t0 z. ?1 h) [5 q0 k. y
           if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )# g) S4 |1 j& Q+ |9 d2 H& A" n
           {
: G; _8 F- L7 d* q" Y7 Q* p2 W& `                MessageBeep( 0 );
0 T7 q7 k, @6 j. d1 a8 Q7 F3 P% n                return;
( j) Z3 S5 L- ~) r5 |            }
& c; ?. ^3 |7 r7 A6 X5 ?            ZeroMemory( lpResultStr ,dwLen ); " v$ c: j. a6 I- c' ]
           if (lpResultStr)) ^7 ^9 H0 a/ W& _% g/ a
           {; V6 c( H* W' w' r( b, Q
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);  s- j% V4 k( b6 X2 R" n
               strcat( m_lpszImeInput,lpResultStr );
. K7 D! Y7 l8 B- A6 r6 H$ N            }
1 `7 A9 D# i2 R* P! ~  B            delete lpResultStr;% r+ {8 y$ {2 c# }' B! n# ]; ]
       }* k4 c" h9 [- [8 y8 Z2 w1 |- d

4 T4 _' v. n2 P        ImmReleaseContext(hWnd,hIMC); //释放输入上下文$ n5 C. M7 Y7 a1 c: N5 j
   }
7 m3 ]9 T, \. c
2 Q7 F1 {* a8 T5 P7 ^( B}
+ b1 a$ |, |) g# Z8 m1 t& |7 D' i
void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
& m3 {: t$ h8 q2 s$ r{
0 g4 r3 x2 c$ [7 c( G7 Z! r1 O+ l    DWORD dwCommand = (DWORD) wParam;( r& s) {! F' U: Q
   switch( dwCommand )8 @. n4 Z/ O6 P" O$ ]
   {% Q* K1 _: u; l  s& k) F5 h0 R6 n! N" K
   case IMN_CHANGECANDIDATE:" v& g7 c, [! ?* l% h
       GetCandidateList( hWnd );
* s# R) _6 j/ F0 n9 A. l6 u+ L        break;
/ F8 h+ d8 M7 S0 G' U" C/ M" h* n5 m9 p* |( ]
   case IMN_CLOSECANDIDATE:
% Y9 [7 g1 O1 ], E! N4 m        ClearCandidateList();
3 _& ~  g$ {9 L7 d5 Q4 [        break;9 M8 i0 F) }6 a6 i
& b: m2 X* i5 F. ~: h7 N  U! F4 q
   case IMN_OPENCANDIDATE:* `5 c% e3 F8 ?4 _: _
       GetCandidateList( hWnd );
2 @# v4 u5 N+ A/ Z        break;. i" p# s5 C2 S, N6 J: W! l
   }
5 i! e  [; E6 p: ?3 e# P3 `3 Z}
; F5 a- b* W* U1 P2 r  j" s$ O5 |  a4 J9 A
void CIM::OnChar( TCHAR ch )- l$ V# X& N$ v" s/ p
{
3 G( \0 w- {/ c) H) d) L  q7 `    int len = strlen( m_lpszImeInput );& {0 G4 O+ ^7 j+ A7 B! r
2 o6 U3 p3 L! F3 Z
   if( ImeIsOpen() ) //输入法打开状态' q' ?7 l4 B$ R) E$ u. m
   {
+ R( r- W8 z2 x; R: ]5 q) n- A6 {$ X  w( P, r! L( d* ?
   }
. @4 o: t8 P! T8 @7 j7 o. r* A- Z    else //输入法关闭状态
  q, C  n, V7 D    {- H4 i1 s# w. N
       if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母; f3 y3 y6 t* L: L) b3 G( l3 D
       {
# i* D! h  u/ V) R' D6 p' |            *( m_lpszImeInput + len ) = ch;8 V% \( A" W; t0 C$ j4 t# Q
           *( m_lpszImeInput + len + 1) = '\0';
9 b: E1 r) K& y8 s, q, L3 e        }
. N( B+ X" E- z    }! Q9 ~- T0 y& P9 |! S& y; _

- u0 ]7 i% R2 N    if( ch == 8 ) //BackSpace字符% G: n# p/ j' h, `$ e, E7 R
   {6 j  V3 v5 U5 y' c2 u
       if( len == 0 ) //字符串长度为零& E4 [. S3 n  `1 }: n4 ~6 Z# {
           return;
. [& ?' m- q$ V7 I! L3 X* J3 t. X$ S8 x$ T' a: D, M
       if( len == 1 ) //只有一个字符
6 p+ s0 I! h  l! f- b9 Y! M        {3 j+ a5 o0 J" h9 S$ C$ n
           *m_lpszImeInput = '\0';
- f" B( S9 s" U1 q            return;: b# R& T, m! [5 I/ g
       }
4 U8 H$ _3 A5 P# D8 x- D; d8 ?* F' v1 Z% |' x
       BYTE cc1,cc2;) Y6 ?* c5 s; U$ Z% b* n6 g
       cc1 = *(m_lpszImeInput + len -1); //分离字节
* V  d+ q- l3 b3 v2 h7 ~        cc2 = *(m_lpszImeInput + len -2);
* z" c1 k3 t# _' O) M; H1 t
$ h: P5 U" A" p: G: g        if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
4 F( H. g3 w; ?) U            *( m_lpszImeInput + len -2 ) = '\0';: v, x7 j2 ]7 d3 B: b; j
       else //是英文字符(单字节)
+ C# d; ^& e8 |* q: {            *( m_lpszImeInput + len -1 ) = '\0';
; a' x! }+ }3 t' \    }7 w6 x/ X; s4 k. P
}. y6 `; ?/ ^7 J1 x1 l+ |( M
  G- O; Q2 C& }6 C7 L% L% C
BOOL CIM::GetCandidateList(HWND hWnd)
1 T' l& o9 n; X# C  K& o{
0 |& Z- Q, d  d7 U3 w1 n2 Y: }+ Y    DWORD dwSize;
9 M2 T: ?2 L& O8 A" L    HIMC hIMC;
! E. d1 t6 s0 g/ }
0 h: O9 J+ `  k    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );4 z/ @$ E% P' x! S6 |% q/ H
) F9 d' Q' F+ S
   if( m_lpCandList )9 ?2 `7 I, v+ A; b/ B" `* y" N+ t
   {% x* v+ A0 a5 g9 T
       delete m_lpCandList;6 m( ~; v0 O! u4 B9 U3 \8 ?8 K6 t+ p
       m_lpCandList = NULL;
" @/ W1 ~- v, y  K* X    }% T. @# m% ?# `) @$ I( k" s
0 o/ i" ^/ F2 z" j$ |* ~
   if( GetKeyboardLayout(0)==0 )4 S  I6 l# V& v! s
   {4 ?7 L4 T: g! s0 K. S6 m  }
       return FALSE;
* r: ]+ W! ~, ?0 u  i8 i: v    }) y& ]9 R% e* K

; y1 l& v# c2 S, J/ x; t6 w    hIMC = ImmGetContext(hWnd); //取得输入上下文
' B  i* u- P& r0 S$ d7 o    if(hIMC == NULL)8 E+ r/ l# _5 W+ F+ C
   {
0 o, B( R6 _' l+ @- l" W1 _        return FALSE;
) O: c5 l# P6 g    }" ]7 C8 H7 {" q, v! V) j  w
: W9 a0 b; ?- q0 n/ S( P2 q
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
/ F4 D( e4 S( M( K3 y7 E    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
7 Z- n  o8 M: C3 ~3 ^) I    {+ v8 p- |7 D, D7 F- q3 w- f
       m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
# [, B* |& E: a. d        if(m_lpCandList)
5 Y# j2 {2 F' ?) K+ f2 U$ Y        {
/ d. g  A# P+ i" T9 V2 N            ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);2 p$ O. e+ ~; }9 t3 |" Q- @
           CandidateToString(m_lpCandList);
/ N/ M: \: h8 X/ b        }
) x: M; k8 U# V+ i" z    }
" z* c4 }% Y# N" D1 j9 l8 W0 W; r" \& L( d
   ImmReleaseContext(hWnd,hIMC);% }: K2 O) j3 B) m6 A
% }/ C, B# |+ X7 B. s
   return TRUE;. T$ M. g, r& W% ^
}4 c) O9 w  e9 v9 z& u4 S& I5 A
$ w% T0 t/ z3 ~
void CIM::ClearCandidateList()
# ~! u- {7 q, T- w2 O' D{
5 X5 s+ t" p4 m; d9 N. y0 |  Z    if(m_lpCandList)% x1 f3 W' f# t6 Q! o: X
   {
/ b' O) E7 C+ Y0 v        delete m_lpCandList;$ A) O' ?- `. v7 L$ m' A
       m_lpCandList = NULL;" J! }. S. i3 X0 c/ w
   }" a# t: b- k4 n
   ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );8 Z# G  n. c! X1 o% b; u+ v
}
" y; ~( Q7 v: R) O) l/ V) ^' G) M9 o; ?  @$ K3 c) H5 O

6 k5 g) ~2 R1 Z, v' w2 t6 uLPSTR CIM::GetCurInputLanguageDesc()7 s$ s, O3 V3 s& E/ ^
{
# a: U8 W% Q: w    HKL hKL = GetKeyboardLayout(0);
6 i; q  q: E3 J- T/ ]" e: \; h- j0 g! `) B
   if( m_lpszCurInputLanguageDesc != NULL ): F( u/ E( a5 g) S
       CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^
. V& j8 \& X$ ~* S/ Q1 [4 G: r( a: @
   int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度7 C% B0 n9 K* R- ~$ |
6 |# ^- d; @7 `- S
   CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
: _: z+ A* U) W6 Y! Z) S  Z. R, e( z& ?' q
   if( lengh )
7 S* ?& `1 D4 I; L. t5 g4 o    {
8 F; X6 C+ ^* |; q' a  d        ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);
! o/ S2 ?, ?2 U    }# m2 x. w$ ]$ E' `8 J' `
   else
; r) k8 n' p3 f) Z. w1 J    {$ z5 }8 D. C, m. N
       strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );2 k* A; j; v# e! Y1 G  K. \
   }. e; C& _7 a7 x

8 H( Y6 M$ C  h5 |  ^    return m_lpszCurInputLanguageDesc;' x, w; l9 U$ r
}
) c, s0 E7 ?% K. |. W' q6 Z
6 J6 @+ c2 ]) a3 N" m* ^void CIM::UpdateShow()* Q) _# Y# n/ b8 @* F+ ^. E' s- a
{
! R0 K: ~0 M1 U    POINT pt;% E# r3 ^% O$ Q1 W
   pt.y = 450;
5 I4 s; J" y# D# W0 o5 C1 _% ]; F    pt.x = 400;
3 y' p! f" v) \* U& d3 J% E- a    ttffont.SetSurface( DD_GetBackScreen() );
+ k2 \" H  K: F7 _3 g6 K0 |    ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述
- m: y4 a7 P* c
1 s4 ?/ t& S, _/ y2 \2 k    pt.y = 420;
- f% }2 V' X/ m& a; s4 x& `2 M    pt.x = 20;5 z8 F, m- s; U& @3 |/ t* z1 Z
   ttffont.ShowText( m_cCandidateList,&pt );
- ?8 Q6 _2 U4 @5 D3 B+ i( E0 Q* m5 x: i. T" O& W, k1 S
   pt.y = 450;
. S, H/ H3 ^2 H3 ^. _& L    pt.x = 20;/ I. D' {! |* g) R6 B  \% _) ?
   if( *m_lpszImeInput == '\0' )
8 e& q8 t1 [  J* y        return;
* \* p  o. ]$ B' M8 g2 N6 }4 y* g4 S) q( O( G
   ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字3 H% u0 m. |3 [5 e5 s$ J# w
}
7 ]2 F" Z& e  S8 B# R
2 E2 i% a" I! N' a9 d* NLPSTR CIM::GetResultString()
1 r$ n3 B, ]# \+ o5 c+ T1 m( W{' o8 ]7 G7 k4 h* y' [" f( c0 d5 w
   return m_lpszImeInput;7 i6 C: B: n) a/ }! t
}5 G3 s# I& b' n& s* Q, M
6 J/ W& ?8 p1 L, k
BOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)3 ?% j. H+ j6 t, e; A' k
{- l0 y( ?3 _9 Q
   if( !m_lpCandList )
$ ?, c, N) j. h  H1 z        return FALSE;
2 r, J7 n! W. v& i7 `7 m0 \8 d% n7 T5 B" q0 p$ m0 {& p; ~
   if( m_lpCandList->dwCount>0 )4 y  n! ^$ }- R/ K, i
   {
! G4 T1 z( `- k! x1 j        LPDWORD lpdwOffset;
  G, S; p, V. N. o: K4 x/ d4 C# c& z1 C/ e( q; ?7 B
       lpdwOffset = &m_lpCandList->dwOffset[0];
% {) R' H* q; s% y; e8 \0 G$ h' S2 y/ W( I! Y) X" d6 ^* C) ?) U& p
       lpdwOffset += m_lpCandList->dwPageStart;
6 H8 I+ a, n7 A" ^4 \. i4 C) j9 V
6 m, m" B# D5 m8 ^7 C        ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );1 M; B3 i! \& C
8 Z4 c# C$ P! c* e/ D: _/ L- d; O
       DWORD z=1;  K! o' M5 s& C7 R5 s
       for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++)
: x7 a3 F. p" K; K. p0 o        { 0 W: h7 E, N. @9 w3 N& L% M' S
           LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;
! t( j& A, V( X! B            char buf[255];$ G4 f/ {* U  [# K
           sprintf( buf,"%d.%s",z,lpstr );
' F, T9 D! d3 i5 b2 H/ n6 V            strcat( m_cCandidateList,buf );
! l& I0 ^3 w, Y            z++;
/ Z2 z$ t" _+ t& H7 q+ C+ K3 @5 x        }
4 `# V1 Y6 M) n# S/ S+ O& F* W# m% p" l2 x& G. K1 e$ W
       return TRUE;8 Q5 E* k. z# t% C! V, }
   }
- h- u# w* ^3 l. U3 B# e, A, ]
& T* q+ e% `: I9 c  F- G    return FALSE;
: u7 `- [5 {# P: v" L$ p, ~}4 R7 U  d) s/ g' q" B. `, v; u

7 H8 U2 g' K* uBOOL CIM::ImeIsOpen()
# J% a1 i$ x/ F, W& }{
6 U; @8 ~5 |; r4 L    return ImmIsIME( GetKeyboardLayout(0) );% d% \; h8 u9 f" s
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 01:00 , Processed in 0.020917 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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