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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************/// W$ T. n" K! _8 v3 k& s
//: W5 e$ p8 L+ Y" ]  G$ y9 i5 N
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家
# W  }+ D: z9 f& K; d9 y+ p) U// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
! `3 {: j0 H; L: w8 y// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
# t0 [1 n. G5 u0 C5 k9 M0 A// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT
9 q( Y5 Z2 a; P; o8 X$ |$ U& C// 为显示信息用,可以用其他方法替换如 TxtOut() 等; d; g; ?2 P6 L$ q# Q
//7 r# ]8 {+ Q4 ~; a" R1 R0 C8 X
//******************************************************************//
/ T6 \4 m$ M0 R7 X# R1 c/ Y2 H6 M/ w* m" }1 @3 m
//////////////////////////////////////////////////////////////////////5 O. [' H5 f9 k3 U
//
. n" g5 a2 o- Q3 N6 i& D1 o// IM.h: CIM class (使用系统)输入法类
, I# H2 S0 ]" {& i+ H& N# ~// 2001/4/30 Write by Jerry Wang
8 @3 @" A, ]! |( A0 }// 感谢大大鱼的帮助
& W* B% j0 H8 c3 h// Need Lib: imm32.lib3 {% M3 Y* O( u. f
//2 D6 p% I6 o0 U* f( x- C
//////////////////////////////////////////////////////////////////////" X9 C% a8 e1 L& s6 d  D
# A% S+ c) z7 V9 @6 H
#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)# `0 G" {+ d3 a1 [6 i, {- h2 f/ b3 D
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_
# M- o9 E. t% O0 V! V. J1 b
# N. N0 ]) b+ e7 Z# ?#if _MSC_VER > 1000
7 o4 o! ^6 F/ w8 n#pragma once9 l7 U* a6 H6 Z5 |, g8 k( u
#endif // _MSC_VER > 1000
( c3 F0 N5 n: {3 |' }/ D* {& g; I/ e$ O; [' U: p# }4 v8 X
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数
3 n7 x, N' m. O' [: ~' {  K4 {8 |- R; E# K6 W" j; m* `3 [
#include "FindMe.h"
0 N! b& q' ]" {" }+ l* c" b: m7 W5 \
class CIM
2 _/ F* V# b& h% l1 V% ~; G5 V3 y3 r& q! J{
0 ~1 m, n" \; O( A* f. x+ Vprivate:
0 ]6 h* a1 Z' }  i* B$ t# P1 b; P    CTTFFont ttffont;                    //显示信息
9 a# U( Z0 C  V7 ]    LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表
7 U. z7 [% o2 U, }. n* z, @    LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针5 G/ K* s4 F/ @; L, s
   LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针' M$ D0 x+ c# x+ X( q( @
   char m_cCandidateList[255];          //候选文字列表缓冲区! l6 b( r/ V# O8 s- f5 k
   char m_cInput[64];                   //输入的字母
6 _2 I/ E# D$ Q+ f9 l9 o1 ?7 Q0 p4 I9 Q8 I3 y
   BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串
5 J1 R9 c4 Z- O; I1 J/ s0 t
' K, u* o7 S0 r7 o5 h5 R" Opublic:
" b% n5 S5 P4 d$ I" [, P+ j$ j" G/ O
   CIM();
% e: D2 z8 `! L' e    virtual ~CIM();
- L) P9 x; A' B. B* ?% g% P: |! K. i; }; Z0 u0 r; C
   LPSTR GetResultString( void );                     //取得输入的字符串
0 ^' r/ B, b0 i6 n6 f
$ ?+ ^) r, V0 p7 s9 c8 G% B2 z0 _9 ~    void UpdateShow( );                                //显示输入法信息
. ?# c/ o0 q% }5 C9 j0 S) a) s. e! S5 A) k- w
   LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述
% J! ~- K2 ?" w    void ClearCandidateList( void );                   //清除输入法文字候选列表% x5 R0 v% k) s" F  P& ]
   BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表/ j  L( Y9 P  R2 V  _+ L
   BOOL ImeIsOpen( void );                            //输入法是否打开
1 \9 Y- n: n6 P9 t4 F    void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息+ E* F  u* H( C: {3 w- Z
   void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息  t  g& t6 g- ^; I1 Z7 K
   void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
9 n: ?% W: X( R- G. E};- Z& b7 v' w5 T5 P
! M5 _; g1 E; l' q7 r. T
#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)) Y" u0 W$ S* t3 K1 p

! t: @0 Q: o6 K- I/ J1 V3 M0 v2 I2 ?* p& D$ k) M; O7 }

. w9 O! U' f% G9 v$ I4 t4 [//*********************************************************************************************//
( l2 g2 [8 _" q1 p
# n' Q: D- g, b( W3 Z//////////////////////////////////////////////////////////////////////" X4 d7 ?: W4 I+ P5 G( S7 {
//0 P- S6 }0 F- s5 N
// IM.cpp: CIM class (使用系统)输入法类+ w. L& S5 Q9 J! z2 v' F
// 2001/4/30 Write by Jerry Wang
: F9 U2 \( T. N. y// 感谢大大鱼的帮助
" e5 N  t8 v+ R( P// Need Lib: imm32.lib$ }1 G5 W" p; \
//+ @, X4 w% _  z) ?7 b) j
//////////////////////////////////////////////////////////////////////, B2 S7 M' @$ r) |; j' s  T

+ \' D; z5 g! o1 k% ]- g* Z#include "imm.h"; }5 Q) S1 X  L' s
, k/ Z, e9 @( z1 }6 B
//////////////////////////////////////////////////////////////////////8 f7 }! _0 C! m2 ^  |
// Construction/Destruction
4 V: e& U3 j, |* {, x) @( E//////////////////////////////////////////////////////////////////////
4 n$ c5 P/ G/ a2 Q. J4 z# }9 b# r; {2 z7 ^2 q- k
CIM::CIM()
, N( y; w. A1 a* W{. B1 l! P0 I) x
   m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];
* m7 W' u. ]# o# z    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
+ V- c$ d! ^/ a    *m_lpszImeInput = '\0';
- C" }8 x( T9 g' o' Z    *m_cInput = '\0';
- n. Z2 r: t/ ?2 J5 k1 @$ f" a5 N
   ttffont.Create( "黑体",15,RGB(255,255,255) );
: U  B6 z, o9 M& O/ j9 _' @    GetCurInputLanguageDesc();
6 [' D1 Y4 n* Z6 h- Y}
! x$ h, _2 t) z) g3 _" o9 `8 x* b: Y- C0 j1 ^7 c
CIM::~CIM()
6 v$ v; k. L* Q{
% w1 I" p3 V2 \/ G    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );' A& F! L1 \9 w
" x$ m1 a) t8 d4 g4 z
   CHKB( delete m_lpszImeInput );
: X% k/ i/ ^8 M8 \* A    if( m_lpszCurInputLanguageDesc != NULL )
' {9 T' b" {& U! Y4 P* \8 }6 ?4 P* p        CHKB( delete m_lpszCurInputLanguageDesc ); 2 m/ h" ?9 o! w/ C& E
}, l) V3 c  r9 |2 r
; v) X. m* Y1 t% K0 O/ t+ p
void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)* T8 n8 h5 o+ T; I
{
1 f8 ^; V1 v6 F5 ~0 Y% [8 i& L0 G    if (lParam & GCS_RESULTSTR)
2 T+ B/ I6 r0 V: c$ ]) n+ J    {) i0 E, i1 g8 f. {+ [8 M' g$ }
       HIMC hIMC; //输入设备上下文) _" Y) m0 D) p' D
       DWORD dwLen;8 P$ t5 N& S$ K1 s5 E% A+ n1 }
       LPSTR lpResultStr;/ [% |6 A  R2 A) o. v/ `1 t9 `2 v

3 }$ W# w# E/ j0 ~        hIMC = ImmGetContext(hWnd); //取得输入上下文
: W0 x! }3 [6 k, h5 L' c+ v% O: g" }$ j6 V; T/ I
       if (!hIMC)
! F$ |, ?- c& U. R3 d$ [            return;) F, c& P0 H+ e
! q: |, j$ }7 T- `1 V) ], f
       dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);; \# m. g6 u. ], }6 q, [/ z
       dwLen+=1;/ Z/ ^4 J2 B7 Q( R8 t
( l& l, m* ~3 A' B' t# e: j
       if(dwLen)
9 X5 r1 c8 A8 p2 N; |        {" O, [9 u; `% v! h
           lpResultStr = new char[ dwLen ];
