1 //#define OV_DEBUG
2 #include "OVIME.h"
3 #include <cstdio>
4
MakeCompStr(LPMYPRIVATE lpMyPrivate,LPCOMPOSITIONSTRING lpCompStr)5 void MakeCompStr(LPMYPRIVATE lpMyPrivate, LPCOMPOSITIONSTRING lpCompStr)
6 {
7 wcscpy(GETLPCOMPSTR(lpCompStr), L"");
8 swprintf(GETLPCOMPSTR(lpCompStr), lpMyPrivate->PreEditStr);
9 lpCompStr->dwCompStrLen = (DWORD)wcslen(GETLPCOMPSTR(lpCompStr));
10 }
11
InitCompStr(LPCOMPOSITIONSTRING lpCompStr)12 void InitCompStr(LPCOMPOSITIONSTRING lpCompStr)
13 {
14 lpCompStr->dwSize = sizeof(MYCOMPSTR);
15 lpCompStr->dwCompStrOffset =
16 (DWORD)((LPMYCOMPSTR)lpCompStr)->szCompStr - (DWORD)lpCompStr;
17 lpCompStr->dwCompStrLen = 0;
18 *GETLPCOMPSTR(lpCompStr) = L'\0';
19
20 lpCompStr->dwResultStrOffset =
21 (DWORD)((LPMYCOMPSTR)lpCompStr)->szResultStr - (DWORD)lpCompStr;
22 lpCompStr->dwResultStrLen = 0;
23 *GETLPRESULTSTR(lpCompStr) = L'\0';
24
25 lpCompStr->dwCursorPos = 0;
26 }
27
InitCandInfo(LPCANDIDATEINFO lpCandInfo)28 void InitCandInfo(LPCANDIDATEINFO lpCandInfo)
29 {
30 LPCANDIDATELIST lpCandList;
31
32 int i;
33
34 lpCandInfo->dwSize = sizeof(MYCAND);
35 lpCandInfo->dwCount = 1;
36 lpCandInfo->dwOffset[0] =
37 (DWORD)(&(((LPMYCAND)lpCandInfo)->cl)) - (DWORD)lpCandInfo;
38
39 lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);
40 for(i = 0; i < MAXCANDSTRNUM; i++)
41 {
42 lpCandList->dwOffset[i] =
43 (DWORD)((LPMYCAND)lpCandInfo)->szCandStr[i] - (DWORD)lpCandList;
44 }
45 lpCandList->dwSize = sizeof(MYCAND) - sizeof(CANDIDATEINFO);
46 lpCandList->dwCount = 0L;
47 lpCandList->dwSelection = 0L;
48 lpCandList->dwPageStart = 0L;
49 lpCandList->dwPageSize = 0L;
50 }
51
ClearCandidate(LPCANDIDATEINFO lpCandInfo)52 void ClearCandidate(LPCANDIDATEINFO lpCandInfo)
53 {
54 ((LPMYCAND)lpCandInfo)->cl.dwCount =0L;
55 ((LPMYCAND)lpCandInfo)->cl.dwSelection =0L;
56 ((LPMYCAND)lpCandInfo)->cl.dwPageStart =0L;
57 ((LPMYCAND)lpCandInfo)->cl.dwPageSize =0L;
58 }
59
UpdateCandidate(LPINPUTCONTEXT lpIMC,const wchar_t * candis)60 void UpdateCandidate(LPINPUTCONTEXT lpIMC, const wchar_t* candis)
61 {
62 LPCANDIDATEINFO lpCandInfo;
63 LPCANDIDATELIST lpCandList;
64 if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
65 {
66 wchar_t* lpStr;
67 lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo
68 + lpCandInfo->dwOffset[0]);
69 int rlen = (int)wcslen(candis);
70 int n = 0;
71 int ln = 0;
72 for( int i = 0; i < rlen; i++ )
73 {
74 if(candis[i] == L' ' || i == rlen - 1)
75 {
76 int dst = i - 1;
77 if( i == rlen - 1)
78 dst = i + 1;
79 lpStr = GETLPCANDSTR(lpCandList, n);
80 memset(lpStr, 0, 100*sizeof(wchar_t));
81 wcsncpy(lpStr, candis+ln, dst - ln + 1);
82 ln = i + 1;
83 n++;
84 }
85 }
86 lpCandList->dwCount = n - 2;
87 lpCandList->dwPageSize = 11;
88 lpCandList->dwPageStart = 0;
89
90 ImmUnlockIMCC(lpIMC->hCandInfo);
91 }
92 }
93
94
RefreshUI(HWND hWnd)95 void RefreshUI(HWND hWnd) //�վ�comp cand
96 {
97 LOGFONT* lfptr;
98 LOGFONT lf2;
99 //RECT rec;
100 //SIZE szOffset;
101 HDC hDC;
102 POINT ptSrc;
103 TEXTMETRIC tm;
104
105 HIMC hUICurIMC = (HIMC)GetWindowLong(hWnd, IMMGWL_IMC);
106 ImmModel* model = ImmModel::open(hUICurIMC);
107
108 dsvr->setHIMC(hUICurIMC);
109
110 LPINPUTCONTEXT lpIMC = model->getIMC();
111 //lpIMC = ImmLockIMC(hUICurIMC);
112
113 int localDPIY; //for device dpiY
114 if(dsvr->isCompEnabled) // comp exist, cand follow comp's position
115 {
116 ptSrc = lpIMC->cfCompForm.ptCurrentPos;
117 }
118 else if(dsvr->isCandiEnabled) // comp doesn't exist, get cand posistion
119 {
120 ptSrc = lpIMC->cfCandForm[0].ptCurrentPos;
121 }
122
123 ClientToScreen(lpIMC->hWnd, &ptSrc);
124 hDC = GetDC(lpIMC->hWnd);
125 murmur("\th Refresh: lpIMC->Wnd->%x", lpIMC->hWnd);
126
127 //computes the width and height of the specified string of text.
128 //GetTextExtentPoint(hDC, _T("A"), 1, &szOffset);
129
130 //fills the specified buffer with the metrics for the currently selected font.
131 GetTextMetrics(hDC, &tm);
132 localDPIY = GetDeviceCaps(hDC, LOGPIXELSY);
133 ReleaseDC(lpIMC->hWnd,hDC);
134 lfptr = (LOGFONT*)(&lpIMC->lfFont);
135 memcpy( &lf2, lfptr, sizeof( lf2) );
136
137 //LPMYPRIVATE lpMyPrivate = model->getMyPrivate();
138 //lpMyPrivate = (LPMYPRIVATE)ImmLockIMCC(lpIMC->hPrivate);
139 if(dsvr->isCompEnabled)
140 {
141 CompX = ptSrc.x ;
142 //CompY = ptSrc.y + szOffset.cy;
143 CompY = ptSrc.y + abs(lf2.lfHeight)*localDPIY/tm.tmDigitizedAspectY;
144 dsvr->moveBuf(CompX,CompY);
145 if(dsvr->isCandiEnabled)
146 {
147 CandX = CompX+UIGetCaretPosX();
148 CandY = CompY+UIGetHeight();
149 dsvr->moveCandi(CandX,CandY);
150 }
151 }
152 else if(dsvr->isCandiEnabled)
153 {
154 CandX= ptSrc.x ;
155 //CandY= ptSrc.y + szOffset.cy;
156 CandY= ptSrc.y + abs(lf2.lfHeight)*localDPIY/tm.tmDigitizedAspectY;
157 dsvr->moveCandi(CandX,CandY);
158 }
159
160 ImmModel::close();
161 }
162