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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//9 p* n3 K9 l- |' M) O, S! C
//
" @6 d/ p2 P9 z( L6 f// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家: g7 H6 ]' P' {, }8 `
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
( ]' Z7 ^: M! p0 U! ?// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
6 v, Z: z7 R8 c7 G: ~// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT
: n# J* a/ L2 K* o8 n9 o" J( d, n; s// 为显示信息用,可以用其他方法替换如 TxtOut() 等
9 `  v3 H( L) k+ F//
3 W4 |$ C9 T# ~& l//******************************************************************//! L% j% \2 W: s" z9 C

- [6 h  G5 T4 x//////////////////////////////////////////////////////////////////////
. U6 d/ f4 p+ H2 x# E7 O' C7 l% G//
" v  r: c: t! l5 n& `& o% n: f// IM.h: CIM class (使用系统)输入法类
) B: i* M* R* o/ D2 j( e2 m0 D4 {// 2001/4/30 Write by Jerry Wang
" t. g# U$ R6 W& F5 j// 感谢大大鱼的帮助- C0 Y1 K. `2 `. y( U# h9 \9 T$ @
// Need Lib: imm32.lib
' u) s# @/ N1 O9 Q0 T' C//
/ b. m  q# R5 `! l% e( q//////////////////////////////////////////////////////////////////////4 z. L$ R; e' u

% p* T9 H  h* C  K( y7 W4 Z#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
# B& M2 n4 i$ [! s/ f' {8 ^#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_+ n! a+ t' H7 K4 ?' ~

$ D4 F/ d1 h' e& d* H* I#if _MSC_VER > 10004 H0 Y; t6 m/ G" l' r0 ^6 O: r: N  j
#pragma once
! ?, O" t5 x: d' ?" |#endif // _MSC_VER > 1000' p) }+ ?- C: K8 ]8 J6 u

7 x8 p5 h5 N* }  i7 q#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数* \% J/ ?- H5 `# X4 ~
: _) x5 w, E9 G3 ?8 D/ E, g1 L+ E
#include "FindMe.h"4 S2 d9 B: K" r) \1 A
$ C0 i3 c( U- q3 X3 }
class CIM
2 g6 e0 \0 y5 V3 {% E{
* h  @2 |: H) e# K( Bprivate:5 `/ h/ H: C$ p7 Z! U+ ~( k
   CTTFFont ttffont;                    //显示信息0 y! s: y5 p5 T: D8 N) |
   LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表4 @1 j# z0 E0 ~' o. w  X0 i, @3 d
   LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针" s) x2 W8 i9 I% r
   LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针3 _2 U) G+ l1 O$ K
   char m_cCandidateList[255];          //候选文字列表缓冲区. X% y0 b; `* ?4 ~: L6 Y
   char m_cInput[64];                   //输入的字母
6 r; h8 i0 Q7 M4 I3 X# j/ c  O! x- T1 ?- R1 ]
   BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串
& ]& f5 v# b( l6 g" _) O) @! |1 G( r
. m4 R% e2 c5 E) epublic:% I' C- d' E7 {" Z

: R6 x3 w: K9 k" m    CIM();7 q* s$ T/ p: W& C; _' m
   virtual ~CIM();3 e. r- H! Z5 H% I
1 @* G% Q5 ~% h4 \1 `
   LPSTR GetResultString( void );                     //取得输入的字符串
. W4 z& C9 {$ F- y' u
9 m0 f% M7 ^" y3 z' U2 }    void UpdateShow( );                                //显示输入法信息9 o/ B& i' x" w* v" m9 ?1 Q' T, Y1 W8 L

. Y, T) x- t( \) |' {    LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述
) ?" S/ C! p& z. \    void ClearCandidateList( void );                   //清除输入法文字候选列表: H8 }: W# I/ n4 o6 N, i
   BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表8 O1 N. Z: E8 G
   BOOL ImeIsOpen( void );                            //输入法是否打开
$ [. {! _0 p4 g    void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息1 \3 k9 J, n) L! T& |
   void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息* p, ]7 e1 y1 @% }; F& w, u
   void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
: }. `7 _# r$ Z& M( H7 f};# w$ d6 K$ _" C
8 k- h1 p% X6 I- g; `" \0 _
#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)" F6 K# I- D. B) F" g

+ `* P' y! ?4 X
6 I/ Y% J4 [2 J; C7 U& ^8 T9 B  g  ~9 m# y5 Z1 H/ T1 c$ s6 k
//*********************************************************************************************//9 n# T3 g: ]0 k! b
8 M3 i. Z! I; X% w0 u
//////////////////////////////////////////////////////////////////////
6 |9 {' x! \" E* `3 T" n3 S//5 p( g" _5 J& _% Y- ^" B" z
// IM.cpp: CIM class (使用系统)输入法类6 r) l9 V3 ^3 V6 k; z7 e- \) v
// 2001/4/30 Write by Jerry Wang
) w7 Y6 a( `, k* {/ V9 u$ w/ W2 @; Y// 感谢大大鱼的帮助
3 Y8 T( u! D: q0 k# d+ F; o// Need Lib: imm32.lib
8 [. |* M1 Q# V1 ]* ^3 V//
9 |; ~; `+ r9 K2 R1 E; n//////////////////////////////////////////////////////////////////////8 z; U7 z6 ~- w- P" `

/ n, P, m# S/ {1 U( D: m7 Q: ]#include "imm.h"+ q3 q! n& H. d( M" ]# E
$ p9 C) @8 \6 V. Y- Z, n% t- }
//////////////////////////////////////////////////////////////////////  j$ j/ n1 f5 {1 ~
// Construction/Destruction
9 O- R2 ?6 `8 G0 e//////////////////////////////////////////////////////////////////////
! i7 c) G0 T: [( K) D5 R% \# X' s, V/ }
CIM::CIM()
9 F9 R* N, o- n9 G8 R, P0 X{; G' y$ q6 d. d/ j! ?
   m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];  n8 [2 i; v% e: u
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );0 P/ p( c2 Z4 v$ U* ?3 Z) h
   *m_lpszImeInput = '\0';7 S, o' t9 R% H
   *m_cInput = '\0';
( y" u0 B! u% o3 ~. J1 b: {& V6 t/ X- V. b
   ttffont.Create( "黑体",15,RGB(255,255,255) );+ O2 C) k3 C6 ^! j
   GetCurInputLanguageDesc();/ k: I0 e; w. |. Q4 e
}
0 B  C" C. L! T! Q+ a
4 v# R* e; N. ^, q& F1 nCIM::~CIM()
9 m( e& G! A$ w* y$ l4 `# o8 x{
: f! w* X  D; D% F    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );. i! x9 s* h' x
9 V/ p' r. S2 g) A! D! U
   CHKB( delete m_lpszImeInput );
