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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//; r8 d' r) K+ G, V4 G, T! K. y* Y
//5 |8 y; K' @# Z6 {! h  m( U3 s9 l
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家5 _: {6 d8 }& C, r& z3 E- {* ?
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-): `( K0 A% B$ Y0 x" ^- g* R# ~
// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
9 m$ h- L, r5 m2 p- Z8 U1 D// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT3 K* \1 @8 A* c# v
// 为显示信息用,可以用其他方法替换如 TxtOut() 等0 m5 C; X* K, b( {# ]$ @
//9 _8 ^  ~9 m1 A  f
//******************************************************************//+ ?0 H  T% Z: I1 C* O: o
' i" O0 c- s9 Z, V$ P, t6 R
//////////////////////////////////////////////////////////////////////* P) u  |9 ?: v) A* w, F! L
//
2 _+ k  Z1 R' c8 U5 {, E! Q// IM.h: CIM class (使用系统)输入法类
9 J: S7 y/ m5 E4 [0 Q1 S; k* U// 2001/4/30 Write by Jerry Wang
9 q) l6 x3 ?) j$ M// 感谢大大鱼的帮助9 ?. E& V! C2 S$ n7 I
// Need Lib: imm32.lib
* G4 F$ ?7 k- t0 H//
* l6 b% L: ^6 k# P' Q6 j) ^5 l//////////////////////////////////////////////////////////////////////0 u% @( J! y6 N+ _
; w+ j- A2 y; S* e; ^/ o
#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)& U% X4 V) U) _* x1 t! o
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_
- \5 E9 `, l- A. i" E
% I' g, W8 R# e- ?#if _MSC_VER > 10006 C3 f2 j3 ]- R) _' R7 e1 B- z+ X, d
#pragma once
5 _, t3 ^( q9 g* ~5 x#endif // _MSC_VER > 1000
6 F+ z. c/ k$ o* |5 q$ w$ K9 w4 a4 O
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数
1 z* i" @2 w$ m( [. Q" O
  l6 u. @9 S+ e  m" Y' K#include "FindMe.h"
$ U" A1 D  a' i: z& k, ~7 `& ~) B/ ~
class CIM
- F( `' I3 a+ n* e5 o{
8 c! Z5 |# M* X5 ~2 s/ J& uprivate:
2 _! b6 f4 r) R    CTTFFont ttffont;                    //显示信息
) U( m8 B: E8 S    LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表
3 W& }" u# C1 N  h' g! a% c    LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针
0 `  d1 O3 ]/ ~) m- Y  D) v2 U    LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针
5 }* M' r& C% M% R" H" }+ x, f    char m_cCandidateList[255];          //候选文字列表缓冲区2 c0 W, }+ d' x- P6 p; |$ Z
   char m_cInput[64];                   //输入的字母- V8 ?  O7 B" q. V) \

+ q+ ^4 n* Q) q" E. c) X( c' o    BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串. X6 d( p. J% m0 d* X2 n
# n' l- l! q3 r# }. [
public:' H0 W: f% G/ a

+ N5 `7 S0 C) E. D  i    CIM();1 C6 i) x  k! i/ D2 u% o. n
   virtual ~CIM();
! _5 o, P6 h' X' R# w  D3 y" s# M9 ?
   LPSTR GetResultString( void );                     //取得输入的字符串
, B0 t. K% A! M* }! i- P5 A
. ~! ~/ k7 B( k1 i    void UpdateShow( );                                //显示输入法信息
" p- Y8 Y4 ~, a! y8 O) J6 H( b6 M' P% e  B7 D
   LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述. G. i* o) {; L! K8 {
   void ClearCandidateList( void );                   //清除输入法文字候选列表6 u8 C$ O4 X/ X* k
   BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表
( z5 d0 E% m5 B) a3 C    BOOL ImeIsOpen( void );                            //输入法是否打开; s. n0 q) b8 ?8 t9 V8 S
   void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息
( h2 I& s. S* K$ ?/ n    void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息, I" a, T1 F+ @! U
   void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
: G5 X, e! F% w5 A0 P7 ?/ J};
  t7 ^& b- s, l6 }, t2 m7 a- B' `" C/ g; D) d8 ?, C