9 g4 Y) W" N1 c6 n( E
: x0 [0 z4 j4 ^0 ?            //// 缓冲区已经满了% ]1 J% O4 b  z3 y& f. _
           if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )& b7 X& m7 o; s
           {% Z& g) O+ s) T
               MessageBeep( 0 );* e# J; D3 c" _* }
               return;7 C( p, m+ Z) M) U5 i+ \
           }- S1 y. O# s( E0 X' S" p- B
           ZeroMemory( lpResultStr ,dwLen ); / d( z/ b+ {) ]; g$ G
           if (lpResultStr)5 \$ P( K0 n; l# V% T
           {/ n+ v- Z# `0 Q
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);
% L8 K* n9 i# z; M. }' `/ |# r                strcat( m_lpszImeInput,lpResultStr );
3 h2 ]; z# E; x; T% O) l" p            }& V2 {2 a, Z; X$ I8 X' s1 K
           delete lpResultStr;
/ ~, g$ D* j8 w' [/ D& L        }) [" U: W6 ?* `  S' }1 H; s

! J: L3 G5 M) D, T        ImmReleaseContext(hWnd,hIMC); //释放输入上下文
% f, h0 i1 \6 [) v  [8 Y    }  X! ^1 i& ]3 ~) j8 _

% I3 N3 j- y( E1 \: v}
9 i7 G# m. T4 I1 I& [2 J' k$ w$ _0 h- \+ Q; S: z& h
void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
6 Q/ q( v. j0 J{
8 O6 a* `* Y6 b8 C* r    DWORD dwCommand = (DWORD) wParam;
1 S: x/ r! _& p2 j' K    switch( dwCommand )
# h& L* Y1 U( n7 C  t# s    {3 |, N/ ]' v" P- R3 w1 H
   case IMN_CHANGECANDIDATE:
) X# J' F7 M5 ?* k) X        GetCandidateList( hWnd );
9 S+ y4 O4 e. `' |        break;9 G5 S/ u# G* Y% U1 x. g
# O' b' B; ~- m7 y! }, v& i5 S( }+ ?
   case IMN_CLOSECANDIDATE:% z) }  l0 c8 Z7 S4 m: T: V7 \
       ClearCandidateList();
