IME 입력 프로 그래 밍: 제3 장 ime 파일 에서 사용 해 야 할 구조

앞의 2 장 에서 우 리 는 ime 와 imm 함 수 를 이 야 기 했 는데 이들 은 다음 과 같은 구조 로 통신 되 었 다.
1、IMEINFO
struct tagIMEInfo { //           ImeInquire   
DWORD dwPrivateDataSize;//             
DWORD fdwProperty; //             
//               :
//=IME_PROP_AT_CARET                  
//=IME_PROP_SPECIAL_UI             
//=IME_PROP_CANDLIST_START_FROM_1                   1
//=IME_PROP_UNICODE   UNICODE  
//               :
//=IME_PROP_END_UNLOAD
//=IME_PROP_KBD_CHAR_FIRST          
//=IME_PORP_NEED_ALTKEY  ALT       IME    
//=IME_PROP_IGNORE_UPKEYS              
//=IME_PROP_COMPLETE_ON_UNSELECT        ,       
//    W98 2000  
DWORD fdwConversionCaps;//            ,    、  、        
//=IME_CMODE_NATIVE       
//=IME_CMODE_FULLSHAPE       
//=IME_CMODE_CHARCODE        
//=IME_CMODE_SOFTKBD //       
//=IME_CMODE_NOCONVERSION //       
//=IME_CMODE_EUDC //
//=IME_CMODE_SYMBOL //        
DWORD fdwSentenceCaps; //
//=IME_SMODE_PLAURALCLAUSE
//=IME_SMODE_SINGLECONVERT
//=IME_SMODE_AUTOMETIC
//=IME_SMODE_CONVERSATION
DWORD fdwUICaps; //       :      
//=UI_CAP_2700
//=UI_CAP_ROT90
//=UI_CAP_ROTANY
//=UI_CAP_SOFKBD
DWORD fdwSCSCaps; //           
//=SCS_CAP_COMPSTR
//=SCS_CAP_MAKEREAD
DWORD fdwSelectCaps; //                   
//=SELECT_CAP_CONVMODE
//=SELECT_CAP_SENTENCE
} IIMEINFO;
2、COMPOSITIONSTR       
typedef struct tagCOMPOSITIONSTR { //           :               
DWORD dwSize; //             =     +  +  +  +  +  +  +  
DWORD dwCompReadAttrLen; //         
DWORD dwCompReadAttrOffset; //        
DWORD dwCompReadClsLen; //       
DWORD dwCompReadClsOffset; //        
DWORD dwCompReadStrLen; //       
DWORD dwCompReadStrOffset; //        
DWORD dwCompAttrLen; //      
DWORD dwCompAttrOffset; //        
DWORD dwCompClsLen; //      
DWORD dwCompClsOffset; //        
DWORD dwCompStrLen; //     
DWORD dwCompStrOffset; //        
DWORD dwCursorPos; //      
DWORD dwDeltaStart; //        
DWORD dwResultReadClsLen; //        
DWORD dwResultReadClsOffset; //        
DWORD dwResultReadStrLen; //       
DWORD dwResultReadStrOffset; //        
DWORD dwResultClsLen; //      
DWORD dwResultClsOffset; //        
DWORD dwResultStrLen; //     
DWORD dwResultStrOffset; //        
DWORD dwPrivateSize; //         
DWORD dwPrivateOffset; //        
} COMPOSITIONSTR;
 
