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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//
- Z6 s, q- w3 M+ C& [! v! ^$ ^//
% [# k, [' p4 f// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家
$ w$ J( A* I- N$ z1 ~$ m' i0 C// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
+ \, o, f: P: O% N# v' l8 K// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
$ R" x, `, v. `4 W) y" B// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT
' P: G" R. q5 |. x4 t; R6 j// 为显示信息用,可以用其他方法替换如 TxtOut() 等3 h0 U9 Y- m; W$ U! S$ \& T/ ?
//
- }& G  M" A+ J" |( V* @7 q' E//******************************************************************//
$ K9 w5 W& O0 |! }
. d. r# c+ Y0 ^) b0 _* ?//////////////////////////////////////////////////////////////////////7 t: C  x( z9 D. i) L/ S! Z1 y
//! q3 J, Z6 ^! d4 }- {- T: b
// IM.h: CIM class (使用系统)输入法类# R6 p& e. h4 Q  Y
// 2001/4/30 Write by Jerry Wang
1 U7 s- O! x6 O0 h6 I" ?7 D// 感谢大大鱼的帮助
( N" n" s; K# Q2 A6 d// Need Lib: imm32.lib
3 b+ |/ v, m; Y- l) |3 n. x; E  r//( y6 w8 G- q) v0 ^' @/ Z* S
//////////////////////////////////////////////////////////////////////
0 v, P  j$ W: v' s! I% E& G# R
. H$ {# [# o6 S/ L% n#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
5 Y7 a( c- v  k. J+ K1 s! r#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_
5 l6 j2 ?' u7 T$ o* e/ z# l7 P* @  {
1 K, u9 z+ Y# q2 H#if _MSC_VER > 1000
& S. m/ d$ p& x5 ^& k#pragma once
" t- M- _9 U8 B% Z#endif // _MSC_VER > 1000' G' d: j; c( L' J* Q) X
2 b$ U6 c7 r, V: D3 T* ^$ D
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数' ^" n1 w% M" I+ e
7 v8 g* ^5 L& @8 h
#include "FindMe.h"( F5 r" ^3 q1 T9 Q7 Y$ N

- p- z5 h5 m& qclass CIM " v! Q$ u' X7 X0 n; k, P1 |" k$ t
{
6 j* m; ^5 y& G( c: z; Aprivate:
1 D6 T; s$ P- h+ z$ N- F9 C; Z0 q    CTTFFont ttffont;                    //显示信息( \; N3 u( n3 g0 W
   LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表$ O" W% I5 a0 U& O: W- d
   LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针
4 K5 `8 S" R1 @    LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针' s/ Y% x; a% Q4 N( N2 t. E" U# b
   char m_cCandidateList[255];          //候选文字列表缓冲区. n& N5 t7 s4 b: q. F, t4 l
   char m_cInput[64];                   //输入的字母$ L+ J/ S) }/ T

5 s8 m% I$ \) m; m  b! y    BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串1 y7 f/ F% R- ]" _8 m+ j( v

( H0 Y9 G& ?: L) o6 @& Q- D  Jpublic:
/ V2 B7 B( Y8 }
* z4 ~% ?3 w0 B( H    CIM();
- Y' j6 w8 y$ e! ^4 X3 R& }2 A    virtual ~CIM();/ a2 u5 ^, T9 J( f  I) E, v

0 |* Z- z1 `$ ]. ~* M( H    LPSTR GetResultString( void );                     //取得输入的字符串/ @! B# V4 V) L( f6 V

8 X6 N& x# A, z4 g% _* f- q% g' L    void UpdateShow( );                                //显示输入法信息
; o! Q4 E' ?% k8 k( Z+ p1 p' y
' _: |, c' I6 w; G4 I! s0 b    LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述5 d! p% ~$ C9 E6 h3 D+ M
   void ClearCandidateList( void );                   //清除输入法文字候选列表
7 n8 G- O+ \6 v7 w0 X; d- I% R7 H    BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表% }% t4 ~6 n5 ]: ~$ [& j
   BOOL ImeIsOpen( void );                            //输入法是否打开& t- m+ m9 h2 g7 E
   void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息
* y, w& y2 d5 g9 U8 i    void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
! l$ J, ], V6 X    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
$ e1 V! @  I/ U$ U, p};
- G0 C" j% G# S9 B5 h& A
3 z0 `0 z' c' y#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)# x3 E5 g4 e' p. y7 P) K5 J7 Y, s

! G# C7 G* N. W( `& t
  i1 a  v2 d: a* \: C" |: m* N/ @( E$ Q& e
//*********************************************************************************************//# o0 Z; L* O0 T, h

( G8 z! K1 N2 ?9 n//////////////////////////////////////////////////////////////////////% y+ c, R& R$ L
//
5 i7 D7 V- _1 Q* X2 D4 V' p0 Q, n// IM.cpp: CIM class (使用系统)输入法类
( v0 ^9 }+ _3 y# g+ x- {// 2001/4/30 Write by Jerry Wang
& _  L" g- O/ H# R# I// 感谢大大鱼的帮助9 A9 j* h4 j; A- j
// Need Lib: imm32.lib
; }% X  k# ?: y0 O4 b! z) T//
4 ~  z1 w* [- y% C- H//////////////////////////////////////////////////////////////////////
4 V7 t+ z- h" E4 m
) P: m; v" e' Q. |! Q' n#include "imm.h"/ t- A& B# {; [  I4 ]- I
. u4 b# N9 E2 y( S% A; }% F
/////////////////////////////////////////////////////////////////////// o- M2 \# {( T4 {6 \3 P. C- r+ f% p
// Construction/Destruction6 Q/ r9 G1 l, B3 O5 x* J
//////////////////////////////////////////////////////////////////////
& }) G2 X) Q. X. q& k- W1 C& }6 l) J7 b
CIM::CIM()
; }2 c; h, i) M5 E) D' z1 Q{. X$ {) `: v4 }3 r$ R
   m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];2 u! d1 p5 b2 l! K4 B5 J
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
. ?+ o! U% `9 [3 b    *m_lpszImeInput = '\0';
4 e# R. N1 }  {" e$ S4 v" \# b' b    *m_cInput = '\0';. V2 o; I# M- J5 O& x+ X

" U2 h% z* N5 x1 n: ^    ttffont.Create( "黑体",15,RGB(255,255,255) );. U/ u) y9 H6 ]" S
   GetCurInputLanguageDesc();
5 x7 C- x% q: G0 g7 R}
, y$ D( a' f$ |; R) k& ~# ^" K- n" L' S4 i2 k
CIM::~CIM()
7 B+ K" ?" Y1 y9 _$ C{: w2 W7 L& K& g  m, E$ b
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
" @+ P: p7 B! H5 @& f  Q
) F3 t& [! {# {" o* v. H    CHKB( delete m_lpszImeInput );
8 C6 t7 v. s# w' e    if( m_lpszCurInputLanguageDesc != NULL )
/ z7 E3 t+ y  N! r        CHKB( delete m_lpszCurInputLanguageDesc );
- W0 D' n6 \4 n, B8 c6 Z+ T}
3 Y6 @5 B, d" B9 z) U9 y# ~$ P/ Q" H* D% h- G4 I+ v. u
void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)4 ?; q6 H0 e# n( D5 P" Q! W  X$ s% E
{, f* k5 U# u) _* N$ m
   if (lParam & GCS_RESULTSTR)
) d+ @2 ^$ g  E( j/ S. J! y% y1 J- B    {- t3 }" p" Z/ Q0 r# q9 A
       HIMC hIMC; //输入设备上下文
& x$ t; Y* f3 m- K6 `$ H# h' W( i$ v        DWORD dwLen;- F4 p$ ~+ s3 k5 Y* R! |4 ~0 p, y" c: h
       LPSTR lpResultStr;0 V9 w$ t7 p7 v