#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
( G9 Z6 D+ T7 p! b7 I* I4 h; V2 k. I

' B$ l+ i8 Q/ P- l; u) P' @. o# l6 C  \
//*********************************************************************************************//
3 T7 P2 F/ y- @4 M/ x8 L7 V  h! l+ v  z* h6 y
//////////////////////////////////////////////////////////////////////
# C1 j; d4 D( e4 S//
: u; k) c/ c+ O* i8 L// IM.cpp: CIM class (使用系统)输入法类8 f1 E' u; K* g2 u
// 2001/4/30 Write by Jerry Wang
' p( l7 N3 }: F6 n. z// 感谢大大鱼的帮助
7 d9 s* C1 ?( |# D9 j& B5 e1 \5 T// Need Lib: imm32.lib
) [/ Z( v1 F0 y0 s3 c4 w3 Q//
9 K# K* B! K, }: K) W6 s% T//////////////////////////////////////////////////////////////////////
' Y+ y/ |& s- m6 L5 P  p. v. g* e, n# V" H3 r8 k5 d- n
#include "imm.h"
" B+ Z8 l. z4 }- r: _
& R+ |9 Q" R& N' {: e& T//////////////////////////////////////////////////////////////////////
1 z3 C9 F/ N; Q3 Z' L// Construction/Destruction8 l  B& U. M' _/ {
//////////////////////////////////////////////////////////////////////" T, P8 k  {2 X  O# S4 x' y2 k
: n% X4 j% c/ L/ Y$ d1 M; S& z
CIM::CIM(); R5 E8 u/ |7 \
{
/ g1 Y) K! y; r# b$ t4 |0 `! P$ ~% R    m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];1 o# D/ j; b" J7 A
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
, R) L5 \* B' \# ?# A' r( V    *m_lpszImeInput = '\0';5 G/ L8 O( i" b  x' y7 B
   *m_cInput = '\0';. Q) J8 S# O' c0 n% K! `* I

7 K: w. \' }3 r% G6 a    ttffont.Create( "黑体",15,RGB(255,255,255) );! v3 E9 m& G- i' u6 r
   GetCurInputLanguageDesc();
/ M- R) t, k/ _}
% {5 h& b% _  `5 |1 t5 O/ y0 _) @& k0 K
CIM::~CIM()4 \3 o& A# N0 T7 j$ n( b2 O
{
6 H5 D  c! U! `, F& l% T    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );% C$ d$ o  B5 n

% Z. H# I8 y# W& V# F+ I    CHKB( delete m_lpszImeInput ); ' F, k' V3 |- X* W# _; ?3 Q
   if( m_lpszCurInputLanguageDesc != NULL )
5 @3 L: e5 u* h        CHKB( delete m_lpszCurInputLanguageDesc ); $ i: |( G9 q: y- z, f( o2 D" S
}
3 Z: u; d  g* y0 I2 Q$ t# S2 G
% v2 C3 L* w6 d( a) evoid CIM::OnImeComposition(HWND hWnd, LPARAM lParam)+ B! f; L0 W2 ?3 j! Y9 @
{+ Z7 q8 z- n/ P6 X7 z# k
   if (lParam & GCS_RESULTSTR)
7 ?+ I, A" b" l# H- h7 n    {
  v6 V/ _! S0 O. L8 P! S' R+ X: o        HIMC hIMC; //输入设备上下文; e% T: n; I/ @; D. A) ]4 k
       DWORD dwLen;
3 c  O& U( u3 K/ m/ V1 G6 E8 R        LPSTR lpResultStr;
5 S% V8 [0 _! I( H( `8 @1 }% m( Y
* |/ U3 B$ u4 c3 A- @- O$ p. K        hIMC = ImmGetContext(hWnd); //取得输入上下文# p5 E2 ^5 F& ^8 O. X
* x. J/ q% e3 h. j
       if (!hIMC)6 I4 N0 m( ~8 \- d  I" L8 {
           return;. y6 T: w. v. }( U3 i, Q

8 m' \& v2 I: j) u0 U        dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
4 A; \+ [) A, y# U; u        dwLen+=1;  F) G2 x! b* }2 S7 \0 s. ~

* P) K* ~  C  z. p! c( a6 j        if(dwLen)
, |" a. P9 R. z' {+ g+ F        {& t, H- T, D$ f; V( Z
           lpResultStr = new char[ dwLen ];( t, _  Z: M. p
3 y) n. L, z# Y$ k% ^  o( z& g! i, u
           //// 缓冲区已经满了4 [5 \2 D) p. _% x) R6 q$ ?
           if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )
0 M$ y$ q; e) s+ r            {$ z+ E8 `: a( ^2 A7 v2 R$ Z
               MessageBeep( 0 );
& N* z- q8 s6 U                return;9 ]5 k- S2 ]% D2 h/ [/ Y: V: G
           }. Q: N1 S2 A- \! U5 \
           ZeroMemory( lpResultStr ,dwLen );
6 z. N3 [3 T) r, }' q            if (lpResultStr)
  b& r5 \+ v: C# }2 d) z, E            {& x* ?) t/ t. Y1 b5 \9 h# G$ n' k
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);1 t( a. ]- \1 B5 R
               strcat( m_lpszImeInput,lpResultStr );8 t$ {! O- r* O" W2 r
           }
$ x3 L8 G$ O0 J( Q# x. N* [7 M            delete lpResultStr;- U. h- d5 V$ V
       }
* ]% Z' t6 V$ \% }' ]% O
, ^: P# v1 L4 k4 j        ImmReleaseContext(hWnd,hIMC); //释放输入上下文& K$ q0 K9 ~+ I, ~
   }  _2 l- ~7 F4 t/ z
' h0 V5 s8 O# a' p5 I) ?6 B3 P
}6 b+ z6 l& D5 q1 I( H9 M
5 M3 ?' P* }8 X! g. f. M
void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)8 h0 V) i, @( R% m% d) E( k
{
1 c% F8 a9 X2 W* y. ]# R    DWORD dwCommand = (DWORD) wParam;( g& A# w7 h- W6 W0 q6 W: Q3 i5 R
   switch( dwCommand )
/ \" W9 s3 r- \5 f# f    {% {! d2 P: @+ U( g8 D
   case IMN_CHANGECANDIDATE:' a) D# T# z4 ^$ U) x
       GetCandidateList( hWnd );# X" |. k1 M4 J6 s4 p
       break;. I$ W* {0 G( z; n# X
, h- [" {: @& F7 u2 g0 ]6 v
   case IMN_CLOSECANDIDATE:* O6 U' w+ P0 B. L
       ClearCandidateList();( c' Z7 T$ h, T9 k- a) X
       break;
- y/ T, M7 B0 S! d
+ J3 m( v) p' E  T/ x  N( L4 G! z    case IMN_OPENCANDIDATE:1 }( q( U; y9 h) r* [
       GetCandidateList( hWnd );. K) ]3 F/ o! k9 Y% u: N* ]  N) x
       break;' K8 c" N. R5 r$ w* u
   }
) x: T8 q  G3 @& P5 m) ?2 n}" d1 n2 F& ?. e7 H# l1 J
% R" s4 e5 y6 s6 E9 V: P
void CIM::OnChar( TCHAR ch )+ q! R5 L* G  L- `* e$ a
{$ Q& U6 o& w. `
   int len = strlen( m_lpszImeInput );: c4 c1 f. G: I