3、CANDIDATEINFO         
typedef struct tagCANDIDATEINFO { //         ,           
DWORD dwSize; //        
DWORD dwCount; //      
DWORD dwOffset[32]; //           
DWORD dwPrivateSize; //       
DWORD dwPrivateOffset; //     
} CANDIDATEINFO;
4、GUIDELINE
typedef struct tagGUIDELINE {
DWORD dwSize;
DWORD dwLevel; // the error level.
// GL_LEVEL_NOGUIDELINE,
// GL_LEVEL_FATAL,
// GL_LEVEL_ERROR,
// GL_LEVEL_WARNNING,
// GL_LEVEL_INFORMATION
DWORD dwIndex; // GL_ID_NODICTIONARY and so on.
DWORD dwStrLen; // Error Strings, if this is 0, there
// is no error string.
DWORD dwStrOffset;
DWORD dwPrivateSize;
DWORD dwPrivateOffset;
} GUIDELINE;
5、CANDIDATELIST
The CANDIDATELIST structure contains information about a candidate list.
typedef struct tagCANDIDATELIST { //         =〉            
DWORD dwSize; //           :=sizeof(CANDIDATELIST)+      
DWORD dwStyle; //         
//=IME_CAND_UNKNOWN           
//=IME_CAND_READ             ,         
//=IME_CAND_CODE   dwCount=1,dwOffset    ,      ,
// >1 dwOffset     
//=IME_CAND_MEANING
//=IME_CAND_RADICAL
//=IME_CAND_STROKES
DWORD dwCount; //       
DWORD dwSelection; //          
DWORD dwPageStart; //                  (      )
DWORD dwPageSize; //          
DWORD dwOffset[]; //          :[ ];[ ]。。。。
} CANDIDATELIST;
6、COMPOSITIONFORM
typedef tagCOMPOSITIONFORM { //    、    :
// IMC_SETCOMPOSITIONWINDOW IMC_SETCANDIDATEPOS    
DWORD dwStyle; //      
//=CFS_DEFAULT              
//=CFS_FORCE_POSITION //           ,  IME  
//=CFS_POINT //           , IME  
//=CFS_RECT //          
POINT ptCurrentPos; //    
RECT rcArea; //      
}COMPOSITIONFORM;
7、CANDIDATEFORM
The CANDIDATEFORM structure is used for IMC_GETCANDIDATEPOS and
IMC_SETCANDIDATEPOS messages.
typedef tagCANDIDATEFORM { //      
// IMC_GETCANDIDATEPOS IMC_SETCANDIDATEPOS    
DWORD dwIndex; //      
DWORD dwStyle; //  :
//=CFS_CANDIDATEPOS       
//=CFS_EXCLUDE     
//=CFS_DEFAULT       
POINT ptCurrentPos; //    
REC rcArea; //     
} CANDIDATEFORM;
8、STYLEBUF
typedef struct tagSTYLEBUF { //     
DWORD dwStyle;
TCHAR szDes cription[32]
} STYLEBUF;
9、SOFTKBDDATA
typedef struct tagSOFTKBDDATA { //           
UINT uCount; //      (   1,2,   SHIFT   2, :   SHIFT,    SHIFT)
WORD wCode[][256] //       
} SOFTKBDDATA;
10、RECONVERTSTRING
typedef struct _tagRECONVERTSTRING { //  W98 2000
DWOPD dwSize;
DWORD dwVersion;
DWORD dwStrLen;
DWORD dwStrOffset;
DWORD dwCompStrLen;
DWORD dwCompStrOffset;
DWORD dwTargetStrLen;
DWORD dwTargetStrOffset;
} RECONVERTSTRING;
11、IMEMENUITEMINFO
typedef _tagIMEMENUITEMINFO { //       ,W98/2000
UINT cbSize;
UINT fType;
UINT fState;
UINT wID;
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
DWORD dwItemData;
TCHAR szString[48];
HBITMAP hbmpItem;
}
12、INPUTCONTEXT
The INPUTCONTEXT structure is an internal data structure that stores Input
Context data.
typedef struct tagINPUTCONTEXT { //IMC      
HWND hWnd; //   IMC   
BOOL fOpen; //IME        
POINT ptStatusWndPos; //       
POINT ptSoftKbdPos; //      
DWORD fdwConversion; //IME  (  、   ,   )
DWORD fdwSentence; //    
union {
LOGFONTA A;
LOGFONTW W;
} lfFont; //  
COMPOSITIONFORM cfCompForm; //      
CANDIDATEFORM cfCandForm[4]; //      
HIMCC hCompStr; //
HIMCC hCandInfo;
HIMCC hGuideLine
HIMCC hPrivate;
DWORD dwNumMsgBuf; //   hMsgBuf     
HIMCC hMsgBuf; //     ,  : [  1] [wParam1] [lParam1] {[  ] [wParam2] [lParam2]...
//  :             
DWORD fdwInit //                 
//=INIT_STATUSWNDPOS    ptStatusWndPos
//=INIT_CONVERSION    fdwConversion
//=INIT_SENTENCE    fdwSentence
//=INIT_LOGFONT    lfFont
//=INIT_COMPFORM    cfCompForm
//=INIT_SOFTKBDPOS    ptSoftKbdPos
DWORD dwReserve[3]; //         
} INPUTCONTEXT;