4 R7 ~* @) z4 c8 }' D    if( m_lpszCurInputLanguageDesc != NULL )+ `/ R: D' L* O' j4 r/ q  M% z
       CHKB( delete m_lpszCurInputLanguageDesc );
5 |2 Z: [6 [, o+ c}
" L# b" d$ e" P: d  }; s! r
- p2 Q( |9 i: rvoid CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
6 X6 v  h# \  l+ |{, ]( z. J0 z& b5 f5 u
   if (lParam & GCS_RESULTSTR)6 ?5 G; A9 S6 j6 x+ w7 r, v
   {( V/ C/ K! ?! \: R0 ~7 a) t
       HIMC hIMC; //输入设备上下文
7 {; @2 n4 k# N0 Y; J: o$ X( `" W        DWORD dwLen;' B% e! y+ m& j& A) F" n$ i
       LPSTR lpResultStr;
+ k% c2 ~$ e' {$ F, _3 t5 ?% _4 Y( L0 F! R
       hIMC = ImmGetContext(hWnd); //取得输入上下文
2 [, H& }, ?9 x5 ]! T0 @! h
  F( }, b+ D3 U* N6 m        if (!hIMC)
% E/ ]9 p& _1 |0 u' n4 Y            return;8 B7 x* E. ~" Q. C& I. Y  j
* u# U  t. `2 e
       dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);" o7 p1 O# y) o
       dwLen+=1;
- _+ S0 }4 H6 v; a0 T7 j+ X$ R8 B2 H& u3 n! Y( ?$ |5 H
       if(dwLen)( d6 D' k! A& o; n
       {
3 O' d; I% e  |; E0 }, C/ T5 O            lpResultStr = new char[ dwLen ];* O2 J' b" g8 E2 N5 b
+ G7 C; U' b: E8 j2 M
           //// 缓冲区已经满了
) w7 y) t; j9 D9 g+ Y6 M9 o            if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )# t- K& q1 y6 t) B
           {! ]5 S' P) C4 g0 h( B9 |, {
               MessageBeep( 0 );* }& ~. r4 V/ Q6 t. |- j
               return;, @+ K3 G9 D6 W7 D, a3 w
           }