6 @$ W" @+ }' O1 S* {        break;" [5 C: v( Y1 F4 ?4 m

5 ~; p( z  ~: [4 R$ d- U1 {8 B    case IMN_OPENCANDIDATE:
0 ^! j: v5 ~% n/ f7 P        GetCandidateList( hWnd );
2 B2 d6 l+ c' v& H' w4 O; X7 q        break;
# p& y; t0 ?9 t' n3 R# x    }
3 g" ]" h, U$ ?, x8 W+ Y5 E: {}# U1 `3 L; k. G: P2 j7 @; ~
5 \+ w6 S/ C& x
void CIM::OnChar( TCHAR ch )
% {; M) G" C1 F' P{- d# e8 u3 ~; i$ X/ L, W
   int len = strlen( m_lpszImeInput );2 T  m- u! n! d# q9 o
* `6 t0 s! v9 z: c
   if( ImeIsOpen() ) //输入法打开状态0 [, G* y6 \' y7 h
   {
* q+ B4 a- }4 `' e. d' _' s' M
, l" y# p- [! m9 A8 h9 c    }) C6 O; I" d! a- f1 }/ q/ g' v
   else //输入法关闭状态
, L/ m6 ?! a& c; |    {. n0 D- y( Y5 P4 ]: |# z
       if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母0 w1 l( G5 o+ L+ ^
       {
% ?8 [3 b5 h! ~5 b9 Y            *( m_lpszImeInput + len ) = ch;7 g& z- a; Y$ C. W
           *( m_lpszImeInput + len + 1) = '\0';' l0 P3 D8 F0 A; }
       }* H& r* `! u: {9 _
   }
1 Z; F% c, U/ S6 {4 }0 r
, U: i6 a4 t2 y+ `/ ?% y    if( ch == 8 ) //BackSpace字符. v8 Y! l% J$ _3 ^8 z  m
   {7 e9 d6 r% B) ?+ v3 ^! ]
       if( len == 0 ) //字符串长度为零
8 J' L" y! ~% x* n' u! W1 T* y6 r            return;/ Y2 P. H+ }7 I) Y! m1 R- i2 I8 d
# D, `) ?: J5 @  N# I' c* ?! W
       if( len == 1 ) //只有一个字符; r# D) Y2 M) J+ J! x8 N! E
       {/ F6 |' _! Y9 p+ c3 C: d0 Q
           *m_lpszImeInput = '\0';
5 \2 r* R4 a# b. T! L8 J            return;
4 `' Q1 K1 J& D5 T  r4 q        }8 o8 u2 u  i6 E( F, S' g6 M

) N8 d" M8 G8 g- X/ L        BYTE cc1,cc2;& w3 @! p+ z2 G- L% A, t: Q5 y
       cc1 = *(m_lpszImeInput + len -1); //分离字节7 P/ F! b( h1 q% P$ Q: X) z
       cc2 = *(m_lpszImeInput + len -2);6 H1 g! c4 _1 e; o% R& _  |( F

) Y/ P! I- d/ L, ?" ]3 n        if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
( X: u& n4 A! t  I. ~6 i' ~/ P            *( m_lpszImeInput + len -2 ) = '\0';
: F; a+ c( W8 l  Y3 _* k        else //是英文字符(单字节)
2 h) M$ O2 o5 S0 f# Y% B" m4 h            *( m_lpszImeInput + len -1 ) = '\0';; M" D5 `/ F2 E( M3 i! b
   }1 }& u$ L& w9 i& `
}1 u! n) a) }- m' B* ]! G! I2 s9 c
: w2 ]) ~6 P; T4 R1 j6 [
BOOL CIM::GetCandidateList(HWND hWnd)1 `9 Q- l  K- g2 {$ M
{
, D3 K4 U7 B0 w* y4 \; l7 |  }1 r    DWORD dwSize; 0 E- b; F) W9 [3 n
   HIMC hIMC;
0 V' V) p. n7 x0 [1 c9 k! J8 G8 I& v$ y8 U; e! _
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );* g* P" k0 m& P4 L8 a" T- p8 H
- n0 W( \7 D. ~4 S" G8 g
   if( m_lpCandList )+ `0 K6 I' u- W: p+ o8 T
   {
9 i$ ^! Y$ E5 J3 ~        delete m_lpCandList;6 r: a- _, A  S# l) B7 F! K  v
       m_lpCandList = NULL;3 C- W- C+ F) R8 D
   }
# @7 a- L# V4 s8 k
4 R6 P5 B1 z& Z! t    if( GetKeyboardLayout(0)==0 )
& n: H3 ^# B  ~0 c: l0 o# u    {0 k. S9 e7 [! ^9 D
       return FALSE;1 i( I1 d: g: w% O1 \" [# K
   }
" o# ~  `8 Y% Y- K. Q1 m9 q. {+ J- N/ j7 ]; H4 F( M
   hIMC = ImmGetContext(hWnd); //取得输入上下文
' }( _- H& Q0 C2 R' C* R    if(hIMC == NULL)
& g7 T1 b% [: W1 q; P6 c& E    {3 c9 i/ E0 P4 O; ]9 _" _% X
       return FALSE;( B: \& a- R, C0 ~7 D
   }8 y8 J, k, |; f; U( _  _
/ w8 n1 T  t( {& y1 i' r* g
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
7 E7 }  x6 O" h7 c    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0)) & K- {: I+ p/ K3 p7 U  ]: S& ~
   {3 M% F* W* v# }, X
       m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
# z7 X1 Q9 P6 K, w' O# q        if(m_lpCandList)
1 C# ^- x3 l0 I# P3 Z* T        {
$ T+ I3 W- C8 ^& v* F  A            ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);. j' ]* H4 i" s4 S6 L  W$ P
           CandidateToString(m_lpCandList);7 ~( F5 l/ T% z. a4 n% m
       }3 e* t1 P; ?, z9 {' v
   }
, O  j" U' B  {  P/ X: ^* n- g. T6 f# `. }* n. D) m$ y
   ImmReleaseContext(hWnd,hIMC);8 X/ H+ z1 g, ^. Q; C% U

9 V/ R6 z, K+ [- v, p    return TRUE;$ O* N" h& `$ Y: \! g8 U4 o
}2 y, X9 e# g6 b7 y; m( `( u
, \5 {; W8 T# S  t! @; r: V
void CIM::ClearCandidateList()0 n) J  M5 L$ O
{
0 Z7 f3 r( B- @3 k9 [0 O0 G    if(m_lpCandList)
) C7 j# x4 ], `& {2 @' O) L    {9 D/ s" w. |% s
       delete m_lpCandList;
  D8 B, e" H: i+ O. d: A/ g        m_lpCandList = NULL;  o) o; j: }+ \, V8 h9 \. r  y
   }6 x5 Y2 A+ y8 o( D; O
   ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );" z( L  v; N6 i$ M( ~. P% a
}2 P+ `9 {# D( U  Y' p4 l# y

' o  Z' D& k6 m$ Q- o4 o& C
0 a1 f( [+ }6 v4 g" J) x1 bLPSTR CIM::GetCurInputLanguageDesc()
3 C" m4 w( E5 ]{1 {3 `7 g# u" G8 P# Y/ `
   HKL hKL = GetKeyboardLayout(0); + \/ J" u% ]8 _, u
3 J* @& Y: m, b$ M* K
   if( m_lpszCurInputLanguageDesc != NULL )* r+ V0 D4 K1 e. {4 R
       CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^
( n8 K0 h$ G/ @+ R. v- Z. b/ p0 i, b& M  r2 ^) q# _
   int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度
) v7 X& I1 q# v/ X3 |/ h
) B2 f( b, S2 r) r& Z8 I    CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
0 U9 C; b# I/ h- V, R
  Q* f, x1 N. j" A, ?6 E( R    if( lengh ); X5 L1 K/ v. N9 G3 V6 |# Q2 y
   {1 R& P. C$ G" }- n" A6 `$ e5 H( S, k
       ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);
' v! Q4 Z) Q3 s2 V- |6 h1 g' W! Y    }
5 ]* Y) s7 \. }4 q- t" M: E! g: i% N    else
' I7 O% [9 ^0 R) Y    {6 h' B$ D/ c. x' a
       strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );! e- C1 W* A, h. U- s
   }
- O2 D3 P! w$ c  Y$ n* h# l  \/ Z1 i: }+ U2 x+ {9 T" l9 o6 x. K
   return m_lpszCurInputLanguageDesc;
, Q" C, k6 c" k# \( M}
. i! b6 J- o3 ]' O8 }1 J* p, N2 L/ J5 J4 s' c) I5 c( t$ |  [
void CIM::UpdateShow()/ k  d4 h/ f0 P+ X) c( D2 W. k
{& Z5 t& v' D* V* z6 y
   POINT pt;1 E9 U, R. e- P* `
   pt.y = 450;
8 h9 d6 e1 L( ]    pt.x = 400;
" Q0 Q% u$ h/ b6 h1 [) G+ n    ttffont.SetSurface( DD_GetBackScreen() );3 \7 H$ P3 [0 k8 D  C8 Z5 _
   ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述$ e. C/ B5 ^$ W* E  a

/ L  F$ k5 C5 k! D5 x; L    pt.y = 420;" b6 ]- X7 n# P2 H9 ?& d5 t. p
   pt.x = 20;) m9 k9 p6 y" @( o
   ttffont.ShowText( m_cCandidateList,&pt );! W8 Q# u" h: c; [. h' r

; L. r! o% X3 |! n; T    pt.y = 450;
. j( X: A9 `% L+ j+ e( m* d    pt.x = 20;
! }/ c+ d) W- M3 a* t. \    if( *m_lpszImeInput == '\0' )
  m8 w, y# |9 K/ j# C/ s( I" h; I        return;
  U9 P. U& r; k; K+ Q
6 ]2 K+ Q. l6 ?& d  A    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字. O- E1 N! M- C* {- D0 k7 K
}, Y3 b7 Q% G* E3 W
% P+ |: c" t6 X, o0 U
LPSTR CIM::GetResultString()
: o- T) A5 v# K$ c6 a9 s: Y{
- m0 b' I4 l  V; p! ~    return m_lpszImeInput;! ]* i7 E+ ^: f! L
}% D4 j9 O7 y+ r" G

6 N) \! f. A$ G" `9 `( IBOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)/ j  ]; J- s0 J3 F
{7 N' g: a* Y# v; t  Q
   if( !m_lpCandList )- }- ?; b2 K  R8 Q( d7 b
       return FALSE;3 o3 a& u% Q# b* o4 M1 z$ ^
5 w$ y' Z/ g# V2 U! `
   if( m_lpCandList->dwCount>0 )
! n2 b5 v4 f: v2 U6 b! s    {
, F7 F2 ]1 a. l7 P6 C        LPDWORD lpdwOffset;
5 g) p7 J. ]2 L( T  l" A
& ~  M) c# Y2 V' y, C        lpdwOffset = &m_lpCandList->dwOffset[0];
% ~1 f8 q# T6 U+ k
) z" e% }; D. M# o0 Z& D        lpdwOffset += m_lpCandList->dwPageStart;
0 ^# {; w  s( ~; ^$ `! V. M: e6 K7 F% v, [/ w6 x1 q$ a
       ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );
8 {) ]6 s* Q8 p1 v0 f6 T$ l
" K& X6 z) ]2 J. A8 N+ }5 B  d        DWORD z=1;
3 x$ M6 H7 Y7 z, x1 k9 o        for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) 2 h: g4 s8 b- H  o5 p! C0 J
       { 2 |6 a9 S) z$ R! F4 G+ a- |' Q7 V
           LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;! V; h% z' u5 Q# M' H6 }. i) w7 \
           char buf[255];/ B9 a( G7 Z' X/ O
           sprintf( buf,"%d.%s",z,lpstr );
! l6 e# ^' T4 H& d            strcat( m_cCandidateList,buf );" W" L7 T& w2 V5 g" ^  a2 y) W
           z++;
9 [" Q% ]4 D5 J4 U0 W        }
- W! K( k+ K& D7 i, p/ `' ?, W7 q5 q" p4 n6 V' v' a: S4 U5 @
       return TRUE;: F9 N( V) e# A& {5 G' h
   }8 F7 W. S  J( u; T. C8 o
: Q2 N. I! I0 o2 F; B* k
   return FALSE;
/ c9 n: d3 v# ]1 g0 l; }4 R+ H}6 [0 S! |) ]8 b, A( \/ j
3 k. Y( e1 N. _7 n/ i* N& Z
BOOL CIM::ImeIsOpen()6 G8 K* X" O* {
{4 T3 R- ]4 r4 e0 d) z2 s5 H
   return ImmIsIME( GetKeyboardLayout(0) );
, h5 b/ r+ W9 |3 ?3 c" b, Z$ N) ~}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 20:10 , Processed in 0.019387 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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