UI 창 에서 다음 windows 메 시 지 를 처리 해 야 합 니 다.
1、WM_IME_SETCONTEXT
활성화 또는 휴면 입력 법
LRESULT CALLBACK UIWndProc(HWND hUIWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{

case WM_IME_SETCONTEXT:
fSet= (BOOL) wParam;
lISCBits = lParam;
}
fSet 이 TRUE 이면 시스템 은 현재 입력 법의 한 창 (상태 창, 목록 창 등) 을 활성화 하고 FALSE 일 때 현재 입력 법 을 휴면 합 니 다.
그 중에서 lISCBits 에서 어떤 창 을 작 동 하 는 지 알려 줍 니 다.
수치 적 의미
ISC SHOWUICOMPOSITIOnWINDOW 디 스 플레이 인 코딩 창
ISC SHOWUIGUIDWINDOW 정보 창 표시
ISC SHOWUICANDIDATEWINDOW 0 번 목록 창 표시
(ISC SHOWUICANDIDATEWINDOW < < 1) 1 번 목록 창 을 표시 합 니 다.
(ISC SHOWUICANDIDATEWINDOW < < < 2) 2 번 목록 창 을 표시 합 니 다.
(ISC SHOWUICANDIDATEWINDOW < < < 3) 3 번 목록 창 을 표시 합 니 다.
2、WM_IME_CONTROL
현재 입력 관리
wSubMessage = wParam; WM IME CONTROL 에 의 해 제 어 된 메시지
lpData = (LPVOID) lParam; 대응 하 는 데이터
그 중성자 소식 은 다음 과 같은 소식 이 있다.
1)IMC_GETCANDIDATEPOS
목록 창의 위 치 를 가 져 옵 니 다. 이 때 lParam 은 CANDIDATEFORM 구조 주 소 를 전송 합 니 다.
만약 이 소식 이 0 으로 성공 적 으로 돌아간다 면, 그렇지 않 으 면 0 이 아니다.
보통 이 부분 을 설계 하면 0 으로 돌아 갑 니 다. 그렇지 않 으 면 1 로 돌아 갑 니 다.
2)IMC_GETCOMPOSITONFONT
인 코딩 창 글꼴 구 조 를 가 져 옵 니 다. lParam 은 LOGFONT 구조 주소 입 니 다.
만약 이 소식 이 0 으로 성공 적 으로 돌아간다 면, 그렇지 않 으 면 0 이 아니다.
보통 이 부분 을 설계 하면 0 으로 돌아 갑 니 다. 그렇지 않 으 면 1 로 돌아 갑 니 다.
3)IMC_GETCOMPOSITONWINDOW
인 코딩 창 위 치 를 가 져 옵 니 다. lParam 은 COMPOSTIONFORM 구조 주소 입 니 다.
 