- k6 {( @0 y; Q8 V( n2 P
   if( ImeIsOpen() ) //输入法打开状态
) G. f2 I) Q* D" \, `0 y4 f    {
9 Q7 t, n7 B; _# J1 L/ H6 z" U( G9 [8 l# C! _
   }
5 {; `: ^: q" j  S1 Q$ N2 u; x9 m    else //输入法关闭状态
& f' W! P7 c$ o  \! {    {
. O  x7 o6 x9 W6 l8 N        if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母$ I/ @, O$ Q/ ^0 H( y" M9 A
       {
; R4 u. E+ `8 @- e# R8 ~0 `  l            *( m_lpszImeInput + len ) = ch;2 d# k7 X) C8 F' {
           *( m_lpszImeInput + len + 1) = '\0';
, x+ s+ i6 ~! d2 K2 j" N& x5 g9 N        }5 t" q! l" [: k& h/ j1 k
   }4 S: u* n( a) b  k3 R2 b
/ R; X1 u7 F2 H: P. E7 r# v4 A7 [& o
   if( ch == 8 ) //BackSpace字符$ Y( W& [$ f8 N, v4 L+ |" N" z
   {! k: X* y6 [- d, z) W( Z' j
       if( len == 0 ) //字符串长度为零) E; _- F. T7 z5 x
           return;
) K* t" |; c; M( H  u
7 y5 z1 e6 H- j' S6 k        if( len == 1 ) //只有一个字符
- R- \5 F. p# ?        {
% A/ i; Z; J( M# ?6 L; m            *m_lpszImeInput = '\0';
. _9 V7 Q8 o3 |# w3 s            return;
5 P- i, C- z6 _% z) O7 G        }. L1 P1 R' r/ u7 A' I8 O  o5 v
8 e3 J3 `- H: v$ p; q0 U* E" q
       BYTE cc1,cc2;9 ]# e; N+ F3 ^! [" A
       cc1 = *(m_lpszImeInput + len -1); //分离字节
, r3 K1 ^+ e2 x. b# e        cc2 = *(m_lpszImeInput + len -2);
' [! |4 R4 s+ N+ h0 ?0 }1 s7 `  R7 |3 O  P; f& L. k
       if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
