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

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

[复制链接]
发表于 2005-5-16 14:49:39 | 显示全部楼层 |阅读模式
  //******************************************************************//. L/ h% Q+ J5 ^7 X2 q+ N9 }
//
% E- g2 K0 E& F// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家: a9 `0 f* p0 v) {' p* c
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
" b$ U8 |* w9 e4 f& N; c// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net8 c4 o8 ~& K' F1 R( ~
// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT
( d2 }7 _5 x( [8 P5 F// 为显示信息用,可以用其他方法替换如 TxtOut() 等5 l8 Z! X, y/ O" c
//
9 A6 q, l% m0 a  ?//******************************************************************//
" X4 D/ {3 s6 _. T5 D( Y& j# r) M5 n3 i" Z4 @+ t9 r" K+ V1 b
//////////////////////////////////////////////////////////////////////! t8 J" W* e' a3 C4 p# P) r
//5 g% W2 l* B; p7 I) E
// IM.h: CIM class (使用系统)输入法类! c" k  ^- \0 k
// 2001/4/30 Write by Jerry Wang" j0 X: y$ z5 O% h
// 感谢大大鱼的帮助% Q! \+ ^: c* A0 f/ h
// Need Lib: imm32.lib
5 V+ k' P9 U" c: E9 |//1 _, f6 U6 O- f' B+ i( s! o
//////////////////////////////////////////////////////////////////////
* t% S" r( Q& [7 w' V7 \$ R
, t( s( n) m, `5 g' @& S' k1 r: h# L#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)6 }5 u$ m# n4 R
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_
& @* f2 g. |* p! A
# S$ b. G' F6 ]0 L7 m- Q7 k; a: v#if _MSC_VER > 1000$ J4 v3 k7 F- z2 f6 v
#pragma once' `2 L  O/ u9 D: D  {
#endif // _MSC_VER > 1000
. I( I8 \+ F4 e  Z4 K# Y1 t) A4 d* ?. p& W+ \) r2 Z# X2 t- U
#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数
* f1 e3 |- Q$ ], u0 V" U  ], l3 ]3 D, J! f, F
#include "FindMe.h"
. u  s# d* j4 w/ Q* L/ Y) O
$ b/ I) X9 t" }1 q  Oclass CIM ; P/ @# E' H8 g0 P6 ^8 X1 F9 P& ?
{
: J# R" N1 L. @: S( ~private:
7 F$ V, \) U- _) C3 y" ~    CTTFFont ttffont;                    //显示信息
$ `0 |! I5 d8 }; w1 O8 ^    LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表
) O% B. i3 r. H0 F    LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针1 t; {, \0 h$ b
   LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针) c- a) X. j" C2 I
   char m_cCandidateList[255];          //候选文字列表缓冲区
, Z+ J6 I. l2 w( C    char m_cInput[64];                   //输入的字母$ p% z- @& S' s1 d

9 V; P7 s* x& A  g* j5 W6 Z' _    BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串
+ L# @8 k" }; K7 r3 x1 t9 L8 a! W6 N3 e
public:
; i) v2 Z- p3 Y1 M. z
' r) M8 v/ _  @    CIM();1 S, J: ~' i' N& t
   virtual ~CIM();) }' E! Z7 C6 y6 D& \

9 x9 a3 D7 l9 B5 G1 Q    LPSTR GetResultString( void );                     //取得输入的字符串
: F4 p' x- z& q  ~* l+ W7 w
* v7 S6 l# J: d* h    void UpdateShow( );                                //显示输入法信息1 Y( l7 r( w3 L3 Q9 m
4 v! O6 o( V/ d$ D8 F* m" L
   LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述- |' ^! O7 ^4 q2 ~# M
   void ClearCandidateList( void );                   //清除输入法文字候选列表
) y. k, C, x3 t2 L9 M. |( K. r    BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表, i" Z! {" g3 t( Y9 m
   BOOL ImeIsOpen( void );                            //输入法是否打开+ \3 D, W, P; f& l# Q; K3 Z6 t, }
   void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息
- a  z: H8 d  Z9 O& e8 _    void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
5 O9 {- j/ q/ W3 W/ e    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息$ R- j/ j( B3 ]2 _5 x. T
};& ?" x9 W; C: \3 E1 C' z- v

5 D- k7 {* v5 p7 |. b#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
0 S: F# ?  k' j
: A  V( t4 @0 }! S- I. g* Z  D0 y$ {5 h+ g& L% o9 W' i! s

, p% d# g" G% z$ d! G//*********************************************************************************************//5 X0 r) w. x. t# [1 U
/ A/ r( Q8 }. k; ~/ K
//////////////////////////////////////////////////////////////////////% @' ?4 ^8 m0 a9 G' D7 G2 ^9 p$ F
//
- X' y0 e4 a+ n/ j% X// IM.cpp: CIM class (使用系统)输入法类
+ O" v& c3 A  d// 2001/4/30 Write by Jerry Wang) ?6 ~9 ?' O8 A# f' ^( H# v& L, S
// 感谢大大鱼的帮助& f7 u0 j9 e$ d# R+ k
// Need Lib: imm32.lib
: I  E2 v0 s' i$ M//
7 o. s! [0 y' h! p2 Z//////////////////////////////////////////////////////////////////////4 ]8 M) m+ i0 t: n  T: ~  w, m

2 o1 c0 L  r2 p* G# X5 N8 x& Q: v2 F#include "imm.h"+ t5 q& K6 w, B" f8 m5 ~

+ p! Y. C" q+ K' G, V8 J- `//////////////////////////////////////////////////////////////////////
0 v8 `* F. y7 J5 J' ^// Construction/Destruction5 w; P) k: r2 X+ t/ \' N8 j4 s
//////////////////////////////////////////////////////////////////////
$ B) A( d6 q/ l5 w7 d: u9 X( P- F0 {$ J3 C
CIM::CIM()
' @8 V- \5 F& b( r4 }& b+ L  N{. p6 X3 A. d( _" ]+ o( Y
   m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];' N4 y( @3 q' d6 R$ F& U& d5 o" I
   ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
$ j. {& [5 u) J8 Z: ?- U5 g    *m_lpszImeInput = '\0';
3 n( f* Q+ F" U. f# w    *m_cInput = '\0';
+ o" e3 |! Z- y5 J: s9 A$ y9 z2 k8 I5 @- q$ k) a
   ttffont.Create( "黑体",15,RGB(255,255,255) );
, w* ~) e. J7 T; i' z    GetCurInputLanguageDesc();& x, Z/ ?, |" y
}
' P/ ?4 E& I! B3 r8 k7 h" F6 z
( Z4 Q4 A) C6 Z4 G9 \) Z6 F! KCIM::~CIM()5 D2 `% O! ~( m  S# x4 k& y! O/ x
{
' D4 I0 z' o5 M+ H    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );' T+ f+ ?: e' l: I

. A( Y0 }# w. u6 A    CHKB( delete m_lpszImeInput ); 8 o( M. h; {5 g: y3 C
   if( m_lpszCurInputLanguageDesc != NULL )6 O- H5 g; n: X8 b/ s& U9 y; q: E# y
       CHKB( delete m_lpszCurInputLanguageDesc ); ' e- o6 t5 l$ J3 c! C7 n; L& b
}; N. ~  s( [4 k) u4 t  J  w: [

4 p% X- q5 w+ v) W* j1 s0 ovoid CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
7 w* Y0 i$ D& g/ y! }( Y9 G9 ?{* K9 |( I( O& A6 c5 Z
   if (lParam & GCS_RESULTSTR)3 r6 ~+ m! @9 O8 T4 C+ Z0 ?* I2 o! ?% `  d
   {
! q2 k" {% ~2 k+ A  a( u) u( u" _5 J1 F        HIMC hIMC; //输入设备上下文
* H3 E' w* w( {9 A! h) w( i        DWORD dwLen;. Q1 s' M4 p# ?. B6 H
       LPSTR lpResultStr;
4 h) S! [, I7 i5 A' ^* O$ L/ F! m( A
1 x' u% r, n( R& B# D        hIMC = ImmGetContext(hWnd); //取得输入上下文: R" }" ?% T" h# c1 Y8 O

* b' v' k3 ]- Y, C$ d: a        if (!hIMC)
7 t( a( g3 o" E2 Z) M7 g            return;
* w0 Y5 _* Z+ V* U& G& h/ |7 V) W5 f# i3 L; g- j: K3 {
       dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
9 e6 s$ w1 ^1 [        dwLen+=1;
" a: [) y) C; v% \; D
5 P0 m+ B6 ^; d8 X3 M0 W' B        if(dwLen)' @0 b) ], a/ k8 h9 B
       {
  b8 S) k. Z) }5 V2 q, i$ O            lpResultStr = new char[ dwLen ];
+ X: f) R5 l# X1 V' t1 K4 U0 _, @, Q, |3 s2 o1 ~/ Y# {
           //// 缓冲区已经满了1 t( A" f' M0 V/ \  V
           if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )
5 q6 E/ u6 q. Y* \            {# K$ I7 U& l7 S  B6 x5 b- n
               MessageBeep( 0 );
8 m& |0 d4 A  ]! X2 S9 U" D& f                return;) r( D% q3 }+ S. U
           }- h/ |# S" D$ [2 |
           ZeroMemory( lpResultStr ,dwLen );
* }4 N- M! Q$ X, _            if (lpResultStr)
& \. J+ ^# }. [1 K- z' I. X4 d            {" `5 b% W, f. e
               ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);
  |* n6 h  _' g% _, q( L; Z" Z                strcat( m_lpszImeInput,lpResultStr );
0 i9 H# w8 J, l            }
. w  ]( z9 i9 f- Y2 W: g0 u0 q            delete lpResultStr;
! h( W3 R5 O: s        }
( X# S8 w9 J7 M# U$ s$ C* O9 s7 H8 }+ O
       ImmReleaseContext(hWnd,hIMC); //释放输入上下文- l$ |% s" ?. i
   }
; ], A4 @# f1 _8 n1 O# ?) K& D: w5 ]/ K& T
}
/ L6 Z2 d6 J) K" r5 g2 I' Y
: d; o4 l( ?2 Cvoid CIM::OnImeNotify(HWND hWnd, WPARAM wParam)5 Y* d5 k2 j; {, \. y1 g/ Y
{  q) L0 y9 h* y- Z, x. Q
   DWORD dwCommand = (DWORD) wParam;( D8 l/ h  U# ~, s
   switch( dwCommand )
9 T0 D! S/ \* n9 Z$ e7 M1 u- o    {9 Q3 ]3 F$ j/ s' C! _8 o
   case IMN_CHANGECANDIDATE:/ a, ~5 M! R$ @3 [9 B5 ?0 r
       GetCandidateList( hWnd );
& m; l8 v) l! o) L2 _0 g+ d        break;
" X6 d; V3 {. a& L  h) u$ T' U: t$ ~' ]* A* `; G  J
   case IMN_CLOSECANDIDATE:) P& R) a7 {9 w1 e" a" L! _
       ClearCandidateList();% M1 x9 W9 C$ U3 s2 j+ x8 r$ @2 m
       break;. p" J% {3 Q! W2 L5 D) m+ @

! X. M1 c, |* H    case IMN_OPENCANDIDATE:# f% e! n$ s" L, N1 R4 J
       GetCandidateList( hWnd );
; g5 `8 W9 ?% O, ?        break;2 m2 N7 W  G% S! [, r) Z% E
   }; t% h' G7 x/ r
}! p" b5 A% o, G# m5 ]' Z4 p

% n: A, }. x0 U6 o/ I2 Kvoid CIM::OnChar( TCHAR ch ). f/ ]. Y! I& W# x- C
{
/ t5 ^  H$ A4 m    int len = strlen( m_lpszImeInput );
  K; p% W! f1 b# Q  {8 S
1 u: d5 a' i) `+ F8 S4 a    if( ImeIsOpen() ) //输入法打开状态
; A, A# h# N2 J; o) J* V) p    {
. J, s! G( F' x& i% F+ ~
0 Y# C8 \. e: H1 r- u& M/ }    }3 @# o9 }/ q5 G
   else //输入法关闭状态9 u7 h+ A2 C) E  ]  E% }( o/ _! n
   {# U3 b, z" |4 M$ t
       if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母
9 s5 F2 Y7 ?7 x( K# k7 V, j        {/ `, B: X0 C* o+ R, U0 ~
           *( m_lpszImeInput + len ) = ch;* E' o' H! O5 y; {
           *( m_lpszImeInput + len + 1) = '\0';+ p2 E; a% M+ W0 q6 Z6 g& ^
       }$ o: C; l0 k0 T" x$ @# Y
   }! M: b8 y5 @) c6 E4 R
% s' l" z3 V6 f, y
   if( ch == 8 ) //BackSpace字符- g8 O4 ?. \  C) ]% m$ |
   {
- {" v6 X+ U' D        if( len == 0 ) //字符串长度为零
' `4 v" G5 A& g$ U            return;
3 }' Q: U% m9 w8 I& s1 ]
% W* c9 A8 s8 Y! O3 z        if( len == 1 ) //只有一个字符
0 G, D( H( n# J8 G* R        {4 S  q! I, o# j) l: t$ y3 D
           *m_lpszImeInput = '\0';5 i2 @$ x+ X6 h& e/ ^
           return;; g. K; V- R( k9 r+ Q  Y
       }
5 }) f* i- f$ {9 U, ~% M
* I( R# [5 I; _  v- o3 x0 ^4 }        BYTE cc1,cc2;
( \! `0 k) ?# ?1 Q) h4 e        cc1 = *(m_lpszImeInput + len -1); //分离字节* k8 `4 T/ d+ M9 s% l
       cc2 = *(m_lpszImeInput + len -2);) G' C5 w( h- G1 X% S. r

6 i; `& S& I0 y6 d+ H. _" q; g        if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
, F- M8 s, z; T" K            *( m_lpszImeInput + len -2 ) = '\0';7 x6 |; Q  I0 m, v9 e
       else //是英文字符(单字节)( }/ Q1 V' B1 _6 D: O/ W; i; l
           *( m_lpszImeInput + len -1 ) = '\0';* s# g& z  k# M6 E" k5 Y6 m
   }2 `8 V! T- u) M( B4 B7 o- C
}
1 B" S$ T8 m# G* A( F( L( C+ Y8 u9 P1 h* i
BOOL CIM::GetCandidateList(HWND hWnd)/ H- T6 d1 S" U
{
% G' h7 U7 H  h8 U    DWORD dwSize; 9 F# H# z9 n8 ^) i) f4 d! v
   HIMC hIMC;# P7 R- ]8 ^' R# W- c

5 c1 |8 P. F% U' Z- H5 X7 S' B    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
/ i4 R3 h& y2 E4 f: N* ~% u- ?6 i' E5 \" R
   if( m_lpCandList )
& U8 C3 I& L0 C+ K5 K& d/ u. g1 E( Q    {5 a0 U3 r& c' Q7 b
       delete m_lpCandList;
$ Y1 j+ y8 a1 N4 ^% L        m_lpCandList = NULL;! k6 A  [; X- P/ x- S
   }1 E2 G: M+ l2 c8 S' p6 @! W

9 F+ l0 A- I. c7 t8 b3 c    if( GetKeyboardLayout(0)==0 )
, E  c* i1 P' O8 f    {
& A9 u4 u0 ]9 [        return FALSE;
2 v9 T. q! l& p9 i3 u4 p    }
( E) e, D( M: s% ~; ~- E: a, c/ v7 x7 C' J  j
   hIMC = ImmGetContext(hWnd); //取得输入上下文- [# {4 U7 N2 g6 u( |3 p4 T- c& W' }
   if(hIMC == NULL)3 p- m. Y5 Q( j6 |
   {9 l  r. m9 g+ Q
       return FALSE;! W$ e+ A, R" o& Q7 W
   }
  P5 t4 F4 a" L' C4 i$ T" ]+ i2 q& b7 ]/ }% D) k
   ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
) D0 o# M* A+ `    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0)) 6 e) f/ J( F4 o7 D/ Q
   {
2 R9 q( V" ?, u+ x        m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
$ |( I2 {# L7 |        if(m_lpCandList)
) |1 c9 i. D' P+ m        {
) c2 {( h. F  J7 v            ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);
2 M/ R( P* K) e$ S            CandidateToString(m_lpCandList);& B$ O5 y, D- @6 i1 ^! z
       }9 s' l" D6 v. n# ]6 c6 l$ d* E8 _" Y, A
   } 4 j4 p8 a" M! A

' ~+ w; c+ d0 X+ b+ e" Q1 g) d    ImmReleaseContext(hWnd,hIMC);5 N7 [% M8 c0 v0 k$ B. _

+ y( U" u3 m! y% H. b    return TRUE;
( @, z; F% R' a. o8 p" \1 D/ X$ Q}/ f/ v# A* p5 \5 a9 ]; m
' u6 Z3 ~( H; h$ T& p' i
void CIM::ClearCandidateList()8 U) b0 T6 B. z
{
. D4 F& r9 f( c1 n    if(m_lpCandList)
" ]1 R7 g. w- Q3 K1 ~5 ?    {) E" C! q, C. d# U; Z
       delete m_lpCandList;
& p# }( A+ {5 ^" L- R& d7 w        m_lpCandList = NULL;0 f3 w4 E; u2 X# N& T' D
   }
# A+ U7 h2 O8 a  P; V# K$ x    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );
' X6 b, X" M) P9 x3 _- g8 m}
/ h7 `: D) E0 q% @! M8 ~$ U! z# O2 y' g8 o! ^5 I3 V# N. K
0 L0 w( c# u( }& z
LPSTR CIM::GetCurInputLanguageDesc()
- q  I) \. C* P: a0 W2 r{
; o8 n) q: y5 n7 g7 b    HKL hKL = GetKeyboardLayout(0);
& b- F& e) P6 s+ d# `' Q2 q5 M. i# [) F* l4 ^
   if( m_lpszCurInputLanguageDesc != NULL )6 G) o1 m1 G; w; |  i
       CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^* s4 }( M5 V. E. i3 d1 n. @. v

/ `3 {! Y/ N# H+ R: h* y. K    int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度/ M. r) ?* D" `# R# e
' B8 S5 H1 x# u
   CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );6 O2 z$ x) [' v4 b& v

" r& Q% t6 c& ?# @( `: q' _    if( lengh )( G- L  s: @# }# D% n
   {$ P% b! `0 Z! m+ _
       ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);9 M. H5 g4 w" b" c# Y8 N2 j# r5 K
   }  g( }# `% R2 m9 k
   else) |; J1 J) Q* ?" z" M
   {
; f4 D: B- t2 a3 z4 W9 h! \3 O5 ?, T2 ?        strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );0 c4 J, t7 q$ X, n( A# Y3 W
   }) K+ P& w2 g- v/ |7 e" |- V
9 v8 P: r3 S5 x9 a5 l7 }
   return m_lpszCurInputLanguageDesc;
8 x9 y1 ^- a/ n% N# ]}
4 z. F0 e# z3 r" v* Q% a
1 L+ c6 Q' U! _: {( fvoid CIM::UpdateShow()9 ~4 v  _& A5 I& N! F4 h  a' i
{
% J( C! @& [( Y6 K$ L  D    POINT pt;9 f, l. o# _3 F: E
   pt.y = 450;
' W* x0 P1 H9 A$ E/ Y+ P    pt.x = 400;
+ X4 ]( h. v. g! Y: f% \" f    ttffont.SetSurface( DD_GetBackScreen() );
$ x. t  p- i+ p6 e    ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述+ N9 R0 u5 O7 B3 o- {

. |4 M; ]- p: n- e" z- V8 t    pt.y = 420;
, ?* i8 V5 v8 F    pt.x = 20;
# F; c2 J+ ~3 a" m    ttffont.ShowText( m_cCandidateList,&pt );  O* w6 U/ I% `. r- D4 @. ]
3 e" i' \! C# q! L4 \: T; V! G# L
   pt.y = 450;
; S  G- K) d' M. W  ^" l    pt.x = 20;
. c7 A4 I" x2 _, q- R    if( *m_lpszImeInput == '\0' )5 E8 p8 Y. w3 K9 I# L+ q7 S
       return;# z; b  N3 g% s5 `& ~  i* a

: Z% C! w+ R! [    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字
$ \9 L, ~, v* L* W& H) i- M2 R+ O}* n1 I- y' ?8 _, Y  r
" k. H, f8 ?; F  a" Z6 j
LPSTR CIM::GetResultString()6 y6 x1 f& I9 c8 y( M
{
1 G. ]: F4 S: I  a0 k2 q/ y    return m_lpszImeInput;7 \' w9 o  e% a5 A% b- G
}) s) p( u' J' _+ K

0 A( ?: ^- @2 ?( OBOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)) M6 v+ j; f6 f+ A. z" u/ e# d" N
{8 m# \# J3 E  U% x7 O/ F8 x' r
   if( !m_lpCandList )+ e! i* X. W2 w/ A  f% [# l
       return FALSE;
. Z5 M3 l6 @% N. d* i3 ^/ G9 H, G' T) Z! j5 z! p8 \
   if( m_lpCandList->dwCount>0 )6 t0 W9 d0 O! \7 E! M& `4 b  D
   {
( J5 y- v- q4 c) g9 T/ v& }        LPDWORD lpdwOffset;
) b2 N* s$ Z/ A# C( }- u( D: n. l3 z
+ n6 F. B& S( `        lpdwOffset = &m_lpCandList->dwOffset[0];7 x5 X: ~0 |3 U" D' H3 J
/ c( l+ E/ c+ d& L( N& H5 f" ^
       lpdwOffset += m_lpCandList->dwPageStart;4 {( U  C% y. `5 y

2 t) A! f" a4 L& h  A        ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );4 ?8 E. L/ F1 F) H" ~  t' M; z
6 c! I; j8 c! r& R, t
       DWORD z=1;7 U. r  V  d( K- H& B
       for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++)
5 G  R2 I5 t9 k  b' X        { 2 O4 s3 t4 s' q2 |
           LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;! B) ^8 b7 k; b; ~. a% G4 k
           char buf[255];
3 D/ m. g6 m; s. M1 z            sprintf( buf,"%d.%s",z,lpstr );
% }, t: O# q* H. e- ^  v            strcat( m_cCandidateList,buf );
5 b# _. _0 `7 N. P8 B2 M/ j" p0 ~            z++;: i7 E+ s" ?0 f9 h. t' j" {( u
       }3 |/ o1 z& k5 N9 _+ T/ t
  F( T* G$ j$ A5 |5 `7 j; Q
       return TRUE;
& S! r5 k. d1 L0 S/ v+ v, c    }
5 d7 V8 s- T$ D; o7 I2 f7 _9 w
: |  N5 E5 ~5 J6 }5 L4 A/ H    return FALSE;
# }/ ^) R$ @/ a- K}  t0 s: J+ G, k$ q
) v$ W5 ]$ R, X/ C# N
BOOL CIM::ImeIsOpen()
0 f/ U, x  a2 u  h{
# v, a$ R4 r- r3 O3 h! L    return ImmIsIME( GetKeyboardLayout(0) );* L  ~: s5 `  ~8 d
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-15 05:04 , Processed in 0.017176 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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