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