& a: H# e; J' M3 s        hIMC = ImmGetContext(hWnd); //取得输入上下文
0 y$ L3 v9 j$ q8 T6 m3 C, C2 I6 a+ d0 U
       if (!hIMC)
4 T6 ~' |+ o& Z" H            return;
4 Q6 w7 ^  r0 @0 q: ?) x$ p0 w9 S! g) @& {5 b. y
       dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
$ R, M( Q1 ^, J: R+ Y! J        dwLen+=1;
  `* j" U5 k% D/ }% z7 F# Q4 U1 w
% A! l+ i6 m6 q1 n9 g        if(dwLen)
, a& _! V# ~* p' z        {
( Q1 g/ U3 E  X3 E            lpResultStr = new char[ dwLen ];
3 S1 _- W' Y7 V) |+ I" X" P% `8 L1 \! G9 K
           //// 缓冲区已经满了
) Z- D" x9 M1 w' T' k            if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )$ A+ u( l0 i! E2 c1 c" Z( {
           {
! ^* r) V# \+ @1 ?# j0 [% m- b                MessageBeep( 0 );5 c1 b! D$ C7 r' {0 v: Y4 I& G0 K
               return;$ i6 r! d) B/ c1 {
           }, t# C$ h! q- I0 v' F5 [
           ZeroMemory( lpResultStr ,dwLen ); & j8 U/ B' K# z/ M, d- q/ \0 |
           if (lpResultStr)
# W  L9 x; E3 t2 j            {* E  `7 q; d, \7 n' M' n
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);) ^) Q. i; l) B# q
               strcat( m_lpszImeInput,lpResultStr );