만약 이 소식 이 0 으로 성공 적 으로 돌아간다 면, 그렇지 않 으 면 0 이 아니다.
보통 이 부분 을 설계 하면 0 으로 돌아 갑 니 다. 그렇지 않 으 면 1 로 돌아 갑 니 다.
4)IMC_GETSOFTKBDFONT
소프트 키보드 글꼴 을 가 져 옵 니 다. lParam 글꼴 구조의 LOGFONT 주소 입 니 다.
5)IMC_GETSOFTKBDPOS
소프트 키보드 위치 가 져 오기, lParam = 0;
화면 창 에 있 는 소프트 키보드 의 좌표 구조 POINTS 를 되 돌려 줍 니 다.
6)IMC_GETSOFTKBDSUBTYPE
wSubMessage= IMC_GETSOFTKBDSUBTYPE;
lParam = 0;
7)IMC_GETSTATUSWINDOWPOS
상태 창 위치 가 져 오기
wSubMessage= IMC_GETSTATUSWINDOWPOS;
lParam = 0;
상태 창 좌표 원점 이 화면 창 에 있 는 좌표 구조 POINTS 를 되 돌려 줍 니 다.
8)IMC_SETCANDIDATEPOS
wSubMessage= IMC_SETCANDIDATEPOS;
lpCANDIDATEFORM= (LPCANDIDATEFORM) lParam;
목록 창의 위 치 를 설정 합 니 다. 이 때 lParam 은 CANDIDATEFORM 구조 주 소 를 전송 합 니 다.
만약 이 소식 이 0 으로 성공 적 으로 돌아간다 면, 그렇지 않 으 면 0 이 아니다.
메모: UI 창 에서 이 메 시 지 를 받 아들 이지 않 습 니 다. 관리 함 수 는 NotifyIME 입 니 다.
9)IMC_SETCOMPOSITONFONT
인 코딩 창의 글꼴 을 설정 합 니 다. 이때 lParam 은 LOGFONT 구조 주 소 를 전송 합 니 다.
wSubMessage= IMC_SETCOMPOSITIONFONT;
lpLogFont= (LPLOGFONT) lParam;
메모: UI 창 에서 이 메 시 지 를 받 아들 이지 않 습 니 다. 관리 함 수 는 NotifyIME 입 니 다.
10)IMC_SETCOMPOSITONWINDOW
인 코딩 창 속성 을 설정 합 니 다. 이때 lParam 은 COMPOSTIONFORM 구조 주 소 를 전송 합 니 다.
wSubMessage= IMC_SETCOMPOSITIONWINDOW;
lpCOMPOSITIONFORM= (LPCOMPOSITIONFORM) lParam;
만약 이 소식 이 0 으로 성공 적 으로 돌아간다 면, 그렇지 않 으 면 0 이 아니다.
메모: UI 창 에서 이 메 시 지 를 받 아들 이지 않 습 니 다. 관리 함 수 는 NotifyIME 입 니 다.
11)IMC_SETSOFTKBDDATA
소프트 키보드 데 이 터 를 설정 합 니 다. 이때 lParam 은 SOFTKBDATA 구조 주 소 를 전송 하고 사용 자 는 자신의 소프트 키보드 문 자 를 설정 합 니 다.
wSubMessage= IMC_SETSOFTKBDDATA;
lpSoftKbdData= (LPSOFTKBDDATA) lParam;
만약 이 소식 이 0 으로 성공 적 으로 돌아간다 면, 그렇지 않 으 면 0 이 아니다.
메모: UI 창 에서 이 메 시 지 를 받 아들 이지 않 습 니 다. 관리 함 수 는 NotifyIME 입 니 다.
12)IMC_SETSOFTKBDSUBTYPE
소프트 키보드 형식 설정
wSubMessage= IMC_SETSOFTKBDSUBTYPE;
lSubType= lParam;
subtype 을 성공 적 으로 되 돌려 줍 니 다. 그렇지 않 으 면 되 돌려 줍 니 다. - 1.
메모: UI 창 에서 이 메 시 지 를 받 아들 이지 않 습 니 다. 관리 함 수 는 NotifyIME 입 니 다.
13)IMC_SETSOFTKBDFONT
소프트 키보드 글꼴 을 설정 합 니 다. 이때 lParam 은 LOGFONT 구조 주 소 를 전송 합 니 다.
wSubMessage= IMC_SETSOFTKBDFONT;
lpLogFont= (LPLOGFONT)lParam;
만약 이 소식 이 0 으로 성공 적 으로 돌아간다 면, 그렇지 않 으 면 0 이 아니다.
메모: UI 창 에서 이 메 시 지 를 받 아들 이지 않 습 니 다. 관리 함 수 는 NotifyIME 입 니 다.
14)IMC_SETSOFTKBDPOS
소프트웨어 위 치 를 설정 합 니 다. 이때 lParam 은 POINTS 구 조 를 전송 합 니 다.
wSubMessage= IMC_SETSOFTKBDPOS;
ptsPt= (POINTS)lParam;
만약 이 소식 이 0 으로 성공 적 으로 돌아간다 면, 그렇지 않 으 면 0 이 아니다.
15)IMC_SETSTATUSWINDOWPOS
상태 창 위 치 를 설정 합 니 다. 이때 lParam 은 POINTS 구 조 를 전송 합 니 다.
wSubMessage= IMC_SETSTATUSWINDOWPOS;
ptsPt= (POINTS)lParam;
만약 이 소식 이 0 으로 성공 적 으로 돌아간다 면, 그렇지 않 으 면 0 이 아니다.
3、WM_IME_COMPOSITION
사용자 가 인 코딩 상 태 를 바 꾸 었 을 때 이 메 시 지 를 보 냅 니 다 WM IME COMPOSITION
응용 프로그램 은 ImgGetCompositionString 을 호출 하여 새로운 인 코딩 상 태 를 가 져 올 수 있 습 니 다.
wChar = wParam; 마지막 으로 인 코딩 창 에 입력 한 2 바이트 의 DBCS 문자
lAttribute = lParam; 현재 인 코딩 의 의미.
lAttribute 는 다음 과 같은 조합 을 취 할 수 있 습 니 다.
값 의 의미
GCR ERRORSTR 수정 오류
GCR INFORMATIONSTR 수정 정보 문자열
GCS COMPATTR 인 코딩 문자열 속성 을 수정 합 니 다.
GCS COMPCLAUSE 인 코딩 정보 수정.
GCS COMPREADATTR 읽 기 문자열 의 속성 수정
GCS COMPREADCLAUSE 읽 기 문자열 의 속성 을 수정 합 니 다.
GCS COMPREADSTR 수정 읽 기 문자열 입 니 다.
GCS COMPSTR 현재 인 코딩 수정
GCS CURSORPOS 는 현재 인 코딩 된 커서 위 치 를 수정 합 니 다.
GCS DELTASTART 현재 인 코딩 의 시작 위 치 를 수정 합 니 다.
GCS RESULTCLAUSE 수정 결과 문자열 의 정보.
GCS RESULTREADCLAUSE 에서 읽 기 문자열 의 정 보 를 수정 합 니 다.
GCS RESULTREADSTR 수정 읽 기 문자열.
GCS RESULTSTR 인 코딩 결과 문자열 수정.
CS INSERTCHAR 현재 위치 에 문자 삽입
CS NOMOVECARET 교체 결과 문자열
4、WM_IME_COMPOSITIONFULL
사용자 인터페이스 창 이 인 코딩 창의 사 이 즈 를 늘 릴 수 없 을 때 ime 사용자 인터페이스 창 은 WM IME COMPOSITIOnfULL 메 시 지 를 보 냅 니 다. 처리 하지 않 을 수 있 습 니 다.
wParam = 0
lParam= 0
5、WM_IME_ENDCOMPOSITION
인 코딩 이 끝 났 을 때 ime 에서 이 메 시 지 를 보 냅 니 다 WM IME ENDCOMPOSITION
wParam = 0
lParam= 0
사용자 프로그램 은 사용자 가 입력 한 인 코딩 을 표시 할 수 있 도록 이 메 시 지 를 받 아들 일 수 있 습 니 다.
6、WM_IME_SELECT
시스템 은 새로운 ime 를 선택 할 수 있 도록 WM IME SELECT 를 보 냅 니 다.
fSelect = (BOOL) wParam; TRUE 는 새로운 IME 가 선택 되 었 음 을 표시 하고, FALSE 는 이 입력 법 을 선택 하거나 닫 지 않 음 을 표시 합 니 다.
hKL= lParam;
시스템 은 이 메 시 지 를 이용 하여 오래된 입력 법 사용자 창 을 만 들 거나 닫 습 니 다.
7、WM_IME_STARTCOMPOSITION
사용자 가 인 코딩 을 입력 하기 시 작 했 을 때 시스템 은 즉시 이 메 시 지 를 IME 로 보 내 고 IME 는 인 코딩 창 을 엽 니 다.
wParam = 0
lParam= 0
8、WM_IME_NOTIFY
IME 메시지 그룹:
wSubMessage= wParam;
lParam= lParam;
각 소식 설명:
1)IMN_CLOSESTATUSWINDOW
상태 창 을 닫 을 때 시스템 은 IMN CLOSESTATUSWINDOW 메 시 지 를 보 냅 니 다.
wSubMessage = IMN_CLOSESTATUSWINDOW;
lParam= 0;
사용자 인터페이스 창 이 이 메 시 지 를 받 을 때 상태 창 을 닫 습 니 다.
2)IMN_OPENSTATUSWINDOW
상태 창 생 성 또는 열기
wSubMessage = IMN_OPENSTATUSWINDOW;
lParam= 0;
ime 가 이 메 시 지 를 받 을 때 상태 창 이 생 깁 니 다.
상태 직렬 포트 에 대한 정 보 는 ImmGetConversionStatus 로 얻 을 수 있 으 며, 상태 창 을 설정 한 정 보 는 ImmSetConversionStatus 로 얻 을 수 있 습 니 다.
3)IMN_OPENCANDIDATE
목록 선택 창 열기 또는 생 성
wSubMessage = IMN_OPENCANDIDATE;
lCandidateList= lParam;
4)IMN_CHANGECANDIDATE
현재 목록 선택 창 업데이트
WM_IME_NOTIFY
wSubMessage = IMN_CHANGECANDIDATE;
lCandidateList= lParam;
5)IMN_CLOSECANDIDATE
선택 창 닫 기
wSubMessage = IMN_CLOSECANDIDATE;
lCandidateList= lParam;
UI 창 에서 이 메 시 지 를 받 으 면 목록 을 지우 고 창 을 선택 합 니 다.
IMN_SETCONVERSIONMODE
입력 법 상태 변경 모드 관리
wSubMessage = IMN_SETCONVERSIONMODE;
lParam= 0;
IMN_SETOPENSTATUS
입력 상태 설정
wSubMessage = IMN_SETOPENSTATUS;
lParam= 0;
IMN_SETCANDIDATEPOS
목록 창 위치 설정
wSubMessage = IMN_SETCANDIDATEPOS;
lCandidateList= lParam;
 
Parameters
IMN_SETCOMPOSITIONFONT
인 코딩 창 글꼴 설정
wSubMessage = IMN_SETCOMPOSITIONFONT;
lParam= 0;
IMN_SETCOMPOSITIONWINDOW
인 코딩 창 설정
wSubMessage = IMN_SETCOMPOSITIONWINDOW;
lParam= 0;
IMN_GUIDELINE
오류 정보 처리
wSubMessage = IMN_GUIDELINE;
lParam= 0;
IMN_SOFTKBDDESTROYED
소프트 키보드 닫 기
wSubMessage = IMN_SOFTKBDDESTROYED;
lParam= 0;

좋은 웹페이지 즐겨찾기