0 I6 p, |2 \( V5 R0 q# [            *( m_lpszImeInput + len -2 ) = '\0';
$ }1 L' f# k* q. q1 V' V        else //是英文字符(单字节)
1 [4 }, ]* S6 l+ ^% }: Y$ U6 L            *( m_lpszImeInput + len -1 ) = '\0';
' ?+ y' {# f. M  D7 m    }; {* P! n2 U: S1 ^% R
}
2 J0 C/ ~! ^9 i7 k, x! R. d8 R% [6 j
BOOL CIM::GetCandidateList(HWND hWnd)9 h9 E8 |8 U" l$ o2 c# k2 e* [+ U
{
4 P6 B4 r8 S, x' ~; E    DWORD dwSize; / T. ]! I( L8 G7 \0 ?9 q: d
   HIMC hIMC;( _9 P9 ?% R. ~% \) {- S6 [* w
3 z1 N% \* o2 R
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
0 O% U& {7 a5 j+ t2 K! Y0 l0 g- P9 @. t- t& E0 V
   if( m_lpCandList )+ v% l. [! S( j) J2 k
   {. W6 _9 W3 P( [1 N  M% r6 u
       delete m_lpCandList;, J, ^- M5 \8 t1 o5 M( P
       m_lpCandList = NULL;
1 n. _* o' R0 A7 u5 @/ w    }
$ w- O( j+ d6 w% s! T3 b
$ P* I! O, z4 Y8 Q    if( GetKeyboardLayout(0)==0 )% z* p9 c: a0 n; _9 @7 V
   {; [( v9 Y! {& m$ v& y" O! e; X; A5 w
       return FALSE;5 X) l' l' z" _% E$ S  S
   }# @$ ?' m) i7 B3 f: [

4 L" \6 V. T2 j) f% l" Q1 ?" T, O" d    hIMC = ImmGetContext(hWnd); //取得输入上下文5 r7 J6 P$ \+ m* W1 ]
   if(hIMC == NULL)! l* |# j! z+ O4 [: l
   {5 W7 W; z* z4 J  j) T! }  {. V+ L6 \
       return FALSE;8 K/ v& {, P* G/ }" `4 |5 {
   }; H' t) F2 ^3 |0 P! S+ I

" W& P1 R- ?; m8 x4 n    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
7 ]" A( t6 w0 a' Q    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0)) ' e, h8 j6 L" }
   {
' Z' s5 Z. {8 P& \: X7 v( X" f        m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
  {1 N8 z( _- o6 t        if(m_lpCandList)
1 d3 b3 I1 c8 h  o        {( i' S0 [+ e# s  Y' \; ~& N
           ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);
3 p7 S& H: Q* l5 f% c: w/ L            CandidateToString(m_lpCandList);) x0 Z% H% o$ y. A2 F4 O: G
       }
+ H. h' v, l/ k; R# ]& _; L    }
  O3 G: A1 j7 U2 M' f* F: o
$ f  ]9 n  q$ F: P$ Y9 o1 V    ImmReleaseContext(hWnd,hIMC);
1 x7 ~$ T/ o$ Z7 s" @  M% m, Q; C. U8 V3 \" k+ y- q
   return TRUE;& X4 S) \$ U8 s: F
}+ @8 x6 A- t" K  I4 f  L5 |
7 j; W) P5 C0 S1 M0 ^
void CIM::ClearCandidateList()
! e  F7 B/ ]- x. X{
6 Y. x% F8 H5 h. s, u: e    if(m_lpCandList)( b/ {  I$ _2 W) L- x
   {0 i* o0 x; G8 h% u% v6 R
       delete m_lpCandList;
' d/ I; J7 _9 g/ ^& H9 C        m_lpCandList = NULL;. f1 Z! u4 `, Q+ m# k4 S) S
   }
3 h6 k# O  y; a8 K( |$ q    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );# z3 P& p( N: k2 s: D/ I4 z1 V% w! @
}+ y# {$ g4 W, K1 B, X  l* ?$ v

1 O& u* v, e/ b# Y' v* w& Y6 g
' v; ?0 `$ u4 O. w* ^6 KLPSTR CIM::GetCurInputLanguageDesc()$ f, n/ P+ O& m) S
{+ @1 I( T0 x/ S" G1 ?! s  G
   HKL hKL = GetKeyboardLayout(0); ' ?. Q0 `- x& ?2 J# z9 q
* I9 y+ ?0 @0 s) [! S9 i/ N% ~
   if( m_lpszCurInputLanguageDesc != NULL )* m0 n7 x8 H& |( M8 x
       CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^$ {5 @' _0 K5 Z+ R& r! D" c
8 f3 J: C+ i" j! C) g
   int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度
# ~4 u+ e' v. y. T; k" S- P6 i6 G2 X& h
   CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
! S  g- g% @, E7 I4 f2 [
) d0 r. w) [4 \0 F    if( lengh )
1 S/ W% _+ T. \- @    {5 q4 F7 V5 c2 z+ J5 `
       ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);. h) Z$ U( K& q: h- _* J( }% I
   }
" d, B. q6 l* I  B    else
. P. H, W4 }5 ]: D    {
& g5 \! c1 o0 R. P. I        strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );
8 C" M! a8 @" E% W! u    }
  Q7 O: |! `/ N, k  m9 V$ A& _, y3 w/ D8 o3 {: t. y4 s
   return m_lpszCurInputLanguageDesc;. O, k0 u* b+ H+ v5 U# E
}1 g/ o5 _- g5 |1 O  x

0 s8 S" U4 Z  y# i9 |. c' f3 Pvoid CIM::UpdateShow()( I! j1 d$ E+ n8 s9 c
{
: o6 s4 F' R7 O' u7 t    POINT pt;) G( b/ M2 p* e7 Q
   pt.y = 450;
! j6 v9 t0 F* m* ]$ ?! J4 D& {    pt.x = 400;
2 x, Z4 [& s7 ?5 J) g2 J; }& y8 @    ttffont.SetSurface( DD_GetBackScreen() );+ X; M& s: x! V! x* Q5 w- T! u2 x
   ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述
* B) l8 n* ~  G
& p3 N; D4 ~5 K3 m9 [* a( j* L3 v    pt.y = 420;; _1 j: y5 ]8 u
   pt.x = 20;6 o8 M& S9 ?: o
   ttffont.ShowText( m_cCandidateList,&pt );. Z0 _( M$ z) B! t5 p2 J  Z8 @" S* w
$ T8 t6 E, E; X9 {
   pt.y = 450;% o! f8 K' F& \" [4 _9 {  X
   pt.x = 20;5 ~8 U; |  }( t5 L. w5 ^- V
   if( *m_lpszImeInput == '\0' )
. Q0 T+ N8 g5 @, k3 m  Q1 e4 `        return;
5 K- r( C0 u0 H
: G& ]9 a. k' x5 h' v% W7 ?8 n    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字' O! [' @: H) }  t* K  p( ?- @
}2 t0 t. w/ g& G
: \) \. C/ v. w- \1 a
LPSTR CIM::GetResultString()$ A/ P; k. Q' I5 P0 l* F
{
* Q, u8 A6 O% X+ ]6 x) Q    return m_lpszImeInput;
7 d4 X" O  U+ t}' s2 j( M, o3 W* g

/ U7 g" C4 v7 i3 sBOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
5 p& z8 C: L( u  O9 l{
# f. V' W8 I& ?5 O; x    if( !m_lpCandList )( D7 W$ R; S% n! I& V; D5 o
       return FALSE;6 z* g2 F3 G4 Q' Z; @
6 R8 |& o% b' e+ m( c. {
   if( m_lpCandList->dwCount>0 )
  N7 s6 Z3 v( s8 V% [( A+ i- i    {
1 Z9 c% ]7 d& P8 R+ g0 }# l        LPDWORD lpdwOffset;& ^& D. E' A, ]- w

* u/ _% `7 }7 X        lpdwOffset = &m_lpCandList->dwOffset[0];
# L0 S: h0 ?) m; ]. J
9 b, r6 Q4 M: X0 h7 t) s: g) d        lpdwOffset += m_lpCandList->dwPageStart;
3 Y" H! E( u% ~& d7 v3 m, {7 C& k" v. w* r9 _/ {
       ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );4 G6 c- q0 ]& f( v- P! H7 c: i! ]
" x4 L3 K+ H1 }
       DWORD z=1;
% c/ I: J2 E( A3 h( e        for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++)
7 [1 N. e3 y& C        { 8 a" S! f' U3 r
           LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;# ]/ e7 ^; i! n  r! m! @
           char buf[255];
$ q0 @' l! `  g! ], d            sprintf( buf,"%d.%s",z,lpstr );5 T: _* `, M# s* @+ h% E
           strcat( m_cCandidateList,buf );1 q# v3 M* Y% s- Y- }7 u2 T
           z++;, Y7 r1 W: W1 b. S# c$ Q/ C# {; W# H
       }
. Y5 k: L. g, C4 {. K- H+ N% O
9 s: ?+ B( i7 w        return TRUE;% Y  N8 ^4 D  A5 j
   }
8 ~) d8 f! t7 p! C' x1 q! B. p
9 r6 e) O4 `# T9 X0 L8 z    return FALSE;8 A; e; s. _2 ?- U9 M8 N# X# a
}
6 q, @4 e" o7 h- B" ]( O. @
1 |* b! g. _! ^: FBOOL CIM::ImeIsOpen(); `4 H, L# p5 M1 T6 z
{4 v1 q; j. F& O! r2 h- Y
   return ImmIsIME( GetKeyboardLayout(0) );
9 s! d$ Z. K6 w}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:39 , Processed in 0.019265 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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