+ `# Z" z. [5 e! c! N7 u            }
% E9 C9 Y4 O9 g            delete lpResultStr;4 b/ w% l. c7 s; h
       }
7 w+ N% r* @  Z/ C, b
' `1 d3 P; {4 S5 k8 H        ImmReleaseContext(hWnd,hIMC); //释放输入上下文
5 }/ B4 X9 v; n( h+ f4 i1 l    }1 W# x8 i  z- n5 s8 g% l
" d1 M8 l7 @8 e2 M" t
}+ P* g+ I' i! o4 y2 G
( Z* V' @7 B. ~2 a; W' {1 c
void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
; M9 O5 N/ s+ M# F( x  S7 o{
1 L! \( f8 R/ s7 t( f- u5 |    DWORD dwCommand = (DWORD) wParam;
* W: g- k* J% [1 E$ p    switch( dwCommand )
6 O  j" J7 Y+ {  }- r    {
! ^% t; a. }# o' e* V    case IMN_CHANGECANDIDATE:: t; [6 |1 R& M/ u9 l
       GetCandidateList( hWnd );
& Z. C* j8 V7 [; f. r        break;, q- M6 M; E- L: |$ [

& `* }# l+ ~) s: [; g$ O    case IMN_CLOSECANDIDATE:
% U2 v; }9 P9 S" f% y3 r        ClearCandidateList();9 ]! @  ]  H. h( `
       break;
+ Q* U5 H+ P4 N" U# |& p6 x8 `: Y% x5 O
   case IMN_OPENCANDIDATE:' A* y, A0 I  a& P
       GetCandidateList( hWnd );9 u1 [  Y7 P2 H
       break;5 s) \' S! B; V! d( G
   }+ T1 Q* H; f' e
}
# v" W: Z" b' O0 W. Z! S* t& }7 B) q
void CIM::OnChar( TCHAR ch )5 Z/ F  c' {1 E; v8 A" T1 W
{
; Q7 [: n. D4 {& ^# |    int len = strlen( m_lpszImeInput );
7 w- F: y, j- T& f" M, A, e7 F. ]/ @* U$ M5 k* G" D* A0 w
   if( ImeIsOpen() ) //输入法打开状态  Z2 C/ s5 i3 {
   {
# _" e3 ^' g3 x
  S. ?! F" [" L0 T+ H# ?% F    }
& o. J, h' M( X  ~7 u% u- ?    else //输入法关闭状态
# I- L( {& L, A    {/ \+ F. p- A7 u: d: |* v
       if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母
8 J& f  @8 l* O' r        {
  C+ j5 w) i. Q: l            *( m_lpszImeInput + len ) = ch;  F1 @% S' ~4 k$ s/ }7 V
           *( m_lpszImeInput + len + 1) = '\0';" F2 o$ N9 C: U, P
       }, R1 f& O0 J/ |3 G2 U  n3 q9 D
   }' w6 K$ {* |2 z+ r
8 [0 u5 y+ @4 e3 z
   if( ch == 8 ) //BackSpace字符3 @. P* h* z; T" T2 p
   {
( a) x2 o4 ^: r" d0 r        if( len == 0 ) //字符串长度为零
% h& ~: f# Z+ {2 H' C0 b            return;$ Z/ n3 _. |& e' Q: g7 u$ y

3 \9 B; C* ^- V3 g        if( len == 1 ) //只有一个字符' s8 W& t* c; H! ^6 u
       {6 x0 o5 ^% Q1 g5 [5 p
           *m_lpszImeInput = '\0';
4 p% u2 O" q5 p) ]. V# a9 Q9 Z            return;
- A  Y3 z$ z2 q' w" V& E# R9 r        }5 |( C! i) X- H- A
5 n4 w7 g3 u, ^5 [0 q9 G
       BYTE cc1,cc2;
3 J! d4 n. _2 w$ g* o        cc1 = *(m_lpszImeInput + len -1); //分离字节; q$ C/ T$ w0 v+ Z
       cc2 = *(m_lpszImeInput + len -2);
& A: }. R  O2 i8 V' D8 j
  ]6 S. J5 g: L' _# B+ |" e1 G1 U        if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
6 F9 f4 ?' O$ r: v! o4 G; B            *( m_lpszImeInput + len -2 ) = '\0';/ R( [2 K: ~9 r; |& w* h: J- l
       else //是英文字符(单字节)6 R5 F* w5 I% c$ I2 u
           *( m_lpszImeInput + len -1 ) = '\0';. J$ n- e5 _6 S7 }- x5 y' q& {* y
   }# ~3 h4 Z3 f  f# b* _
}# `8 a- M1 J# {/ P$ J
% r% I5 }% n9 s4 ~3 o; i+ }0 |
BOOL CIM::GetCandidateList(HWND hWnd)
; A! z  P. f+ B, u{
! A) I' h$ I/ b+ t. h    DWORD dwSize;
) A7 w1 k4 q+ |, U& i" O% `$ |0 z- r    HIMC hIMC;( @5 T0 p, g# ~0 M3 N
2 @: R  ], d4 d! f  e/ z( i8 v
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
3 x! b2 T& F% P2 n$ C2 J% s0 D$ L  X  S8 J; }( \$ B
   if( m_lpCandList )
0 O& [! I! Z+ S: u3 q& C    {
+ y4 n' d" Y! E' t* f) n$ d  [' ^        delete m_lpCandList;- P" v) g: f4 P6 B5 C% E
       m_lpCandList = NULL;. [  `* ?) h" R
   }
, Q* g. n( ^( \8 l: U& B; m2 u2 T! C+ P& h
   if( GetKeyboardLayout(0)==0 )
" W& Y5 |* I! _8 u7 K' B) ?    {
* N2 ]3 P4 w9 x" @        return FALSE;! E% G- D# r9 h3 K
   }' k9 Z! H- }5 g1 Q  B" I2 B

5 D" E1 \& f! Q+ }    hIMC = ImmGetContext(hWnd); //取得输入上下文
4 p- o/ O4 g2 k: R3 a, Q0 \    if(hIMC == NULL)
2 M3 n& e% X& Y1 T, c    {3 p% Q  ^/ t& \7 {  z8 ~& ^
       return FALSE;
' h4 K4 }5 ], V  Y7 A( K! \    }
2 Z* _$ z& N/ i+ d, H* _$ {: Z2 Y& q  U2 F
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
8 i8 @, Y) h1 |    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0)) " D# E8 V/ S; j! z/ n& N
   {
/ Z7 |7 b$ @* }- g% Q        m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
, n( ?+ M, ]1 T9 L        if(m_lpCandList)
! g7 i/ }* K% A! X( ]( ?* D        {  Y4 n6 g, N; ^" q0 V
           ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);
8 t7 ~4 D. t/ F% p            CandidateToString(m_lpCandList);+ A, D8 \" w1 J/ C5 ?$ R1 n+ s
       }' p% l4 p% ~5 \9 ^. @
   } 1 x8 X( P- r5 N0 l/ N& ^
7 j. y3 u! i0 O& a8 ]9 V4 q
   ImmReleaseContext(hWnd,hIMC);8 h" c* z5 A, e! C

8 x9 R0 A* h( ?5 N) }    return TRUE;/ e) K& l  m% k
}9 k  d/ R( d3 u) ]
) ?' D: {7 F7 e# J
void CIM::ClearCandidateList()
& r( {1 m; V5 n% ?8 Z4 f9 |4 Z- R8 O{
- [9 Z1 E# @. v6 Q) _9 N! B* n  o2 R    if(m_lpCandList)
- F: O( l$ ]5 q6 ?8 k    {* b8 m! `1 j$ O/ y. N% Z
       delete m_lpCandList;
# C4 p9 U' m! g, `" ~4 O        m_lpCandList = NULL;- c* N" V8 ^3 M
   }
  x; J# b1 E( L6 w    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );: R) a8 t: ^4 K- ?3 V9 N" J
}2 y" ]$ J4 M! R+ E" ^4 a
# B1 L. _/ h' s8 n+ t6 ?

6 k/ k2 l: _& p# d* i  CLPSTR CIM::GetCurInputLanguageDesc()' z) [3 g' w! V; v1 d# U) h4 H* }
{
! l, Z0 S, L& u6 X: c: u    HKL hKL = GetKeyboardLayout(0);
6 g( B+ Q" Z% ]4 `
; ~: c% D; R( B0 A' H6 ?. @    if( m_lpszCurInputLanguageDesc != NULL )
! p% `: F/ `5 t( M8 k4 k- o        CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^8 e2 j* k9 \+ s# V3 j$ R

" q3 H$ [5 I1 I6 O8 {! K    int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度
/ C" B$ D3 h7 o5 w) t5 d& F/ d) l; b  B! U8 e) ^
   CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );. U- y; x* O8 m2 B
7 A! x- k, b* S, M. d
   if( lengh )8 z5 c) N2 [( ^; ], q  f) N
   {8 Y) b+ m, |  A1 C6 p  i0 n
       ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);; j% e; ]3 l! [" L" e7 I$ o
   }
1 y! m1 Y8 m' |8 \1 D. `6 M  t; x! r    else
1 ]: m5 t# d" L, z9 j! J: p4 ~3 Y    {  H. D: M3 o* }$ e  Z& u. z% k: k
       strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );
& b4 c! a' R# Q9 A! p    }9 ?. R0 {1 U& `* k

1 Z& z  M* Q6 R0 s$ [3 l0 Q# X- i! h1 m    return m_lpszCurInputLanguageDesc;) ]- c) G4 v7 r) f0 Z
}! X  v" x: L) s, U. ~. ~' h) o; a
/ M. F% ^7 L! E% y+ I
void CIM::UpdateShow()8 d8 [+ C. Q' s* C* I6 s# K
{  e7 K% g( J% m+ q# S
   POINT pt;
5 U9 w' M7 S; C6 V0 Z& {    pt.y = 450;5 g: F+ U1 y# a% ^
   pt.x = 400;
+ `- ~/ _- J9 @, f% |* T$ v4 s# s    ttffont.SetSurface( DD_GetBackScreen() );6 f1 Z0 ?& C# h1 Y4 R: [5 I
   ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述- q& f7 o' b7 W4 E1 m2 j

2 Y. E- B; A* K" B& F% W    pt.y = 420;
7 Q* c7 S% F3 q, i( @    pt.x = 20;' @1 J* e6 I4 ]) M. E
   ttffont.ShowText( m_cCandidateList,&pt );
( y/ |8 Z( @' w! B' `2 X1 [& j: q/ y5 f) T' [: C2 x
   pt.y = 450;$ c! m. z8 v2 P) s! k. E  S+ {
   pt.x = 20;
4 Y1 S* @2 q* y! b$ ?; K6 F- E' X    if( *m_lpszImeInput == '\0' )" J+ X* _* m' v6 C0 p
       return;
6 Y: Y/ I' K+ `7 Y2 f5 [4 `
( j9 Q5 C5 b: j1 L. F5 S    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字
5 t+ O; Q& Y8 x}
7 ~) H/ E1 Y- Q8 r/ N
3 Z8 m2 f- a1 h, NLPSTR CIM::GetResultString()
, P! N) u7 \7 ?/ J+ X{
9 ~) S* x4 h9 B1 p& K7 _# d' @$ I    return m_lpszImeInput;8 z# ]* K' W" P! V
}3 N* D5 L: M1 F! t' O5 h! O, v7 a

. v2 q1 e4 V  A; RBOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)! o0 D4 L- T: f1 A+ ~. `& t
{
1 P8 g2 P& Y4 H3 s# S5 e% [    if( !m_lpCandList )( Y& h3 |1 G1 d  t
       return FALSE;
# w2 _8 x6 i4 A$ k2 q9 a2 c% Q; n5 V% p0 S0 @* r4 x6 d# r  _( n
   if( m_lpCandList->dwCount>0 )
2 D1 B( A) B6 n; K+ K3 K    {
8 z0 E+ F! J. B' h. i. Z        LPDWORD lpdwOffset;' y  N" S# Q- L& `4 r

