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