; m/ d$ }1 X) ~8 p/ @1 |  ]2 N" }            ZeroMemory( lpResultStr ,dwLen ); 7 u5 Y3 A$ u* V# @/ y, a: }( x' ~
           if (lpResultStr)5 d9 S; J& j6 F; H5 h' x% E1 I2 B. ?
           {
6 |, V7 t% e( y$ N8 B& S* z% P                ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);2 B$ x0 y0 X# V1 n1 S
               strcat( m_lpszImeInput,lpResultStr );) O4 @2 M8 E  v+ i% q8 ~
           }& N# i& V% ~1 o9 ^3 c# V
           delete lpResultStr;
+ {3 K) {' h3 C( P! t! `        }
. S) B1 ^7 W5 J, j. G' U5 C7 ]" Y6 m* J
       ImmReleaseContext(hWnd,hIMC); //释放输入上下文
! F/ Z+ t/ R" t+ P    }4 l; t9 Z5 E& \" I5 K& J
/ T, ^4 t. q" O6 C6 N3 |5 R( J
}+ j- a3 G( I) m" {

# t# r  z4 X! R  C3 m9 K' cvoid CIM::OnImeNotify(HWND hWnd, WPARAM wParam); x% n% C1 f' @2 r
{3 Y! h( ^5 a, T5 V3 m: [( k7 G
   DWORD dwCommand = (DWORD) wParam;
* _5 J; j# u; Z) T" C9 X, }( E    switch( dwCommand )
( F7 s8 Y" g6 X  |. ?6 I1 \. `    {% Y" ~$ k6 u1 S0 A& |
   case IMN_CHANGECANDIDATE:. T0 |) r- {) o4 `
       GetCandidateList( hWnd );
2 I$ [. }: k/ ]! w        break;
- z. ?2 r) E, f5 S; J+ d& e* P) Y6 Q$ C/ P/ q7 f% W% k; x
   case IMN_CLOSECANDIDATE:6 w/ ~! \- U) F+ ~+ ^8 x1 L) z
       ClearCandidateList();: {" |) e# I* y, _, ~9 `# P, o3 @
       break;5 H, @: T$ P+ R# T; Y) t
# B. ^1 ?5 Z$ B, ~  X) K9 O
   case IMN_OPENCANDIDATE:
1 u$ @, p# @2 m+ e8 p( f        GetCandidateList( hWnd );
; W, n6 [+ M$ e7 W5 f        break;6 l- l" v2 B7 X5 H8 Y" g: b, O
   }
8 O3 ?4 M4 b! k. F" x& n}3 \* E. x. p( _7 w( i/ C% e

" F; ]) r- X9 N$ ~/ y% x. Jvoid CIM::OnChar( TCHAR ch )" d5 k+ ^0 }) ^8 E, n
{
. m" e: V/ Y5 x+ d2 h5 j% K    int len = strlen( m_lpszImeInput );
5 b  K1 e3 f) n0 L9 @. F6 c1 [4 l, x! h
   if( ImeIsOpen() ) //输入法打开状态
( h9 T8 y0 i( y    {2 r& Y% \2 B, J; v
3 ?( d8 G, d  A4 [) {
   }; o$ Y+ _  J  b6 x) r4 h6 @# c
   else //输入法关闭状态
! W  c' O: Q# U. C0 Z: _8 h    {
$ v3 S; ^5 f" `$ a        if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母
& W4 ^. D0 U6 m1 a% f8 G5 [        {
7 z3 F4 _/ [/ h& z            *( m_lpszImeInput + len ) = ch;
5 y. y) |5 h/ D8 T            *( m_lpszImeInput + len + 1) = '\0';
- M/ }  l9 v( ?9 u' D        }5 f' @& p9 L3 }! p7 p& J, b
   }+ W9 B7 p& J) N5 i/ N

' E/ T; B3 u2 h- N5 b1 t    if( ch == 8 ) //BackSpace字符
% c: H. w  V7 x. s; o8 c    {
6 g; E) R$ z- K        if( len == 0 ) //字符串长度为零# L- _- N' P, z* G% T, k
           return;
- F, c" ^# I5 X* B, A  R; c+ @0 ^$ L8 B! D4 K  m
       if( len == 1 ) //只有一个字符* C. K$ {/ T1 y+ F
       {# L9 ~% J6 s7 G3 ]0 Y- ]% a
           *m_lpszImeInput = '\0';6 Y4 D+ h+ H% s, w/ r3 R3 S
           return;  v& i3 O" O$ B( t5 w% V# [8 ~6 f
       }
7 u3 s- }+ `9 `/ m* \# H
& L$ h) \! c: E1 m. v% j% V/ }        BYTE cc1,cc2;2 \0 @4 P7 J  o- n3 g4 c
       cc1 = *(m_lpszImeInput + len -1); //分离字节
1 }. m, H- ?0 O: @. O        cc2 = *(m_lpszImeInput + len -2);
- l: h: s' E: N% i5 U% l; s7 P# R% k8 L$ R3 T' r6 g  b% ?5 R
       if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
$ P# P: E1 Q  P' {/ W9 o            *( m_lpszImeInput + len -2 ) = '\0';
, B6 N3 Q+ L! d5 H: x. O7 T        else //是英文字符(单字节)
; k. ?: c8 ]* t2 x1 G0 l            *( m_lpszImeInput + len -1 ) = '\0';
- W: ]# E# v% h' w! O! p7 Q# k0 S& C( F    }
/ ^7 R& a9 u3 P5 H. c  I+ H$ x$ M}
) ]6 ~( G. i! W
( U9 |  v# e, b/ N* pBOOL CIM::GetCandidateList(HWND hWnd)5 x) ?0 a. I  T% y
{
& Y' i7 Z  h- d- q+ y    DWORD dwSize; ! e2 G; `" Z( ^# }2 t
   HIMC hIMC;3 D0 A: k% Z4 a+ [0 {" B3 c
: e; n! |* h( [  h$ X2 ^4 i
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );3 j0 \+ ^9 T: T8 p7 y
; S& |8 R: }  H% R
   if( m_lpCandList )& n; y; ^6 Q: c' ^) m
   {
4 }2 |% N( q! m. E  f' u" o( y2 g( a6 ]        delete m_lpCandList;8 S% c) w; K% b6 q- F, t7 T
       m_lpCandList = NULL;9 ~% b. O' f. M  f: G( U+ \# R6 t
   }
" m. J% p+ j8 P3 n! ^$ E9 U
+ `# @5 |& [! o) T+ J    if( GetKeyboardLayout(0)==0 )
$ n, J- O1 p4 G6 u% [- R4 A    {
7 x6 o; ]# w% Q# n        return FALSE;! Q- _1 S8 W( v1 T
   }
2 q1 r) g8 V. {5 {5 ~+ Z! V9 V
& [0 {% x3 `/ f; d, ?1 o    hIMC = ImmGetContext(hWnd); //取得输入上下文$ `/ k$ y$ d0 O
   if(hIMC == NULL). E3 S8 X, X  ~$ V6 L3 Y- C
   {
" V9 ^7 C+ w) [7 d! y2 e        return FALSE;9 w. i; I' x+ W8 `$ E- F1 n$ A# s, L! |
   }% m  y* i) o7 a% u( B/ E& K
+ R! Q  C. [' B7 e1 K  k5 a) q. f, k
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );! E6 w$ F; |) a
   if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
2 r& h3 N. y: P) _' ^7 S    {9 O4 J, Y) P" Z! D. ^
       m_lpCandList = (LPCANDIDATELIST)new char[dwSize]; * B7 i8 f* H9 }% N2 t! }
       if(m_lpCandList)
+ W+ m, T% u3 u! X% K8 {        {9 y5 d" w# A1 A: y
           ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);: Y/ @7 t: o! x
           CandidateToString(m_lpCandList);
2 {/ m0 Q$ {+ D& E; @# X; W6 }* K9 q        }
+ j7 I, g% N/ Z8 ?    } . O1 _, z7 g7 x1 g

% Q2 d" j5 b+ z# ~1 b    ImmReleaseContext(hWnd,hIMC);  h2 D8 e. H' I' O
3 @4 Q6 l& p# M
   return TRUE;
9 \3 `! P5 j7 m6 \4 [$ P0 b}
! z5 |- r( ~8 ~/ k: Y( c; Z( M3 F4 E
void CIM::ClearCandidateList()
  \0 d& F( `* r* p7 ^{
: y6 v4 @: j8 |    if(m_lpCandList)
$ ?( |: Q/ f% ^1 F2 g/ R( i2 f9 b    {
( m8 _" M5 B1 M        delete m_lpCandList;
, C8 Z5 b; v' d7 v        m_lpCandList = NULL;
  H8 p: I& G0 P  T  v+ D: [0 Q    }
' a" |, u: ]2 o8 |* q    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );
& K- ]% i% R: N! x2 N5 }, O}& J5 S3 F, J, C, l3 V6 n$ I

6 f: D0 D$ N5 u* U/ T! }6 r2 |( l# f* i# [
LPSTR CIM::GetCurInputLanguageDesc()  M- L# E( J7 i' d4 @2 B
{( N& x1 B; k; g/ V% K! Q$ f! x- d
   HKL hKL = GetKeyboardLayout(0); ; `3 D4 i2 g! D, }+ M2 K- y
# j& {5 z# G3 N: Q4 \1 Q) y3 u0 W
   if( m_lpszCurInputLanguageDesc != NULL ), h. }6 W# h" h8 k4 B1 f9 G6 C$ U: c
       CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^2 g6 r+ Y7 f# }+ [/ ^, {

4 W" I: {. t7 T6 ]    int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度9 [  D" J. ]: R

0 i9 T6 T8 A' H) B+ P    CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );3 Q! C5 u" X% O  a9 t

1 M0 M7 f' c' M" e    if( lengh )
7 D7 F* u/ V3 q    {
' x: S* x6 V0 e0 V; @' W7 b        ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);
) O3 ?; f" B! o    }
$ ]  `! u1 q$ e$ W  L    else
" O( Q: Z' J1 j4 \" l    {
5 R8 Z3 G+ m, h# s3 t& B        strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );* ?4 P! f& ~; R# g
   }
9 ]. j; H3 g( n; Z/ W7 {2 x
. q3 ], N' }! v% r4 y- R    return m_lpszCurInputLanguageDesc;
$ T; P# }# F3 r0 D% O}
5 ]" G* u6 B5 v3 n$ Y) H7 G& O+ A: F  [1 F' b- E; }4 M
void CIM::UpdateShow()* S1 c. ~# y5 j* g0 ~7 N$ `- W
{2 C1 v, l6 r2 |2 |
   POINT pt;
) I$ y* k$ o8 f    pt.y = 450;
. L) U2 z  h! V5 H    pt.x = 400; 4 B1 v0 g  w9 ]9 d" O& ?4 d
   ttffont.SetSurface( DD_GetBackScreen() );
4 q6 x9 K; R0 {+ ?    ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述
& S: q0 {9 `& ?
+ t6 l$ z0 _) E* |- p- y    pt.y = 420;
% v# V' D: T. j$ X: U    pt.x = 20;
/ b/ L7 e/ {  T; f( h3 {" C    ttffont.ShowText( m_cCandidateList,&pt );
) C9 a7 `2 `5 v5 s' N$ X5 X( \! h5 d; U* K7 ], U
   pt.y = 450;: Y; ?+ h. ^6 N1 N" U, q
   pt.x = 20;3 Q- w) Y. L/ `* M2 n5 _4 Y. p- J
   if( *m_lpszImeInput == '\0' )
  K0 Z9 F9 S4 a" u' D# U+ u        return;
. I" i/ J% A( ^; `; X. k* f
" M8 c3 n; U% |/ u+ s    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字
  F# ~4 _$ j! C9 x}4 K/ j2 j7 z# S

# S! U$ p" q9 V8 OLPSTR CIM::GetResultString()
6 D2 z; m% {0 h  T; L! V{% ~4 o9 y$ B3 b$ p4 q! b
   return m_lpszImeInput;, D# d/ t# p; O) p$ ]. f8 l
}
! C: F5 A; u/ H/ K
& B, ]) @/ Q# |* ^BOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)4 t6 }6 k  t. o% f
{7 z) ]: k7 A8 k/ C1 G  F) h
   if( !m_lpCandList )
, ?1 x' x6 Z- }5 h        return FALSE;
( L) i9 k6 T) h2 |+ H
7 E2 e6 q" K) o( m/ F2 Y7 S    if( m_lpCandList->dwCount>0 )
" N. ^7 Z$ _; y1 l  K, t. Z    {: E; t) a% Q' W/ l8 [
       LPDWORD lpdwOffset;" \9 J( U, B7 D9 X+ Q- |
* Q3 z+ _+ z8 O, d7 T2 \2 C
       lpdwOffset = &m_lpCandList->dwOffset[0];
9 F8 [9 s  }' b( u; T8 g1 l7 z# C6 @
       lpdwOffset += m_lpCandList->dwPageStart;. b7 M) R) A0 m* ^8 J5 Z9 m6 \- |' K