* C- H; X, n3 s  p5 X5 m6 @* p        lpdwOffset = &m_lpCandList->dwOffset[0];
/ T) i6 Y4 W7 q6 L1 f0 |) ^
5 J+ e- U% V2 }+ y% I! e" G        lpdwOffset += m_lpCandList->dwPageStart;
5 J, m+ h8 T) H3 D
9 M# u; o1 Z( i        ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );: {& @4 W9 I, M+ l# u

6 v3 X# o' ~5 F        DWORD z=1;9 {$ E3 [' a- t( G, c6 Y8 z
       for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) ; n" Z; W% ?6 q3 Y4 m* I
       {
# y+ ^$ W2 u5 x6 H            LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;8 R/ F# h8 M+ t
           char buf[255];
. H3 L: i' W$ v3 y' [            sprintf( buf,"%d.%s",z,lpstr );
3 o0 p2 \& E: |( x% l            strcat( m_cCandidateList,buf );
8 J/ C# T  I& {            z++;
- W1 s9 `9 N* {; f' g        }
8 |) ]0 Z& e8 N: F
( @$ G# M: m3 _' N4 |        return TRUE;" u1 m/ q" A8 [: p8 p) ^
   }' l, w. Z8 O8 A! Y" J# P
7 R- u8 y# n6 y" {3 O9 \$ p
   return FALSE;. Y2 r7 ]  \; b7 v
}( M# \6 v8 Q* I+ I. S3 j! y  f

6 o4 u" @4 l- L% c) r8 P8 MBOOL CIM::ImeIsOpen()
7 o, k( P  b$ V1 O{9 Y$ j" a8 n  g) ?% F
   return ImmIsIME( GetKeyboardLayout(0) );
/ K! {3 [; L- ]}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-30 00:21 , Processed in 0.018516 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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