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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//
2 C( l; A! Z7 X( S//
! l/ {5 \  H" m# V+ o1 j// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家
( p3 D  ~: ^4 m) U4 `5 k8 y+ m// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)6 }* o3 X3 @3 H5 f8 A3 a4 y7 i
// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
) q/ z9 a) ?$ m& C0 [8 H// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT- w* [+ ~7 z: B# `+ M
// 为显示信息用,可以用其他方法替换如 TxtOut() 等
* i& D; H- q0 Q# C* H1 ?//% Q- R- W/ G7 p/ _0 s' q1 w9 n9 E0 q
//******************************************************************//& h% _( D! _# w& Y. Q& ~# m

' Q' y$ p! Z+ C& o0 Z* q! ^3 R" U//////////////////////////////////////////////////////////////////////8 j5 v5 B8 h1 x9 Z
//0 Q* n) M. T0 u( @( K
// IM.h: CIM class (使用系统)输入法类7 Q6 r* f+ T1 f) @, v: C; L
// 2001/4/30 Write by Jerry Wang
8 F' x7 S) y% M! o2 K// 感谢大大鱼的帮助
; f& A4 k# w' [) l' K7 O/ k7 `  j// Need Lib: imm32.lib
( u, H5 m3 A$ _. Y/// S8 y- V+ j# t
//////////////////////////////////////////////////////////////////////
/ e3 T: ~$ X8 b% N* \
7 }$ P5 c% X. I#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)/ L+ d9 c5 Y1 _2 S
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_' J3 U+ g$ @' T( |/ f' v& ?+ |

8 x+ f" s6 R! e, O5 O  Q' U% t#if _MSC_VER > 1000% P, x9 @8 I( u+ P9 S( {( y
#pragma once. ^' D  L4 w. E- I% g" T
#endif // _MSC_VER > 1000
( ?$ I- a& y+ Y  E3 N
. P$ C0 r; k6 C4 K#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数! s1 N& T: b9 I( r& P5 I' r

9 S/ Y( M: m1 \1 L. {- c% c#include "FindMe.h"7 u$ S" ]' ]2 u

0 k( k$ S+ f7 nclass CIM
, u  c$ C' z- E. g3 |9 u{
5 Z7 C1 G3 A& s! J- T  ~$ Cprivate:# _" l7 ]( F% N- h) K
   CTTFFont ttffont;                    //显示信息
; t+ F6 q  v$ c' L! Q- Z3 n    LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表
7 R' b$ L  L& E, E    LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针
; q( {$ g: c$ z- `$ R2 z    LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针0 e0 _; x/ d$ Y- i1 ^
   char m_cCandidateList[255];          //候选文字列表缓冲区" F: {' F* k7 d, {2 R5 D% W( V/ r: Y
   char m_cInput[64];                   //输入的字母* }+ S8 z% F. l' e# V9 D
& V( ]4 ~3 @5 F8 C9 S5 F3 T
   BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串. A4 U6 A6 f; C5 ?( j2 g2 M' @
5 x+ D8 L3 q- A4 }. e3 H% w
public:
& H1 A8 Q. P0 |" i& {" P  \- Y# e3 o) ]* y. o
   CIM();
/ T0 }/ c% g! a7 `8 x    virtual ~CIM();  f: [3 y$ i% A
  [: X- b; {. O7 i) ?7 M* K. d& i7 ^
   LPSTR GetResultString( void );                     //取得输入的字符串  t; F- m, F1 x* v0 s
9 b( V1 i0 q4 ]8 g- ^4 V
   void UpdateShow( );                                //显示输入法信息
& i( C! }1 W' Z" L/ G' T' M, E& p6 T4 p- X# R4 R4 q* i! `
   LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述9 c& k- X7 r; X4 [; X
   void ClearCandidateList( void );                   //清除输入法文字候选列表
, I' Z2 w& P5 |4 }    BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表. @+ }. `( `* {$ C  W+ x2 s
   BOOL ImeIsOpen( void );                            //输入法是否打开
3 A7 q7 W  b: v) t1 i    void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息/ J; k2 D4 K) i* v* n
   void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
% Q( R/ A7 {+ s8 V% |    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
8 Y' {5 c/ i5 ~0 c) R- f  j};
# B  Q( f1 m0 H: z
; D4 u! l( e: c#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)" |7 g- X3 p( x7 \5 B" b5 v
# J) t( ~( D# h$ ?% W2 b: c$ ]7 ?

, a" R7 o4 f" Z- w) M! {: j# {
/ i. _* \9 g* R//*********************************************************************************************//
) g( `5 }$ b1 n- k( F  X1 i9 S6 o! i% F: |
//////////////////////////////////////////////////////////////////////
1 w) h0 j' _2 {! t/ y//: k) K6 e! i8 k
// IM.cpp: CIM class (使用系统)输入法类
6 k% ^. T4 n5 H% o// 2001/4/30 Write by Jerry Wang- r% G/ `) u+ [" I
// 感谢大大鱼的帮助
6 X3 }: C& O* r+ g8 Y) o- ~// Need Lib: imm32.lib/ e2 L" ^2 m% g$ g% L
//
5 S( k" B. R$ k# p1 W9 W//////////////////////////////////////////////////////////////////////
/ w& x9 a0 Y2 h1 {5 S9 R! ?1 q6 k# E6 K# s$ H
#include "imm.h"3 R' Z  c' q! I4 Y3 O, g8 d

( O0 S+ T& a3 |( I3 ~//////////////////////////////////////////////////////////////////////
& G7 i6 j6 w) @, g, E* R// Construction/Destruction
  |0 s: ^  i! d9 B//////////////////////////////////////////////////////////////////////8 Q9 P% |3 x' [

( u9 G. g$ ]" U- j" mCIM::CIM()
5 ~7 _3 z& D  Y6 z8 u% T0 A' Q{
( v2 n& @# X6 H0 y8 d    m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];: ^4 z. g7 y. `+ N! L$ ?
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
' K0 r# O$ P4 F5 a    *m_lpszImeInput = '\0';
/ i/ I. |) G- ^1 n, h+ X6 M" m    *m_cInput = '\0';
, Q: r0 Z& t! _/ @0 S0 h  v: y
/ E; g! F* v' o: ~1 [    ttffont.Create( "黑体",15,RGB(255,255,255) );" l! M; p/ o& |/ g- t/ A/ T( d
   GetCurInputLanguageDesc();
( O$ W! o. s9 t0 R, g* |. C6 m$ f}
8 ^' J& a- {/ g
' A* Y! x3 w* q/ GCIM::~CIM()6 |/ L# A9 L' i3 b
{
- v2 q8 `# t( Y: n$ F. Z# H& y    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
3 y6 F; Q% _1 K* m" {/ E% ^/ d# m1 A! _
   CHKB( delete m_lpszImeInput );
& a6 X) B. A9 U0 [8 I7 V2 N2 b    if( m_lpszCurInputLanguageDesc != NULL )6 k4 l, B5 a1 x/ h8 ]- G: h
       CHKB( delete m_lpszCurInputLanguageDesc );
& S1 ~# n. a+ O+ S7 m}
! C' e) H3 {0 A0 e' }$ P
6 @- E4 ~0 F4 O& [4 H# s( ?void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
9 A( g% c; m8 O% y6 z# \{/ }! ^2 y$ K  E
   if (lParam & GCS_RESULTSTR)9 W; O( y& M2 v. l% Y3 |0 e
   {1 C$ t0 {6 a, G0 d' h$ `
       HIMC hIMC; //输入设备上下文# T3 i% R8 ]+ E( T) }8 P% s
       DWORD dwLen;$ S& @6 A6 `5 e/ G
       LPSTR lpResultStr;( f) p' o! i# j# k+ y+ o
: |+ c% p- K) {3 L
       hIMC = ImmGetContext(hWnd); //取得输入上下文! {: K8 q3 x0 v

+ ^/ K/ I$ l3 D9 `' t        if (!hIMC)6 M9 ?- m, Y4 S$ M+ u2 z1 F
           return;
5 Y- ^0 N  F4 G1 W
- |( S1 [/ J: v; H$ s; `$ s4 R$ A        dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);" u4 `% W  M! V6 ]% ~: Y
       dwLen+=1;: F' q# y% Y1 U6 U9 C" c; z
8 t- H/ f8 J3 n* f, H
       if(dwLen)
& Y$ a, y+ {  {: [( o- o6 l6 q) y/ _        {1 w8 g! l: N9 O: k5 d( W
           lpResultStr = new char[ dwLen ];: s" H( ^3 ]6 R, T

4 h  X8 ~0 @& z: R# G            //// 缓冲区已经满了
! D  N: ]6 u0 p9 T) B0 z            if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )# z( n  m; f/ e3 E3 x- i
           {
# l" f2 M6 X. n                MessageBeep( 0 );/ \( Y' P% @4 n/ \8 n$ Z0 j8 F! T
               return;7 N/ [1 d8 _& _9 U0 F% J" u: v8 O
           }$ Y+ l5 T$ W) s$ c5 q7 L6 a
           ZeroMemory( lpResultStr ,dwLen ); 0 J' y6 y" h: _0 i  F$ E( A
           if (lpResultStr)# ?  a4 s0 o9 I) [# H1 }  l) [, V
           {8 m$ r: ?! P! i* F0 |9 E' ~* \( F
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);/ \5 |5 n; n/ _5 |" m. H  ~
               strcat( m_lpszImeInput,lpResultStr );9 v# B: o" y- h" O. M
           }
; X. {% D0 K1 Y6 [9 q! Y            delete lpResultStr;/ G4 a/ K( L3 \  Y6 J
       }
8 f1 @0 e  `, g( M& U
' j  h. t# E3 S        ImmReleaseContext(hWnd,hIMC); //释放输入上下文
1 u$ Y0 Y( d) [& i2 B7 X    }
" W% J7 c( x% _) `# T  e) o7 Q# V% k! D, }: _- H
}- T! q. \* k  w( v  e  p7 B; ?6 u

  n$ K+ }- q8 k& h! v+ uvoid CIM::OnImeNotify(HWND hWnd, WPARAM wParam)6 e! w1 {7 _. Y9 C/ _! n
{
* r1 A  b; N) h0 x4 Y    DWORD dwCommand = (DWORD) wParam;2 O- }: B3 I! O
   switch( dwCommand )# O7 \$ A, K, N
   {5 Z+ D1 U% {1 Q  W
   case IMN_CHANGECANDIDATE:
: e/ V$ ~& d% Q% U# D        GetCandidateList( hWnd );1 `& [3 d$ `3 y* ^
       break;
: W# w+ x$ Y! ~8 p5 d; I! `8 k- a$ w8 p4 c( [$ `
   case IMN_CLOSECANDIDATE:8 s6 Y! g0 p' Q/ X
       ClearCandidateList();
2 D6 s5 g/ x( n, ]% Q  Z# b        break;0 u1 D& s" g  S; B6 t: l) r
4 k4 A, g5 x2 G, V; E
   case IMN_OPENCANDIDATE:
" i) S$ t8 e; W) L        GetCandidateList( hWnd );3 I2 z5 Y9 k+ p  \# d  q
       break;: z: \, X6 a4 z/ d  Z
   }6 Q9 u+ i, `7 K+ v1 S, ^; c
}6 x* Z+ o- o! p$ a

" E9 w( d8 g9 M8 Nvoid CIM::OnChar( TCHAR ch )
/ k* N! n6 B" u; F6 L4 c, a; `{" d6 t! _+ N, H4 `6 [0 H8 u/ T, O
   int len = strlen( m_lpszImeInput );
$ F2 }% _+ }& J! C. H4 H# J  L+ F1 Z% A8 b* u$ A/ i4 H- q
   if( ImeIsOpen() ) //输入法打开状态
* C# G2 _" u2 u! ~    {
  I% H3 P5 T9 d2 K  @2 F
8 A8 a1 D2 T9 N: i, ~8 _& V( X6 y- B    }' ^. R/ G3 ^+ f- }) t% O
   else //输入法关闭状态' x1 B' t$ S- I, w8 e' x
   {. {3 B7 R6 A9 \5 s. [
       if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母
  `7 r( ?- l- ]/ E; e8 q- w        {, E0 d+ J' _( @( p9 H
           *( m_lpszImeInput + len ) = ch;9 v+ h4 J: `' V6 K# B$ V1 I
           *( m_lpszImeInput + len + 1) = '\0';
# B; V: A, L0 E! I. f2 e! M        }
/ l+ B% F# h# b7 m3 w    }
0 D, V5 c( J1 ]/ r& a+ X+ y2 ~* i2 w0 l, R6 e2 H: a& O
   if( ch == 8 ) //BackSpace字符- R: S' j& B. Y5 b! h
   {
3 n& t% F1 n" b4 z- X' t        if( len == 0 ) //字符串长度为零1 h1 z5 p5 V8 k$ [# R. }/ e  u8 j
           return;
3 m( G$ ]0 r. F. I* Z/ M
! s6 }5 V0 A, N8 C% R. J, H; A        if( len == 1 ) //只有一个字符
$ G% P( ~2 j0 m. p        {
8 D7 C* ?5 J' y/ b. Y8 a            *m_lpszImeInput = '\0';
2 Y) g( Q: |3 R. ?# I            return;
. `: J  P5 d$ y1 Q* {% Y8 w7 f$ S" x6 n        }
! T& D4 M$ |& w$ U
  O3 o: m3 G! }, v; K+ M        BYTE cc1,cc2;2 ~  o' k0 J; r. B
       cc1 = *(m_lpszImeInput + len -1); //分离字节: E* p4 |6 B5 V* O/ _# d' V/ B
       cc2 = *(m_lpszImeInput + len -2);. N+ U9 _% K9 L$ K
# ^0 z; G. _8 ~; A1 g6 w
       if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
3 H$ k' c- Y8 ^1 h            *( m_lpszImeInput + len -2 ) = '\0';
4 h  K' m+ ]5 D4 \        else //是英文字符(单字节)
9 {( E# g( B2 c& a) t            *( m_lpszImeInput + len -1 ) = '\0';
, u+ D! \$ H* M) R5 o* F/ ~    }4 e. A5 y+ U2 g8 Z
}$ w) ^% h; L& m/ \

" O6 R* A* T2 \. bBOOL CIM::GetCandidateList(HWND hWnd)8 ]& l# Y! ]! m5 R- l
{
* S9 ]  k2 `' Y1 _, _9 `  |! e5 U    DWORD dwSize; ' ?2 n! ~$ ~( d- l1 P
   HIMC hIMC;
% r6 ^% }/ r; L" y  V! P3 J
7 u6 W" |& P* a, i( V$ h    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
5 J  y; d; ?+ w! T' i$ W  T9 B: [5 e7 W
   if( m_lpCandList ): ~4 `4 S1 T' Q- i; c
   {& _! C7 J8 U3 k: C& S7 E
       delete m_lpCandList;
8 z! S. d. y  ?        m_lpCandList = NULL;5 F+ ]4 h, G  V+ _2 L9 h
   }
: D# ^+ A, _# U
" x7 O  ?' r9 `  b    if( GetKeyboardLayout(0)==0 )
" T' a# j& O/ ]  O    {
* M) @7 o" j5 Q( P+ q! p& m        return FALSE;$ n/ {  L/ ~! `! b: j( T3 j$ f
   }
3 U6 @5 b: `; {2 k. @5 i" c* I2 L: Z  s! d; N
   hIMC = ImmGetContext(hWnd); //取得输入上下文* V7 \+ f/ I( B$ h- M0 F
   if(hIMC == NULL)
: u3 R3 j  s1 x    {2 w. J  `1 E$ `% J& E& ~
       return FALSE;
8 ?& P% O2 g, Z' t+ |+ d9 a8 A    }
$ y: h8 g6 B# `) j2 c' w5 q" `1 J! W
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
9 V- y5 z# _; U    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))   Z, [# H" g) T; Q, K4 N# G
   {% P4 f3 v  N& O3 c* z
       m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
5 D) K# J; H! T7 X8 \        if(m_lpCandList)
$ \/ H' S, G  b: z' @        {
3 L* _% E4 ?8 T            ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);0 q3 L8 R2 q4 C9 D
           CandidateToString(m_lpCandList);% M" X  T  A$ R' _. q2 ^! X
       }& r6 v* U0 i; ?" h( ~4 b) d3 U6 Z2 N
   } : x( L) l2 Q0 P" q1 S( z

/ W) s$ Y* {2 }- M% {    ImmReleaseContext(hWnd,hIMC);8 J* @5 N0 l4 K. c) N
5 J5 s/ S3 W, f" A$ A0 r9 j; |6 K: }
   return TRUE;
- ^  |- j+ n! b0 s8 @}+ w; Q1 y/ n& H& |
5 |/ j8 P; l& B2 b! s. ~
void CIM::ClearCandidateList()4 _* B/ a* S3 h: T
{6 \# L* k" D5 _: H; P
   if(m_lpCandList): x* W" s7 R8 }( A, f
   {
& V3 @& x4 c* g        delete m_lpCandList;
) |9 k$ L0 j/ ]/ ^# e! j. N9 H$ g1 p6 ~        m_lpCandList = NULL;, a  {) e" k/ J) p# [# M
   }
' {: O; |! l3 T6 Z    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );- _! a, O5 V# L+ {5 Z
}
- h, O6 P& w7 q  c* K" @$ ]# f& m& q7 j$ K  h5 e3 D

, i! q! d. Q" O  FLPSTR CIM::GetCurInputLanguageDesc()" u( U; |" Q6 a$ Q
{
! M1 W1 p+ |; B6 n) y4 @7 W! t; z( T    HKL hKL = GetKeyboardLayout(0);
7 l* k% Y# C: A
8 V, ]& u9 C9 R; |8 H% {    if( m_lpszCurInputLanguageDesc != NULL )
. n: O- p1 x7 g. J/ ~) l0 P2 J        CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^* p1 e, c2 ]" b% ]
( E  Q8 \# B4 @, p3 l- D" u3 O
   int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度
% A0 N% d0 Q& c$ U2 r) }8 L3 ~' c, S+ a8 u& b( t8 o
   CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
% B& B9 S- L1 [5 D. j& @$ l' x* H# p7 Z6 x0 C
   if( lengh )8 Q1 ~  u7 g0 p
   {
; `$ V8 L4 q1 U        ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);+ K; z( w7 k1 x% I
   }5 |! R- v) l9 R4 _6 N# `2 Y
   else# U$ D/ ^5 ], R, H$ U5 m
   {
# Z& |3 Q0 p$ d, M        strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );0 E- Y7 H1 K2 u2 O3 ~7 q
   }  W7 ^) D/ c. J) ^* T9 z4 i4 M
- N3 {9 h$ S# D! g' [* u/ E" p+ p
   return m_lpszCurInputLanguageDesc;
5 E% j4 m! ]0 g$ d; k1 E7 i$ X}
( j# o0 x$ k& e. t' L" Y9 q. f+ O1 h, X- x! @  y
void CIM::UpdateShow()8 A5 F' ^& @5 `' B
{
7 }' d; Z. @( @8 S2 L" M4 ^+ Q, z    POINT pt;, {4 \) l  M# y, l# x: x
   pt.y = 450;
- X% G7 a# w; q2 m4 F9 R. R1 X" `) `    pt.x = 400; 4 l$ i+ K( P- S; N
   ttffont.SetSurface( DD_GetBackScreen() );9 x5 E2 S$ y& R0 |/ U5 I1 ^
   ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述2 r' J0 O; e% o* z$ s8 @+ {
3 V! W$ v. ]) [1 d
   pt.y = 420;7 x1 N" `; Q6 W1 g- v8 f0 ^9 O
   pt.x = 20;, z  Y7 L3 \3 f9 h8 Z: r
   ttffont.ShowText( m_cCandidateList,&pt );
) N) p( \$ H/ f( O3 O6 D) ^
7 l! p0 k' U& g    pt.y = 450;  y/ j: H& Z3 x- m5 R1 A# Y
   pt.x = 20;" H: I" _8 M( R0 i
   if( *m_lpszImeInput == '\0' )
* O( T- L  F" |+ {# W/ v        return;# E* @3 g6 m2 K/ G" r( ]3 L

* f9 U; [4 b* A2 N2 r    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字# r: h6 O! P2 S1 ]2 t
}9 A" u$ f8 R: y

$ h8 d: C- K( I! t( \LPSTR CIM::GetResultString()
% @3 R+ F2 I& C8 b3 m/ P{
6 s# E/ L# S6 F. L9 ?    return m_lpszImeInput;; y4 G$ {. ^( Y: M) u" Q; J
}
7 J4 V. P/ m9 l- a7 r) s
2 M: |; Q2 T4 S& z$ O! L8 {) uBOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)6 I( j+ ^. b- v# ?
{
- g8 V3 G' V: k    if( !m_lpCandList )
) ~1 A- m1 e/ K5 g0 |  v2 D        return FALSE;
  b& ~; T) L( G- Q) M# j: _4 x; J5 J$ P6 m* l
   if( m_lpCandList->dwCount>0 )
2 I3 f. M$ E2 D. q3 o/ |    {) L& ]% Q  p4 S
       LPDWORD lpdwOffset;9 R  t9 Z! f) u. ^/ v% j0 d
( l$ F/ h- _- X* d9 }
       lpdwOffset = &m_lpCandList->dwOffset[0];
5 X1 T4 E9 n7 n8 c: J( I
' V; G; \& H# x+ K        lpdwOffset += m_lpCandList->dwPageStart;* k7 z% \% o4 {; C
+ K% E8 s" l3 [+ \9 q
       ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );
6 F, ]4 q- Q, h9 |' V/ [6 h+ x3 T
3 j' Z8 Z' |$ s, H        DWORD z=1;
) q$ D3 @3 T8 R  o. s        for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) 5 O2 C0 c; h$ l! h- S
       { ' d' a/ ^8 |8 r
           LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;
9 B/ I# |1 I* {0 u  J1 _) ~; |            char buf[255];5 L: M2 G9 a' F: F8 p3 p
           sprintf( buf,"%d.%s",z,lpstr );/ H+ ^' N" m2 O- h
           strcat( m_cCandidateList,buf );
0 j6 [% @0 b% t5 D9 \+ C# X            z++;
# a$ T0 [! y3 P% U$ j% X; H        }
3 M* B* e2 [( t+ d8 v) Z/ |& \9 f' R; O- y6 j
       return TRUE;" z' ?$ S4 j8 w7 m( p5 H+ ~7 `) r
   }
3 m/ C$ _" I4 X# g- u$ _5 z, {: Z' O2 ~/ \
   return FALSE;  c' J( q* m) a3 f! j: P5 s
}
+ L7 c. I5 p) [$ }7 ^+ _% v1 C- ]$ Z$ f; R) \* W
BOOL CIM::ImeIsOpen()' W( |8 Q. {2 o0 [! c% G5 W
{5 c# z8 g+ v+ t
   return ImmIsIME( GetKeyboardLayout(0) );
2 F! m3 v2 \1 x$ L* k  W}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 21:34 , Processed in 0.022323 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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