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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//
" c3 c- e3 k; L//$ V2 G, D5 T0 y- v$ ]
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家
/ o! i: W0 G7 h// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
$ E6 `& s3 e: u& K3 o: P// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net+ Y! X/ E6 t  }# Y; Q6 }
// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT
3 U, N4 o. [+ |1 c// 为显示信息用,可以用其他方法替换如 TxtOut() 等. n* \& J; y! D
//& r% N9 D! B2 ]( ~3 t
//******************************************************************//# c6 a3 d( A) b& v2 Y3 z  X: l

0 L7 h& x3 ]; ~0 {1 Y, d//////////////////////////////////////////////////////////////////////, j: F$ X* x" Z$ n
//
3 t8 S8 v! z; q" s+ l, y3 B// IM.h: CIM class (使用系统)输入法类
9 U; y" W+ o% {// 2001/4/30 Write by Jerry Wang1 u% m- X: a* N( c! f
// 感谢大大鱼的帮助6 w5 }; `. U7 a8 C9 @
// Need Lib: imm32.lib& Z$ i  L) [7 o& ~) B! U: i* H
//. M+ `! L0 D' f( J( V; `0 a8 e
//////////////////////////////////////////////////////////////////////
; Y3 ~( L; O0 b8 T( q2 Z- J% p9 `: E- _5 A! x+ n
#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
1 h( ]$ E0 s/ M4 k! v# Q7 ?  U#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_, r9 D& u9 ?6 r, A6 t# R8 h

5 N7 y% ~: R: a; W8 _#if _MSC_VER > 1000
  r8 J4 M9 V, v2 T3 C, x#pragma once3 E, L& O: G/ ?8 g
#endif // _MSC_VER > 1000( T2 v8 K5 j# d
" V- v; a4 |) `3 _" B' D
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数& k; m" T& V4 U8 {7 w
$ J4 }9 L/ e% W6 O# y' q
#include "FindMe.h"8 |. `& G% o; Y% w9 c! n$ g

7 q+ Y4 [$ x9 N( L4 Pclass CIM / i/ a2 Y  V1 ^
{3 |) q% D" T* n8 E
private:
) n7 h2 S& t. z% ^" J0 `    CTTFFont ttffont;                    //显示信息
7 q; ~; m: O5 G/ `4 V" r    LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表/ ]9 }7 R) h6 Q) k7 l6 T: `
   LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针, s% w0 f3 C: b6 c2 Y
   LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针
) G/ o+ H; |+ r, v- I4 a" \    char m_cCandidateList[255];          //候选文字列表缓冲区
" m! t% Q: q! x    char m_cInput[64];                   //输入的字母
# r- c/ Y$ |( n. }4 Q) A5 ~0 V9 F- G
   BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串6 ?6 X6 V  S+ s( A! L

+ s3 b$ \9 V0 P$ k  hpublic:
* I" F/ p' ~  Q- h: D$ `% ~
+ }3 Y) h* i+ @/ d2 ?, D7 Z    CIM();
/ m9 Q, M& J* ~; Z    virtual ~CIM();  M7 [- b: B; C( a  d$ S2 z

3 |1 T2 J' f% p. E, B- I    LPSTR GetResultString( void );                     //取得输入的字符串6 X, s3 V4 B# h7 B7 w

* }) m6 ?! c4 h( h9 i    void UpdateShow( );                                //显示输入法信息
5 j- s+ n; j8 ^. \" J
4 r! k7 v# o# m; }7 J    LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述  g8 [5 M% ?6 B$ S9 d7 s6 H' y7 m# Q
   void ClearCandidateList( void );                   //清除输入法文字候选列表
" n1 {* Z, H  s3 i1 b# ?    BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表
, ^, o" C9 p. A" q) {5 [    BOOL ImeIsOpen( void );                            //输入法是否打开
# ~6 n& k7 d! f  f! D: [5 U    void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息  f" P+ L* S% N# ^9 |3 {
   void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息6 I: h/ {4 R/ c2 P8 Z. a
   void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息' C% a8 A. A% U4 f1 [5 X
};
) q- X( K- L. [$ z# p/ M8 R+ p
" P' t9 M% v! h" E; Y) P#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)8 b6 k4 R; |2 m1 v

" y8 J& B, q8 _( ~( m) C8 p: Y1 u, r8 J- s9 ]' z9 `" C" `

6 `" {( i, a7 f) a//*********************************************************************************************//
4 W7 E! ~0 O! }$ x- [" e- Y- E6 g1 B7 o/ t3 ^
//////////////////////////////////////////////////////////////////////
% p% p% o% ]0 T* |6 x//! j+ P2 I2 o0 w# w# D6 w
// IM.cpp: CIM class (使用系统)输入法类$ l  |5 z3 s: _$ k0 P) J" i: y
// 2001/4/30 Write by Jerry Wang
3 [! @6 ?9 m: [( f// 感谢大大鱼的帮助
; m% k4 A- }0 v* C9 L// Need Lib: imm32.lib
: x, u1 ^; W+ {4 S/ J! Y6 B1 d//
; d# j2 h& {: ]( O//////////////////////////////////////////////////////////////////////! c2 N6 b; L3 G4 f  X+ o8 R

1 G+ s9 V$ O' _9 M3 p#include "imm.h", k* C, X+ t4 o$ }* ?! s

4 m; Z2 |  P& l$ Z//////////////////////////////////////////////////////////////////////0 G4 i' m: T; q
// Construction/Destruction% @! p$ E: T6 t: o
//////////////////////////////////////////////////////////////////////% d5 `& e4 B& f# L
8 D2 r- t1 p$ _
CIM::CIM()2 B4 j( R% X6 |* ~6 }" X+ [
{
# k" r& s; `8 K* {; O5 ~/ _9 d4 G8 ]    m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];; O4 [4 D9 a! @# J4 W' }4 c  A! n: e
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );* F3 _5 u1 |/ ~- X* \% W) s
   *m_lpszImeInput = '\0';: }. {5 d6 H" u9 B7 k
   *m_cInput = '\0';
5 t" b' Y7 w9 }, @5 E4 B# |0 P& T; |5 B
   ttffont.Create( "黑体",15,RGB(255,255,255) );
! @- E+ {7 K9 y8 K* m- s    GetCurInputLanguageDesc();
1 |3 t; {8 N; T: f' @}6 N& r3 r- A) R/ f; f& e' n
$ W2 k3 B1 s# Q1 k6 M, N6 n
CIM::~CIM()
" ^$ n; Z4 ^- a* w3 ]" k8 Z% o  R{
5 T7 o; b# L8 |: h9 w$ b# w) U2 g    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
" x9 O8 _+ {5 L6 v
( c/ C( N: ?. Z$ q) [" t    CHKB( delete m_lpszImeInput );
% [! u6 A' w( h6 n, O, _0 z+ S    if( m_lpszCurInputLanguageDesc != NULL )5 E# R+ _5 d0 c" A
       CHKB( delete m_lpszCurInputLanguageDesc );
3 o& l( D( q- P3 H}
& {% P- x, {1 [8 ~1 X) b1 ]( C
( w2 x8 p9 b  j9 W/ Wvoid CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
1 `5 H" ~4 |3 R- h$ b0 y, g, n. `{
" a" y2 h  G2 w& o8 _    if (lParam & GCS_RESULTSTR)
' X* J1 [  N" a, P' G; ^) B    {
! F: [/ O, }3 L; F: `4 C( a        HIMC hIMC; //输入设备上下文+ _. D: F5 Z0 S# Z' Z
       DWORD dwLen;5 N3 D* w+ N5 k, A
       LPSTR lpResultStr;/ X+ b/ C3 Z& |% V( J
7 S* H/ b5 Y" E# r
       hIMC = ImmGetContext(hWnd); //取得输入上下文
7 V- p6 I% Q* {, N- `+ v6 y4 p: M" E- l# k4 \0 O+ R
       if (!hIMC)
' B) r5 q" z0 J6 I- B            return;
& x9 Z0 i* p' \0 \
1 J( o" X8 r& o; }& D        dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);( L, Z8 }3 E9 [, B) ^( q3 ?- n
       dwLen+=1;
% H' {7 W: M- Z/ N$ F, O6 O) i5 P; a
# [+ I+ q+ b' t- p        if(dwLen)
( ]" h$ J! r2 W2 h, x& B+ c        {
* G- X5 ^+ K- Y9 ?: Q" \            lpResultStr = new char[ dwLen ];
( y5 O/ K1 ^! B" X6 S/ v/ i0 }  A9 K+ L1 d9 o, n7 A
           //// 缓冲区已经满了
" k. M! Y, b8 G4 J            if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )2 L( R. `5 h8 f0 `' [
           {
# j+ J* t9 i4 Z$ N% `' I* v) P* v                MessageBeep( 0 );
" g1 p0 m& j5 @                return;
" A3 V! e& n' `8 }            }1 x5 k+ H! C' h# J
           ZeroMemory( lpResultStr ,dwLen );
$ v( ~! u" I0 X' F2 c5 }1 i            if (lpResultStr)# A- V0 y2 O% l5 [. Y
           {' a! W6 o2 x8 m7 j
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);
3 |, ?6 F, o1 G2 K                strcat( m_lpszImeInput,lpResultStr );
' E. o, e. b3 i# Q% l" B            }
2 q. Z: _# {. S1 z% B) d            delete lpResultStr;
: x/ Z' ]% B! s5 o6 k: H" k        }0 W3 E' J" L: y9 u! i$ q0 c
1 g* a. q: J" S7 V& |2 w
       ImmReleaseContext(hWnd,hIMC); //释放输入上下文
8 M0 W' u9 n/ c* {: e1 U( [! Z    }
5 P& [1 p: C# o
  I8 u6 N; R# B: g}
$ J' V1 a1 f+ ]* q* ^5 k/ S  Y. a! n: k9 D/ Y9 w+ [
void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
4 q$ {& F! f. Z( u( u+ g) H{
+ ?/ |# K" k3 }% r4 V  H3 I3 `    DWORD dwCommand = (DWORD) wParam;
- ?. M3 z7 u5 \9 A    switch( dwCommand )
; Z. T& P  p# i, h0 t' J    {
$ Y& b3 f! s! O1 X7 y4 {    case IMN_CHANGECANDIDATE:
# ]* u7 w3 P, j        GetCandidateList( hWnd );, L7 {9 Z' G) o5 j' K4 V6 V
       break;
" U  }; o! m' G! C4 A7 I% y; W3 ?4 J0 K5 u" a5 ?8 g% @
   case IMN_CLOSECANDIDATE:3 R: _% R2 t' D# C8 {/ k0 a/ r! V
       ClearCandidateList();
$ f9 c; F' H: [( ]        break;
  j8 g$ Y2 ?+ z8 F  g+ d6 K9 X; Z5 E$ ~$ N. l/ ~
   case IMN_OPENCANDIDATE:0 O) G- F1 m" q& b3 g& @4 e; _
       GetCandidateList( hWnd );
9 E+ X, }8 ]  F; O) C        break;6 Y1 h8 B1 ~' T* A( J
   }
1 Z3 q8 R$ b1 w, n( n9 b7 B3 k5 U}
/ s4 X6 z( a1 s% a  |: E
) b3 g. O' i5 h. o$ U, p# zvoid CIM::OnChar( TCHAR ch )
' o" g6 w; }% u{! q9 \( n0 u' T' h
   int len = strlen( m_lpszImeInput );7 @' h4 k2 t) ~/ q. t
+ o! d6 L& G# S; i; g
   if( ImeIsOpen() ) //输入法打开状态
; K! f9 Y( a$ W# B    {
% S% P* Z$ R$ D% H  n& P$ K( C% x! y7 {. B6 T1 Y8 x2 c$ c, \4 m  O) l
   }
6 H- n6 Q' a) K  h& Z( I( x$ B    else //输入法关闭状态1 ~. \+ b. A" Z% K* D' e
   {6 {: W& V* Q: f- b5 Q  I' m
       if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母' \1 X) z6 h6 V6 \6 \: D
       {- j0 s) c6 }" ?3 F
           *( m_lpszImeInput + len ) = ch;
( n# g. v5 m, v' ^            *( m_lpszImeInput + len + 1) = '\0';% w( G1 @  k+ A$ Q# x2 u$ O
       }' t9 V& Z8 Z: c' ^3 B. b7 e/ e1 S2 t
   }
: K5 ?# K9 F8 e) {& l, u1 S9 E3 \' V; ]& I
   if( ch == 8 ) //BackSpace字符
% z0 A8 [  i5 w" {" A$ d4 H- _4 t; l. |    {
1 D1 R! w) ~3 ~& Y        if( len == 0 ) //字符串长度为零2 J4 Z9 F# [/ h2 X: `5 K1 a
           return;
" q/ F+ E- z4 \+ a+ V  a/ O- L9 m  x# C) z# k- T  n, Z+ a9 \( X
       if( len == 1 ) //只有一个字符
4 C* g. G3 l  G- t$ M4 L        {! ^- {' N; |# h# q! d2 c$ d
           *m_lpszImeInput = '\0';
5 z9 J1 [" u( D            return;
7 b0 e8 U* T; {/ j        }
; v6 O# `0 i" {# ?; F- H: z3 ~% c1 }4 z% P* \$ U7 p8 K1 s
       BYTE cc1,cc2;
6 X2 V4 R/ e3 W  ]$ n& W- m        cc1 = *(m_lpszImeInput + len -1); //分离字节
+ {& _7 V5 }; W' l3 T        cc2 = *(m_lpszImeInput + len -2);
: T/ n) q8 R2 p* N
( c8 N! b9 @- G" I! i3 z        if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0/ g' Q' E& @! V2 _0 B
           *( m_lpszImeInput + len -2 ) = '\0';
: E  \" H2 Q  `5 ?: z- l1 `3 _        else //是英文字符(单字节)* P) V9 z& @8 [
           *( m_lpszImeInput + len -1 ) = '\0';: F% g1 i/ f  H/ t) e7 Q4 C$ X  Q: G
   }
* Q- T2 i1 ^8 @- Q: M2 p9 t}
/ U8 l# @# w( V) b5 U% K! X
/ E, {2 ~  h2 C  \8 ]$ M+ yBOOL CIM::GetCandidateList(HWND hWnd)3 v9 Y3 ]1 i) ]3 {0 V1 }
{7 m$ q8 {% D$ j4 H
   DWORD dwSize; . X; D/ k% @0 L8 T
   HIMC hIMC;
2 `; f9 x5 r0 g# |  R+ L, O) P" w! q8 v+ R  c' Z4 y
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
$ k/ Q4 A2 p( f2 j! ^3 N, B! T; B, s/ \  j
   if( m_lpCandList )
" g' t8 Q& A% t3 G) m    {
/ g7 X) r2 M& d; R0 X2 m* L        delete m_lpCandList;
/ ~# x$ R7 c, I7 s7 v: z0 B6 H) ~        m_lpCandList = NULL;3 H- e' `+ Q8 E0 n6 |+ S& [
   }# ~9 m# T# @) \! C

5 y1 n2 m# i) T. M1 D    if( GetKeyboardLayout(0)==0 )
5 W3 u: y$ Z4 N( ]. Q) G  \    {; }. ^! A" _. m7 ]' n4 x
       return FALSE;
/ }9 l5 V9 e' z8 k0 k    }
- n4 @2 x* ?" x% x' v2 ?, f: e2 q! g. P  y
   hIMC = ImmGetContext(hWnd); //取得输入上下文- e; U3 v+ @9 r- }
   if(hIMC == NULL)
1 L3 W( z- T7 K$ M: k    {
. n. T9 r# f- F$ a* x        return FALSE;; j6 k; Z' v# x5 j: D  {
   }
4 o* Q2 t, v3 ?0 g4 t# W0 ?- |- Z6 }- k
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );- v- x+ B7 ]) U0 }$ A) Y
   if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
+ v& l7 W/ ?3 H% [: g' v: k6 O  i5 A    {
# V( b( k) a& [+ n* |        m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
# U. d  a  G6 [' l5 r        if(m_lpCandList)
6 j, N: k5 }$ N, {  Y5 g3 a. O: R1 X9 h        {
0 v/ H2 @: e# J  B: e            ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);
; d  T: Y1 p2 J, _7 i* E            CandidateToString(m_lpCandList);
) v& E4 I% v$ S) I0 v1 \        }  P4 @8 k0 x4 `0 _) K3 Q+ H
   }
0 L/ ~5 `# O6 I4 C' K- G- v  X0 v- w/ O( e+ D! @9 F
   ImmReleaseContext(hWnd,hIMC);; i; j0 C& r7 z% M# g

+ i! `/ A: e9 w# Q# I. {" W    return TRUE;8 C, H: N3 \: z8 ^1 x1 I
}1 L, M* L0 [! j& H" n
" K1 s/ ?0 Q8 p! s/ \4 N
void CIM::ClearCandidateList()
3 g8 i) m2 _( _4 `: g( V7 Q{; z8 I  @' s6 t: L
   if(m_lpCandList)0 x% w2 V+ h3 @% N8 C
   {
$ E, n  o" E; o8 o4 M/ H1 H$ J6 Q        delete m_lpCandList;
7 S# b; e9 X) ^        m_lpCandList = NULL;0 F% p/ R0 ?6 T0 E) C
   }
4 a8 k9 ^. U; n, b, m    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );2 e/ }8 V/ m8 r$ y: h
}  i' Z$ t- ~# x- f0 E" k7 ?
* g; {" R7 E! N, N' Q

1 N+ p* |! {7 ~; `; s0 B" dLPSTR CIM::GetCurInputLanguageDesc()
* D% P2 Q! s2 M/ ^- z{% ~: i% @1 Q5 z% `. a9 p
   HKL hKL = GetKeyboardLayout(0);
& I% R9 g8 H: H9 Z- N8 r) V. z% ~1 q9 ^& I  ^, d
   if( m_lpszCurInputLanguageDesc != NULL )
- L7 `/ ^( u8 [% @$ s  y( ~# x        CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^2 F4 j8 o; h- \  j; O5 G/ h

( G0 W$ U& [# y1 W% F    int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度* \; l" s5 N: M

( T' m8 X4 Z  z    CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );
  r$ e- d2 z, u. w) s. u  L$ C5 Y' \2 n8 z: v7 }; g
   if( lengh )# A+ ]( D* R8 G; P* m% I( H( I' A
   {+ Y3 T4 H" h( D) D8 O
       ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);
6 _, d* I9 [0 Q+ G) S    }
6 {8 t% N9 A& j: M4 T+ r% S    else$ t0 y0 G& {+ L" u, g2 y
   {6 V" _5 O& R5 W" [3 y+ W) g
       strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );
- Y+ J( i/ r$ }) j, y    }- @( S* E  T. J% |6 b5 T) ~0 ?

$ L# k+ w  w) f4 l! _    return m_lpszCurInputLanguageDesc;
/ x) k; n7 ^+ R% {- z: w  y, _/ V}
' U! i0 K# a  {5 J% Y, P& o5 M' l; ]: A! a
+ Q4 ^. v5 Q3 A1 @( I& Zvoid CIM::UpdateShow(). E& y" ]; h1 ~+ e2 E0 B8 u
{. K# _9 ]2 s% d
   POINT pt;
2 n+ B5 A1 ~  [+ h( \0 R$ f4 ^* A    pt.y = 450;
8 Y, P; Y( i1 ^8 i. r( p+ c" P6 c    pt.x = 400; ( w$ p! e! v* J6 ?
   ttffont.SetSurface( DD_GetBackScreen() );! D; K0 X6 C: d. j7 [" v
   ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述
* O- h/ i$ m8 Q, t: O& A; ?% w9 M7 i& i4 [
   pt.y = 420;
1 C( y# f* t& y- z    pt.x = 20;2 R) s; G' R7 K( u' w
   ttffont.ShowText( m_cCandidateList,&pt );
3 j9 v9 Z5 T* x  U& w4 n. i" E1 v9 N5 E! Z+ X; Q
   pt.y = 450;
* c( e1 d3 V6 n' b! _, ~    pt.x = 20;8 x; H9 B6 N! [9 f
   if( *m_lpszImeInput == '\0' )  i. T1 o  }% O, Y' [* |
       return;2 H3 u6 N+ b/ e: X
9 M( t, f, C# S( @# W6 `- f( e
   ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字
5 k  W# Q/ ?2 N9 M2 i9 _. b; s1 V8 B}8 u* \0 K8 q: V
, K% ~4 E( ~( V5 ~) `7 E$ f) C% w
LPSTR CIM::GetResultString()5 r6 Z- S3 M4 y
{
* ^2 o/ \7 _9 b( a$ @    return m_lpszImeInput;9 h7 J- L0 i6 f% `- R  P
}8 I; n. u8 ?& x' R

  b3 Z, P, T& RBOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
- q; ?  h2 h7 L2 k8 g{$ S* f5 k$ N0 K7 w1 j: B, S
   if( !m_lpCandList )
" |8 C* N2 v9 q( u/ X# n1 A* ~: B        return FALSE;+ F  H) u7 _" `! c; I6 z& l

) z& s0 g: V0 ]' \( X. T# [    if( m_lpCandList->dwCount>0 )
) i; {0 J* v4 M    {8 B4 S& \0 Z4 _, `- [* d7 d1 \6 F
       LPDWORD lpdwOffset;
6 |0 _. f$ N6 G' f, |- i- ]# B2 I) L: B# D+ ?5 A; Y* k( G* M
       lpdwOffset = &m_lpCandList->dwOffset[0];6 V1 L' a( L: X" T  ^/ E4 @
" C7 v& L- ?! a# y. z' _' a/ `
       lpdwOffset += m_lpCandList->dwPageStart;
$ @1 c2 K" k( P1 k  R# V2 U
  d, B( D3 d2 Q* p" ^        ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );/ |7 z  {. e$ K5 q4 L1 S$ a
5 p$ I: B2 D+ E9 k9 v
       DWORD z=1;7 L9 y/ m6 m; q% e* D* A: N
       for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++)   B; h- I+ F" z+ W& g6 V
       {
5 [' U  D; M. F9 [9 v1 x$ t/ m  X            LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;: x; `$ ?3 S; Z, ]' I  T1 c% F
           char buf[255];
* p/ U5 z/ I# u7 y/ x- ?            sprintf( buf,"%d.%s",z,lpstr );
, Z; b$ I9 c8 g4 w4 y5 Z7 y- D            strcat( m_cCandidateList,buf );
7 Z% }* i$ ]: T7 e9 P4 \            z++;
9 L# A) G" S: d/ N1 t! S( w/ E/ ~/ m        }/ G; d9 _1 W0 S& u& C

- g% \6 W0 n2 R        return TRUE;. w8 J: f5 c0 {  |# H
   }; u- Z# I7 N! v( f

! Z' B$ P# a0 c  V    return FALSE;/ G+ H& f0 f2 C: d, i; d5 I* }
}
0 l" R4 H9 Y6 \$ }5 a8 E" a% E& A; d) X1 F+ h- i) p
BOOL CIM::ImeIsOpen()
+ @6 ]; q1 }& g* z8 Z) ^7 I; H( }{$ J0 V2 y% a9 Q- r! g, v4 [* c
   return ImmIsIME( GetKeyboardLayout(0) );. G# E& F7 [2 d5 j( [( N8 M, k5 F
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 18:13 , Processed in 0.018582 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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