1 #include <stdio.h>
2 #include "PCMan.h"
3 #include "resource.h"
4 
5 #pragma managed
6 #using <mscorlib.dll>
7 #using <System.dll>
8 #using <System.Windows.Forms.dll>
9 using namespace System;
10 using namespace System::Reflection;
11 using namespace System::Windows::Forms;
12 
CSharpWidgetDemo()13 void CSharpWidgetDemo() {
14 	try {
15 		Assembly* exAsm
16 			= Reflection::Assembly::LoadFile("C:\\WINDOWS\\OpenVanilla\\CSharpFormLibrary.dll");
17 		Form* exForm
18 			= dynamic_cast<Form*>(exAsm->CreateInstance("CSharpFormLibrary.DemoForm", true));
19 		exForm->ShowDialog();
20 		/*
21 		DemoForm __gc *bar = __gc new DemoForm();
22 		bar->ShowDialog();
23 		*/
24 	} catch (Exception* e) {
25 		Console::WriteLine(e->Message);
26 	}
27 }
28 
29 #pragma unmanaged
30 //	SendMessage( hToolbar, TB_GETMAXSIZE, 0, LPARAM(&sz));
31 //  This standard toolbar message provided by Windows has some known bugs.
32 //  So I implemented a new function myself to prevent the problem.
GetToolbarSize(HWND toolbar,SIZE * sz)33 void GetToolbarSize(HWND toolbar, SIZE *sz)
34 {
35 	sz->cx = sz->cy = 0;
36 	int c = (int)SendMessage( toolbar, TB_BUTTONCOUNT, 0, 0);
37 	for( int i = 0; i < c ; ++i )
38 	{
39 		RECT itemrc;
40 		SendMessage( toolbar, TB_GETITEMRECT, i, LPARAM(&itemrc));
41 		sz->cx += (itemrc.right - itemrc.left);
42 		itemrc.bottom -= itemrc.top;
43 		if( itemrc.bottom > sz->cy )
44 			sz->cy = itemrc.bottom;
45 	}
46 }
47 
StatusWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)48 LRESULT APIENTRY StatusWndProc(HWND hWnd,
49 		UINT msg,
50 		WPARAM wParam,
51 		LPARAM lParam)
52 {
53 	POINT pt;
54 	UINT id;
55 	RECT drc;
56 	DWORD        dwT;
57 	switch (msg)
58 	{
59 		case WM_PAINT:
60 			PaintStatusWindow(hWnd);
61 			break;
62 		case WM_SETCURSOR:
63 		case WM_MOUSEMOVE:
64 		case WM_LBUTTONUP:
65 		case WM_RBUTTONUP:
66 
67 			if( GetCapture() != hWnd && GetCursorPos( &pt ) &&
68 				ScreenToClient( hWnd, &pt ) && pt.x >= 12 )
69 				return DefWindowProc(hWnd, msg, wParam, lParam);
70 
71 			DragUI(hWnd, NULL, msg, wParam, lParam, FALSE);
72 
73 			if(msg == WM_LBUTTONUP || msg == WM_RBUTTONUP) {
74 				dwT = GetWindowLong(hWnd,FIGWL_MOUSE);
75 				if (dwT & FIM_MOVED) {
76 					GetWindowRect(uiStatus.hWnd, &drc);
77 					UIMoveStatusWindow(hWnd, drc.left, drc.top);
78 				}
79 			}
80 			if ((msg == WM_SETCURSOR) &&
81 				(HIWORD(lParam) != WM_LBUTTONDOWN) &&
82 				(HIWORD(lParam) != WM_RBUTTONDOWN))
83 				return DefWindowProc(hWnd, msg, wParam, lParam);
84 
85 			if ((msg == WM_LBUTTONUP) || (msg == WM_RBUTTONUP))
86 			{
87 				SetWindowLong(hWnd, FIGWL_MOUSE, 0L);
88 				if(msg == WM_RBUTTONUP) {
89 					CurrentIC++;
90 					if(CurrentIC > (int)IC.size() - 1)
91 						CurrentIC = 0;
92 					InvalidateRect(uiStatus.hWnd,NULL, FALSE);
93 				}
94 			}
95 			break;
96 		case WM_NOTIFY:
97 			{
98 				switch( ((NMHDR*)lParam)->code )
99 				{
100 				case TTN_GETDISPINFO:
101 				{
102 					LPTOOLTIPTEXT pttt;
103 					pttt = (LPTOOLTIPTEXT)lParam;
104 					pttt->hinst = hInstDLL;
105 					pttt->lpszText = MAKEINTRESOURCE(pttt->hdr.idFrom);
106 					break;
107 				}
108 				}
109 			}
110 			break;
111 		case WM_MOUSEACTIVATE:
112 			return MA_NOACTIVATE;
113 			break;
114 		case WM_SIZE:
115 			{
116 				int cx = LOWORD(lParam);
117 				int cy = HIWORD(lParam);
118 				MoveWindow( hToolbar, 12, 2, cx-13, cy-4, TRUE);
119 			}
120 			break;
121 		case WM_COMMAND:
122 			id = LOWORD(wParam);
123 			switch( id )
124 			{
125 			case ID_CHANGE_IME:
126 				{
127 					RECT rc;
128 					SendMessage( hToolbar, TB_GETITEMRECT, 0, LPARAM(&rc) );
129 					MapWindowPoints( hToolbar, HWND_DESKTOP, LPPOINT(&rc), 2 );
130 					CheckMenuItem( hIMESelMenu, ID_IME_LIST_FIRST + CurrentIC, MF_CHECKED );
131 					TrackPopupMenu( hIMESelMenu, TPM_LEFTALIGN, rc.left, rc.bottom, 0, hWnd, NULL);
132 					CheckMenuItem( hIMESelMenu, ID_IME_LIST_FIRST + CurrentIC, MF_UNCHECKED );
133 				}
134 				break;
135 			case ID_CHI_ENG:
136 				{
137 					isChinese = !isChinese;
138 					SendMessage( hToolbar, TB_CHANGEBITMAP, ID_CHI_ENG, MAKELPARAM(isChinese ? 2 : 3, 0));
139 					HIMC imc = ImmGetContext( hIMEWnd );
140 					if( imc )
141 					{
142 						DWORD conv, sentence;
143 						ImmGetConversionStatus( imc, &conv, &sentence);
144 						if( isChinese )
145 							conv |= IME_CMODE_NATIVE;
146 						else
147 							conv &= ~IME_CMODE_NATIVE;
148 						ImmSetConversionStatus( imc, conv, sentence);
149 					}
150 				}
151 				break;
152 			case ID_FULL_HALF:
153 				{
154 					isFull = !isFull;
155 					SendMessage( hToolbar, TB_CHANGEBITMAP, ID_FULL_HALF, MAKELPARAM(isFull ? 4 : 5, 0));
156 					HIMC imc = ImmGetContext( hIMEWnd );
157 					if( imc )
158 					{
159 						DWORD conv, sentence;
160 						ImmGetConversionStatus( imc, &conv, &sentence);
161 						if( isFull )
162 							conv |= IME_CMODE_FULLSHAPE;
163 						else
164 							conv &= ~IME_CMODE_FULLSHAPE;
165 						ImmSetConversionStatus( imc, conv, sentence);
166 					}
167 				}
168 				break;
169 			case ID_CONFIG:
170 				{
171 					TCHAR exe_path[MAX_PATH];
172 					TCHAR file_name[] = _T("\\OpenVanilla\\OVPreferences.exe");
173 				    GetWindowsDirectory(exe_path, MAX_PATH - (int)_tcslen( file_name ) );
174 				    _stprintf(exe_path, _T("%s\\%s"), exe_path, file_name);
175 
176 					ShellExecute( NULL, _T("open"), exe_path, NULL, NULL, SW_SHOWNORMAL );
177 				}
178 				break;
179 			case ID_IME_HELP:
180 				CSharpWidgetDemo();
181 				break;
182 			default:
183 				if( id >= ID_IME_LIST_FIRST && id < ID_IME_LIST_LAST )
184 				{
185 					id -= ID_IME_LIST_FIRST;
186 					CurrentIC = id;
187 
188 					TBBUTTONINFO tbi;	tbi.cbSize = sizeof(tbi);
189 					tbi.dwMask = TBIF_TEXT;		tbi.pszText = IC.at(CurrentIC);
190 
191 					SendMessage( hToolbar, TB_SETBUTTONINFO, ID_CHANGE_IME, LPARAM(&tbi));
192 
193 					SIZE sz;
194 //					SendMessage( hToolbar, TB_GETMAXSIZE, 0, LPARAM(&sz));
195 					GetToolbarSize( hToolbar, &sz );
196 
197 					uiStatus.sz.cx = sz.cx + 14;
198 					uiStatus.sz.cy = sz.cy + 4;
199 					RECT rc;
200 					GetWindowRect(uiStatus.hWnd, &rc);
201 					UIMoveStatusWindow(hWnd, rc.left, rc.top );
202 				}
203 			}
204 			break;
205 		default:
206 			if (!MyIsIMEMessage(msg))
207 				return DefWindowProc(hWnd, msg, wParam, lParam);
208 			break;
209 	}
210 	return 0;
211 }
212 
213 
214 TBBUTTON toolbar_btns[]={
215 	{0, ID_CHANGE_IME, TBSTATE_ENABLED ,TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, {0}, 0, 0 },
216 	{1, ID_CONFIG, TBSTATE_ENABLED ,TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, {0}, 0, 0 },
217 	{2, ID_CHI_ENG, TBSTATE_ENABLED ,TBSTYLE_BUTTON, {0}, 0, 0 },
218 	{5, ID_FULL_HALF, TBSTATE_ENABLED ,TBSTYLE_BUTTON, {0}, 0, 0 },
219 	{6, ID_IME_HELP, TBSTATE_ENABLED ,TBSTYLE_BUTTON, {0}, 0, 0 }
220 };
221 
222 
UICreateStatusWindow(HWND hUIWnd)223 void UICreateStatusWindow(HWND hUIWnd)
224 {
225 	if (!IsWindow(uiStatus.hWnd))
226 	{
227 		SIZE sz;
228 
229 		hIMEWnd = hUIWnd;
230 
231 		uiStatus.hWnd =
232 			CreateWindowEx(WS_EX_CONTROLPARENT|WS_EX_TOPMOST, UISTATUSCLASSNAME, NULL,
233 					WS_POPUP | WS_CLIPCHILDREN,
234 					0, 0, 1, 1, hUIWnd, NULL, hInst, NULL);
235 		SetWindowLong(uiStatus.hWnd, FIGWL_SVRWND, (DWORD)hUIWnd);
236 
237 		hToolbar = CreateToolbarEx( uiStatus.hWnd,
238 			TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|TBSTYLE_LIST|CCS_NODIVIDER|CCS_NORESIZE|
239 			WS_CHILD|WS_VISIBLE|CCS_NOPARENTALIGN,
240 			10, 3, hInstDLL, 0,
241 			toolbar_btns, sizeof(toolbar_btns)/sizeof(TBBUTTON),
242 			16, 16, 16, 16, sizeof(TBBUTTON));
243 
244 //		hToolbar = CreateWindowEx( 0, TOOLBARCLASSNAME, NULL, CCS_NOPARENTALIGN|WS_CHILD|WS_VISIBLE,
245 //			100, 1, 20, 24, uiStatus.hWnd, NULL, hInstDLL, NULL);
246 
247 		HIMAGELIST himl = ImageList_Create( 16, 16, ILC_COLOR24|ILC_MASK, 7, 0);
248 		HBITMAP htbbmp = LoadBitmap( hInstDLL, LPCTSTR(IDB_STATUS_TB) );
249 		ImageList_RemoveAll(himl);
250 		ImageList_AddMasked( himl, htbbmp, RGB(192, 192, 192) );
251 		DeleteObject(htbbmp);
252 		himl = (HIMAGELIST)SendMessage( hToolbar, TB_SETIMAGELIST, 0, LPARAM(himl));
253 		if( himl )
254 			ImageList_Destroy( himl );
255 
256 		TBBUTTONINFO tbi;	tbi.cbSize = sizeof(tbi);
257 		tbi.dwMask = TBIF_TEXT;		tbi.pszText = IC.at(CurrentIC);
258 		SendMessage( hToolbar, TB_SETBUTTONINFO, ID_CHANGE_IME, LPARAM(&tbi));
259 
260 //		SendMessage( hToolbar, TB_GETMAXSIZE, 0, LPARAM(&sz));
261 		GetToolbarSize( hToolbar, &sz );
262 
263 		uiStatus.sz.cx = sz.cx + 14;
264 		uiStatus.sz.cy = sz.cy + 4;
265 		if( uiStatus.sz.cy < 26 )
266 			uiStatus.sz.cy = 26;
267 		MoveWindow(uiStatus.hWnd,
268 				uiStatus.pt.x,
269 				uiStatus.pt.y,
270 				uiStatus.sz.cx,
271 				uiStatus.sz.cy,
272 				TRUE);
273 		ShowWindow(uiStatus.hWnd, SW_SHOWNOACTIVATE);
274 	}
275 	UIHideStatusWindow();
276 	return;
277 }
278 
UIMoveStatusWindow(HWND hUIWnd,int X,int Y)279 void UIMoveStatusWindow(HWND hUIWnd, int X, int Y)
280 {
281 	if (!IsWindow(uiStatus.hWnd))
282 		UICreateStatusWindow(hUIWnd);
283 
284 	if (IsWindow(uiStatus.hWnd))
285 	{
286 		//HDC hDC;
287 		//HFONT oldFont;
288 		POINT pt;
289 		RECT screenrc;
290 		SIZE sz;
291 
292 		sz.cx = 0;
293 		sz.cy = 0;
294 		uiStatus.pt.x = X;
295 		uiStatus.pt.y = Y;
296 
297 		if(sz.cx < uiStatus.sz.cx)
298 			sz.cx = uiStatus.sz.cx;
299 
300 		sz.cy = uiStatus.sz.cy;
301 
302 		pt.x = uiStatus.pt.x;
303 		pt.y = uiStatus.pt.y;
304 
305 		SystemParametersInfo(SPI_GETWORKAREA,
306 				0,
307 				&screenrc,
308 				0);
309 
310 		if( (pt.x + sz.cx) > screenrc.right )
311 			pt.x = screenrc.right - sz.cx;
312 		if( (pt.y + sz.cy) > screenrc.bottom )
313 			pt.y = screenrc.bottom - sz.cy;
314 
315 		MoveWindow(uiStatus.hWnd,
316 				pt.x,
317 				pt.y,
318 				sz.cx,
319 				sz.cy,
320 				TRUE);
321 
322 		uiStatus.pt.x = pt.x;
323 		uiStatus.pt.y = pt.y;
324 
325 		ShowWindow(uiStatus.hWnd, SW_SHOWNOACTIVATE);
326 
327 		InvalidateRect(uiStatus.hWnd,NULL, FALSE);
328 	}
329 }
330 
PaintStatusWindow(HWND hStatusWnd)331 void PaintStatusWindow(HWND hStatusWnd)
332 {
333 	PAINTSTRUCT ps;
334 	HDC hDC;
335 	RECT rc;
336 
337 	hDC = BeginPaint(hStatusWnd,&ps);
338 	GetClientRect(hStatusWnd,&rc);
339 
340 	FillSolidRect( hDC, &rc, GetSysColor(COLOR_BTNFACE));
341 
342 	Draw3DBorder( hDC, &rc, GetSysColor(COLOR_BTNHILIGHT), 0/*GetSysColor(COLOR_BTNSHADOW)*/);
343 
344 	InflateRect( &rc, -3, -3 );
345 	rc.left++;
346 	rc.right = rc.left + 3;
347 	Draw3DBorder( hDC, &rc, GetSysColor(COLOR_BTNHILIGHT), GetSysColor(COLOR_BTNSHADOW));
348 	OffsetRect( &rc, 4, 0);
349 	Draw3DBorder( hDC, &rc, GetSysColor(COLOR_BTNHILIGHT), GetSysColor(COLOR_BTNSHADOW));
350 
351 	EndPaint(hStatusWnd,&ps);
352 }
353 
UIShowStatusWindow()354 void UIShowStatusWindow()
355 {
356 	if (IsWindow(uiStatus.hWnd))
357 		ShowWindow(uiStatus.hWnd, SW_SHOWNOACTIVATE);
358 }
359 
UIHideStatusWindow()360 void UIHideStatusWindow()
361 {
362 	if (IsWindow(uiStatus.hWnd))
363 		ShowWindow(uiStatus.hWnd, SW_HIDE);
364 }
365 
366 int CompIndexToXPos(int index);
367 
UISetCursorPos(int i)368 void UISetCursorPos(int i)
369 {
370 	int cursor = CompIndexToXPos( CompCursorPos );
371 	RECT rc;
372 	GetClientRect( uiComp.hWnd, &rc );
373 	HDC dc = GetDC( uiComp.hWnd );
374 	BitBlt( dc, cursor, 0, 1, rc.bottom, dc, cursor, 0, SRCINVERT );
375 	CompCursorPos = i;
376 	cursor = CompIndexToXPos( CompCursorPos );
377 	BitBlt( dc, cursor, 0, 1, rc.bottom, dc, cursor, 0, SRCINVERT );
378 }
379 
UISetMarkFrom(int i)380 void UISetMarkFrom(int i)
381 {
382 	CompSelStart = i;
383 /*	HDC tmpdc = GetDC(NULL);
384 	TCHAR debug_info[100];
385 	_stprintf(debug_info, _T("mf=%d"),  i);
386 	TextOut( tmpdc, 0, 0, debug_info, lstrlen(debug_info));
387 	ReleaseDC( NULL, tmpdc );
388 */
389 }
390 
UISetMarkTo(int i)391 void UISetMarkTo(int i)
392 {
393 /*	HDC tmpdc = GetDC(NULL);
394 	TCHAR debug_info[100];
395 	_stprintf(debug_info, _T("mt=%d"),  i);
396 	TextOut( tmpdc, 40, 0, debug_info, lstrlen(debug_info));
397 	ReleaseDC( NULL, tmpdc );
398 */
399 	CompSelEnd = i;
400 }
401 
UIChangeModule(HWND hWnd)402 void UIChangeModule(HWND hWnd)
403 {
404     TBBUTTONINFO tbi;	tbi.cbSize = sizeof(tbi);
405 
406 	CurrentIC++;
407 	if(CurrentIC > (int)IC.size() - 1)
408 			CurrentIC = 0;
409 
410 	tbi.dwMask = TBIF_TEXT;		tbi.pszText = IC.at(CurrentIC);
411 
412 	SendMessage( hToolbar, TB_SETBUTTONINFO, ID_CHANGE_IME, LPARAM(&tbi));
413 
414 	SIZE sz;
415 //	SendMessage( hToolbar, TB_GETMAXSIZE, 0, LPARAM(&sz));
416 	GetToolbarSize( hToolbar, &sz );
417 
418 	uiStatus.sz.cx = sz.cx + 14;
419 	uiStatus.sz.cy = sz.cy + 4;
420 	RECT rc;
421 	GetWindowRect(uiStatus.hWnd, &rc);
422 	UIMoveStatusWindow(hWnd, rc.left, rc.top );
423 }
424 
UIChangeHalfFull(HWND hWnd)425 void UIChangeHalfFull(HWND hWnd)
426 {
427 	isFull = !isFull;
428 	SendMessage( hToolbar, TB_CHANGEBITMAP, ID_FULL_HALF, MAKELPARAM(isFull ? 4 : 5, 0));
429 	HIMC imc = ImmGetContext( hIMEWnd );
430 	if( imc )
431 	{
432 		DWORD conv, sentence;
433 		ImmGetConversionStatus( imc, &conv, &sentence);
434 		if( isFull )
435 			conv |= IME_CMODE_FULLSHAPE;
436 		else
437 			conv &= ~IME_CMODE_FULLSHAPE;
438 			ImmSetConversionStatus( imc, conv, sentence);
439 	}
440 }
441 
UIChangeChiEng(HWND hWnd)442 void UIChangeChiEng(HWND hWnd)
443 {
444 	isChinese = !isChinese;
445 	SendMessage( hToolbar, TB_CHANGEBITMAP, ID_CHI_ENG, MAKELPARAM(isChinese ? 2 : 3, 0));
446 	HIMC imc = ImmGetContext( hIMEWnd );
447 	if( imc )
448 	{
449 		DWORD conv, sentence;
450 		ImmGetConversionStatus( imc, &conv, &sentence);
451 		if( isChinese )
452 			conv |= IME_CMODE_NATIVE;
453 		else
454 			conv &= ~IME_CMODE_NATIVE;
455 		ImmSetConversionStatus( imc, conv, sentence);
456 	}
457 }
458