1 | #include "stdafx.h" |
---|
2 | |
---|
3 | #include "common.h" |
---|
4 | |
---|
5 | extern HFONT hFont_TextEdit,hFont_HyperLink_TextEdit; |
---|
6 | extern int font_width,font_height; |
---|
7 | |
---|
8 | void TextEditEvent_IME_StartComposition(HWND hwnd){ |
---|
9 | int WndNum; |
---|
10 | WndNum=GetWndNum(GetParent(hwnd)); |
---|
11 | |
---|
12 | int iControlTabSpace; |
---|
13 | iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace; |
---|
14 | |
---|
15 | HIMC hIMC; |
---|
16 | hIMC=ImmGetContext(hwnd); |
---|
17 | |
---|
18 | //コンポジションをセット |
---|
19 | POINT pos; |
---|
20 | COMPOSITIONFORM CompForm; |
---|
21 | CompForm.dwStyle=CFS_POINT; |
---|
22 | pos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; |
---|
23 | GetScrollBaseCaretPos(MdiInfo[WndNum],(int *)&pos.x,(int *)&pos.y); |
---|
24 | CompForm.ptCurrentPos.x=pos.x*font_width+iControlTabSpace; |
---|
25 | CompForm.ptCurrentPos.y=pos.y*font_height; |
---|
26 | ImmSetCompositionWindow(hIMC, &CompForm); |
---|
27 | |
---|
28 | //フォントをセット |
---|
29 | ImmSetCompositionFont(hIMC,&pobj_nv->lf); |
---|
30 | |
---|
31 | ImmReleaseContext(hwnd,hIMC); |
---|
32 | } |
---|
33 | |
---|
34 | namespace |
---|
35 | { |
---|
36 | void SetNextCompositionWindowPos(HIMC himc, int WndNum){ |
---|
37 | int iControlTabSpace; |
---|
38 | iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace; |
---|
39 | COMPOSITIONFORM CompForm; |
---|
40 | CompForm.dwStyle=CFS_POINT; |
---|
41 | POINT pos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; |
---|
42 | GetScrollBaseCaretPos(MdiInfo[WndNum],(int *)&pos.x,(int *)&pos.y); |
---|
43 | CompForm.ptCurrentPos.x=pos.x*font_width+iControlTabSpace; |
---|
44 | CompForm.ptCurrentPos.y=pos.y*font_height; |
---|
45 | ImmSetCompositionWindow(himc, &CompForm); |
---|
46 | } |
---|
47 | } |
---|
48 | |
---|
49 | BOOL TextEditEvent_IME_Composition(HWND hwnd,LPARAM lParam){ |
---|
50 | if(lParam&GCS_RESULTSTR){ |
---|
51 | int WndNum; |
---|
52 | WndNum=GetWndNum(GetParent(hwnd)); |
---|
53 | |
---|
54 | //////////////////// |
---|
55 | // 確定文字列を取得 |
---|
56 | //////////////////// |
---|
57 | |
---|
58 | //コンテキストを取得 |
---|
59 | HIMC hIMC; |
---|
60 | hIMC=ImmGetContext(hwnd); |
---|
61 | |
---|
62 | int i; |
---|
63 | char temporary[4096]; |
---|
64 | i=ImmGetCompositionString(hIMC, GCS_RESULTSTR, temporary,4096); |
---|
65 | if(i==0) return 0; |
---|
66 | temporary[i]=0; |
---|
67 | |
---|
68 | //バッファをリプレイス |
---|
69 | TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1); |
---|
70 | UpdateWindow(hwnd); |
---|
71 | |
---|
72 | //コンポジションをセット(立て続けにIME入力が行われる場合を考慮) |
---|
73 | SetNextCompositionWindowPos(hIMC, WndNum); |
---|
74 | |
---|
75 | //コンテキストを解放 |
---|
76 | ImmReleaseContext(hwnd,hIMC); |
---|
77 | |
---|
78 | return 0; //DefWindowProcへ渡さないようTextEditProcへ指示 |
---|
79 | } |
---|
80 | |
---|
81 | return 1; |
---|
82 | } |
---|
83 | |
---|
84 | namespace |
---|
85 | { |
---|
86 | //PCSTRを受け渡すようにした_mbschrのラッパ |
---|
87 | inline PCSTR cmbschr(PCSTR p, UINT c) |
---|
88 | { |
---|
89 | return reinterpret_cast<PCSTR>(_mbschr(reinterpret_cast<UCHAR const*>(p), c)); |
---|
90 | } |
---|
91 | |
---|
92 | //chPos文字目が含まれる行の先頭へのオフセットを返す。 |
---|
93 | ptrdiff_t FindLineStartPos(PCSTR pBufStart, LONG CharPos) |
---|
94 | { |
---|
95 | //行頭を探す |
---|
96 | PCSTR pBufLineStart = pBufStart+CharPos; |
---|
97 | for(;;){ |
---|
98 | PCSTR p = CharPrev(pBufStart, pBufLineStart); |
---|
99 | if (*p=='\n' || pBufLineStart==pBufStart) |
---|
100 | break; |
---|
101 | pBufLineStart = p; |
---|
102 | } |
---|
103 | return pBufLineStart-pBufStart; |
---|
104 | } |
---|
105 | } |
---|
106 | |
---|
107 | LRESULT TextEditEvent_IME_RecomvertString(HWND hwnd, RECONVERTSTRING* prcs){ |
---|
108 | int WndNum = GetWndNum(GetParent(hwnd)); |
---|
109 | CHARRANGE SelRange; |
---|
110 | TextEdit_GetSel(WndNum, &SelRange); |
---|
111 | //選択範囲(キャレット)を含む行を探す(その行全体を返すため) |
---|
112 | PCSTR pBufStart = MdiInfo[WndNum]->pMdiTextEdit->buffer; |
---|
113 | ptrdiff_t LineStartPos = FindLineStartPos(pBufStart, SelRange.cpMin); |
---|
114 | |
---|
115 | ptrdiff_t LineEndPos; |
---|
116 | //行末を探す |
---|
117 | if(PCSTR pEnd = cmbschr(pBufStart+SelRange.cpMax,'\r')){ |
---|
118 | LineEndPos = pEnd-pBufStart; |
---|
119 | } |
---|
120 | else{ |
---|
121 | LineEndPos = static_cast<ptrdiff_t>(strlen(pBufStart)); |
---|
122 | } |
---|
123 | ptrdiff_t SelStrLen = LineEndPos-LineStartPos; //選択部分の長さ(選択範囲がなければそのまま0で良い) |
---|
124 | LRESULT lr = sizeof (RECONVERTSTRING)+SelStrLen+1; |
---|
125 | if(prcs){ |
---|
126 | //必要な情報の設定 |
---|
127 | //1行分の文字列と変換部分のオフセットを渡すようにしている |
---|
128 | PSTR pszBuf = reinterpret_cast<LPSTR>(&prcs[1]); |
---|
129 | memcpy(pszBuf, pBufStart+LineStartPos, static_cast<size_t>(SelStrLen)); |
---|
130 | pszBuf[SelStrLen] = '\0'; |
---|
131 | |
---|
132 | DWORD StrLen = SelRange.cpMax-SelRange.cpMin; |
---|
133 | DWORD StrOffset = SelRange.cpMin-LineStartPos; |
---|
134 | prcs->dwStrLen = SelStrLen; |
---|
135 | prcs->dwStrOffset = sizeof(*prcs); |
---|
136 | prcs->dwCompStrLen = StrLen; |
---|
137 | prcs->dwCompStrOffset = StrOffset; |
---|
138 | prcs->dwTargetStrLen = StrLen; |
---|
139 | prcs->dwTargetStrOffset = StrOffset; |
---|
140 | } |
---|
141 | return lr; |
---|
142 | } |
---|
143 | |
---|
144 | BOOL TextEditEvent_IME_ConfirmRecomvertString(HWND hwnd, RECONVERTSTRING* prcs){ |
---|
145 | int WndNum = GetWndNum(GetParent(hwnd)); |
---|
146 | CHARRANGE SelRange; |
---|
147 | TextEdit_GetSel(WndNum, &SelRange); |
---|
148 | //選択範囲(キャレット)を含む行を探す(その行全体を返すため) |
---|
149 | PCSTR pBufStart = MdiInfo[WndNum]->pMdiTextEdit->buffer; |
---|
150 | ptrdiff_t LineStartPos = FindLineStartPos(pBufStart, SelRange.cpMin); |
---|
151 | |
---|
152 | //再変換部分が通知されるので、そこを選択状態にする。 |
---|
153 | int ReconvStartPos = static_cast<int>(LineStartPos+prcs->dwCompStrOffset); |
---|
154 | TextEdit_SetSel(WndNum, ReconvStartPos, ReconvStartPos+static_cast<int>(prcs->dwCompStrLen)); |
---|
155 | //候補ウィンドウの位置の設定 |
---|
156 | if (HIMC himc = ImmGetContext(hwnd)){ |
---|
157 | SetNextCompositionWindowPos(himc, WndNum); |
---|
158 | ImmReleaseContext(hwnd, himc); |
---|
159 | } |
---|
160 | return TRUE; |
---|
161 | } |
---|