9 o) a, Z5 o* V, U: z* r        ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );; ?: ~2 l* ~, g" _) d

2 q: _7 a1 ~7 z* N2 G3 h" L        DWORD z=1;
& c  _$ X' ]5 `6 H1 \6 x        for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) ) O8 ~% X5 p7 W9 D# k2 V' g
       {
% K$ H9 P+ R1 }* l            LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;* V) t' r* Z" b6 f
           char buf[255];$ Y7 ]. o' a/ ]& f
           sprintf( buf,"%d.%s",z,lpstr );
' T( p  @% F9 D- {* C            strcat( m_cCandidateList,buf );
2 S# g( V7 V4 P) h% u1 P8 g            z++;
0 f2 G- K7 @+ b& @0 W        }
! o: i: s' d. \
  Z+ }" g* l1 n" c* p4 I$ [        return TRUE;
7 V$ e0 J" T0 Y- ~    }5 N/ h8 R) I4 Y
& F' Y* j7 F- H. c6 F4 L% G7 K( o, \
   return FALSE;2 q0 I$ P4 [4 M6 e/ n
}7 A" C+ t/ [  g; x+ }: m+ f
3 [4 y! G; P: P# |/ u$ e
BOOL CIM::ImeIsOpen()
8 Q4 ]# K0 L  U" }- ^{+ F) D4 r8 E% d
   return ImmIsIME( GetKeyboardLayout(0) );
1 L! ?6 Z: j5 T}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 20:08 , Processed in 0.019479 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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