OSDN Git Service

Remove TODO comments, some lines commented out.
[xkeymacs/xkeymacs.git] / xkeymacs / mainfrm.cpp
1 // MainFrm.cpp : implementation of the CMainFrame class\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 #include <Lmcons.h>\r
6 #include "xkeymacs.h"\r
7 #include "Profile.h"\r
8 \r
9 #include "MainFrm.h"\r
10 \r
11 #ifdef _DEBUG\r
12 #define new DEBUG_NEW\r
13 #undef THIS_FILE\r
14 static char THIS_FILE[] = __FILE__;\r
15 #endif\r
16 \r
17 #define WM_USER_NTFYICON (WM_USER+100)\r
18 \r
19 /////////////////////////////////////////////////////////////////////////////\r
20 // CMainFrame\r
21 \r
22 IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)\r
23 \r
24 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)\r
25         //{{AFX_MSG_MAP(CMainFrame)\r
26         ON_WM_CREATE()\r
27         ON_COMMAND(IDC_ABOUT, OnAbout)\r
28         ON_COMMAND(IDC_QUIT, OnQuit)\r
29         ON_COMMAND(IDC_DISABLE, OnDisable)\r
30         ON_COMMAND(IDC_PROPERTIES, OnProperties)\r
31         ON_COMMAND(IDC_OPTIONS, OnOptions)\r
32         ON_COMMAND(IDC_KEYBOARD, OnKeyboard)\r
33         ON_COMMAND(IDC_IMPORT, OnImport)\r
34         ON_COMMAND(IDC_EXPORT, OnExport)\r
35         ON_COMMAND(IDC_RESET, OnReset)\r
36         ON_COMMAND(ID_HELP_FINDER, OnHelpFinder)\r
37         ON_COMMAND(IDC_KEYBOARD_ANY_USER, OnKeyboardAnyUser)\r
38         //}}AFX_MSG_MAP\r
39 END_MESSAGE_MAP()\r
40 \r
41 /////////////////////////////////////////////////////////////////////////////\r
42 // CMainFrame construction/destruction\r
43 \r
44 CMainFrame::CMainFrame()\r
45 {\r
46         m_pXkeymacsDll                  = new CXkeymacsDll;\r
47         m_pPropertiesDlg                = new CProperties;\r
48         m_nResultPropertiesDlg  = -1;\r
49         m_bPropertiesDlgExist   = FALSE;\r
50         m_pAboutDlg                             = new CAboutDlg;\r
51         m_nResultAboutDlg               = -1;\r
52         m_bAboutDlgExist                = FALSE;\r
53         m_pOptionsDlg                   = new COptionsDlg;\r
54         m_nResultOptionsDlg             = -1;\r
55         m_bOptionsDlgExist              = FALSE;\r
56         memset(m_p104KeyboardDlg, 0, sizeof(m_p104KeyboardDlg));\r
57         memset(m_p109KeyboardDlg, 0, sizeof(m_p109KeyboardDlg));\r
58         for (int i = 0; i < MAX_HKEY_TYPE; ++i) {\r
59                 m_p104KeyboardDlg[i] = new C104Keyboard((HKEY_TYPE) i);\r
60                 m_p109KeyboardDlg[i] = new C109Keyboard((HKEY_TYPE) i);\r
61         }\r
62         memset(m_nResultKeyboardDlg, -1, sizeof(m_nResultKeyboardDlg));\r
63         memset(m_bKeyboardDlgExist, 0, sizeof(m_bKeyboardDlgExist));\r
64 \r
65         // register window class\r
66         WNDCLASS        stWndClass;\r
67         CString szClassName(MAKEINTRESOURCE(AFX_IDS_APP_TITLE));\r
68 \r
69         stWndClass.style                        = CS_BYTEALIGNWINDOW;\r
70         stWndClass.lpfnWndProc          = &AfxWndProc;\r
71         stWndClass.cbClsExtra           = 0;\r
72         stWndClass.cbWndExtra           = 0;\r
73         stWndClass.hInstance            = AfxGetInstanceHandle();\r
74         stWndClass.hIcon                        = NULL;\r
75         stWndClass.hCursor                      = NULL;\r
76         stWndClass.hbrBackground        = (HBRUSH)COLOR_BACKGROUND;\r
77         stWndClass.lpszMenuName         = NULL;\r
78         stWndClass.lpszClassName        = szClassName;\r
79 \r
80         AfxRegisterClass(&stWndClass);\r
81 \r
82         // make window\r
83         CRect   rect(0, 0, 100, 100);\r
84 \r
85         Create(szClassName, CString(MAKEINTRESOURCE(AFX_IDS_APP_TITLE)), WS_OVERLAPPEDWINDOW | WS_MINIMIZE, rect);\r
86 }\r
87 \r
88 CMainFrame::~CMainFrame()\r
89 {\r
90         delete m_pXkeymacsDll;\r
91         m_pXkeymacsDll = NULL;\r
92 \r
93         delete m_pPropertiesDlg;\r
94         m_pPropertiesDlg = NULL;\r
95 \r
96         delete m_pAboutDlg;\r
97         m_pAboutDlg = NULL;\r
98 \r
99         delete m_pOptionsDlg;\r
100         m_pOptionsDlg = NULL;\r
101 \r
102         for (int i = 0; i < MAX_HKEY_TYPE; ++i) {\r
103                 delete m_p104KeyboardDlg[i];\r
104                 m_p104KeyboardDlg[i] = NULL;\r
105 \r
106                 delete m_p109KeyboardDlg[i];\r
107                 m_p109KeyboardDlg[i] = NULL;\r
108         }\r
109 }\r
110 \r
111 int CMainFrame::OnCreate(const LPCREATESTRUCT lpCreateStruct)\r
112 {\r
113         if (CFrameWnd::OnCreate(lpCreateStruct) == -1) {\r
114                 return -1;\r
115         }\r
116 \r
117         CXkeymacsData::Set106Keyboard(CProfile::Is106Keyboard());\r
118 \r
119         // init notify icon data\r
120         NOTIFYICONDATA notifyIconData[MAX_ICON_TYPE] = {\r
121                 { sizeof(NOTIFYICONDATA), m_hWnd, MAIN_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
122                   (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_SHARED) },\r
123                 { sizeof(NOTIFYICONDATA), m_hWnd, CX_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
124                   AfxGetApp()->LoadIcon(IDI_CX_OFF) },\r
125                 { sizeof(NOTIFYICONDATA), m_hWnd, MX_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
126                   AfxGetApp()->LoadIcon(IDI_MX_OFF) },\r
127                 { sizeof(NOTIFYICONDATA), m_hWnd, META_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
128                   AfxGetApp()->LoadIcon(IDI_META_OFF) },\r
129                 { sizeof(NOTIFYICONDATA), m_hWnd, SHIFT_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
130                   AfxGetApp()->LoadIcon(IDI_SHIFT_OFF) },\r
131                 { sizeof(NOTIFYICONDATA), m_hWnd, CTRL_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
132                   AfxGetApp()->LoadIcon(IDI_CTRL_OFF) },\r
133                 { sizeof(NOTIFYICONDATA), m_hWnd, ALT_ICON, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_USER_NTFYICON,\r
134                   AfxGetApp()->LoadIcon(IDI_ALT_OFF) },\r
135         };\r
136         LoadString(AfxGetInstanceHandle(), AFX_IDS_APP_TITLE, notifyIconData[MAIN_ICON].szTip,\r
137                            sizeof(notifyIconData[MAIN_ICON].szTip));\r
138         LoadString(AfxGetInstanceHandle(), IDS_TIP_CX, notifyIconData[CX_ICON].szTip,\r
139                            sizeof(notifyIconData[CX_ICON].szTip));\r
140         LoadString(AfxGetInstanceHandle(), IDS_TIP_MX, notifyIconData[MX_ICON].szTip,\r
141                            sizeof(notifyIconData[MX_ICON].szTip));\r
142         LoadString(AfxGetInstanceHandle(), IDS_TIP_META, notifyIconData[META_ICON].szTip,\r
143                            sizeof(notifyIconData[META_ICON].szTip));\r
144         LoadString(AfxGetInstanceHandle(), IDS_TIP_SHIFT, notifyIconData[SHIFT_ICON].szTip,\r
145                            sizeof(notifyIconData[SHIFT_ICON].szTip));\r
146         LoadString(AfxGetInstanceHandle(), IDS_TIP_CTRL, notifyIconData[CTRL_ICON].szTip,\r
147                            sizeof(notifyIconData[CTRL_ICON].szTip));\r
148         LoadString(AfxGetInstanceHandle(), IDS_TIP_ALT, notifyIconData[ALT_ICON].szTip,\r
149                            sizeof(notifyIconData[ALT_ICON].szTip));\r
150 \r
151         // set notify icon data\r
152         m_pXkeymacsDll->SetNotifyIconData(MAIN_ICON, notifyIconData[MAIN_ICON],\r
153                 (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_SHARED),\r
154                 (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAIN_DISABLE_TMP), IMAGE_ICON, 16, 16, LR_SHARED),\r
155                 (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAIN_DISABLE_WOCQ), IMAGE_ICON, 16, 16, LR_SHARED),              // disable without C-q\r
156                 (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAIN_DISABLE), IMAGE_ICON, 16, 16, LR_SHARED),\r
157                 AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_MAIN)), 1));\r
158 \r
159         // set notify ^X icon data\r
160         m_pXkeymacsDll->SetNotifyIconData(CX_ICON, notifyIconData[CX_ICON], AfxGetApp()->LoadIcon(IDI_CX_ON),\r
161                                                                           AfxGetApp()->LoadIcon(IDI_CX_OFF),\r
162                                                                           AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CX)), 0));\r
163 \r
164         // set notify M-x icon data\r
165         m_pXkeymacsDll->SetNotifyIconData(MX_ICON, notifyIconData[MX_ICON], AfxGetApp()->LoadIcon(IDI_MX_ON),\r
166                                                                           AfxGetApp()->LoadIcon(IDI_MX_OFF),\r
167                                                                           AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_MX)), 0));\r
168 \r
169         // set notify Meta icon data\r
170         m_pXkeymacsDll->SetNotifyIconData(META_ICON, notifyIconData[META_ICON], AfxGetApp()->LoadIcon(IDI_META_ON),\r
171                                                                           AfxGetApp()->LoadIcon(IDI_META_OFF),\r
172                                                                           AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_META)), 0));\r
173 \r
174         // set notify Shift icon data\r
175         m_pXkeymacsDll->SetNotifyIconData(SHIFT_ICON, notifyIconData[SHIFT_ICON], AfxGetApp()->LoadIcon(IDI_SHIFT_ON),\r
176                                                                           AfxGetApp()->LoadIcon(IDI_SHIFT_OFF),\r
177                                                                           AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_SHIFT)), 0));\r
178 \r
179         // set notify Ctrl icon data\r
180         m_pXkeymacsDll->SetNotifyIconData(CTRL_ICON, notifyIconData[CTRL_ICON], AfxGetApp()->LoadIcon(IDI_CTRL_ON),\r
181                                                                           AfxGetApp()->LoadIcon(IDI_CTRL_OFF),\r
182                                                                           AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CTRL)), 0));\r
183 \r
184         // set notify Alt icon data\r
185         m_pXkeymacsDll->SetNotifyIconData(ALT_ICON, notifyIconData[ALT_ICON], AfxGetApp()->LoadIcon(IDI_ALT_ON),\r
186                                                                           AfxGetApp()->LoadIcon(IDI_ALT_OFF),\r
187                                                                           AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_ALT)), 0));\r
188 \r
189         m_pXkeymacsDll->SetKeyboardSpeed(CProfile::GetKeyboardSpeed());\r
190         m_pXkeymacsDll->SetAccelerate(AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_ACCELERATE)), 1));\r
191 \r
192         m_pXkeymacsDll->SetCursorData((HCURSOR)::LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED),\r
193                                                                   (HCURSOR)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_DISABLE_TMP_CURSOR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED),\r
194                                                                   (HCURSOR)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_DISABLE_WOCQ_CURSOR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED),\r
195                                                                   (HCURSOR)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_DISABLE_CURSOR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED),\r
196                                                                   AfxGetApp()->GetProfileInt(CString(), CString(MAKEINTRESOURCE(IDS_REG_ENTRY_CHANGE_CURSOR)), 0));\r
197 \r
198         m_pXkeymacsDll->SetHooks();\r
199 \r
200         return 0;\r
201 }\r
202 \r
203 /////////////////////////////////////////////////////////////////////////////\r
204 // CMainFrame diagnostics\r
205 \r
206 #ifdef _DEBUG\r
207 void CMainFrame::AssertValid() const\r
208 {\r
209         CFrameWnd::AssertValid();\r
210 }\r
211 \r
212 void CMainFrame::Dump(CDumpContext& dc) const\r
213 {\r
214         CFrameWnd::Dump(dc);\r
215 }\r
216 \r
217 #endif //_DEBUG\r
218 \r
219 /////////////////////////////////////////////////////////////////////////////\r
220 // CMainFrame message handlers\r
221 \r
222 void CMainFrame::SetForegroundTheDialog(CDialog *const pDialog)\r
223 {\r
224         if (pDialog) {\r
225                 pDialog->SetForegroundWindow();\r
226         }\r
227 }\r
228 \r
229 void CMainFrame::SetForegroundSomeDialog()\r
230 {\r
231         CDialog *pDialog = NULL;\r
232 \r
233         if (m_bPropertiesDlgExist) {\r
234                 pDialog = m_pPropertiesDlg;\r
235         } else if (m_bOptionsDlgExist) {\r
236                 pDialog = m_pOptionsDlg;\r
237         } else if (m_bKeyboardDlgExist[ENGLISH_KEYBOARD][CURRENT_USER]) {\r
238                 pDialog = m_p104KeyboardDlg[CURRENT_USER];\r
239         } else if (m_bKeyboardDlgExist[ENGLISH_KEYBOARD][LOCAL_MACHINE]) {\r
240                 pDialog = m_p104KeyboardDlg[LOCAL_MACHINE];\r
241         } else if (m_bKeyboardDlgExist[JAPANESE_KEYBOARD][CURRENT_USER]) {\r
242                 pDialog = m_p109KeyboardDlg[CURRENT_USER];\r
243         } else if (m_bKeyboardDlgExist[JAPANESE_KEYBOARD][LOCAL_MACHINE]) {\r
244                 pDialog = m_p109KeyboardDlg[LOCAL_MACHINE];\r
245         } else if (m_bAboutDlgExist) {\r
246                 pDialog = m_pAboutDlg;\r
247         } else {\r
248                 EnableWindow(FALSE);\r
249                 return;\r
250         }\r
251 \r
252         SetForegroundTheDialog(pDialog);\r
253         return;\r
254 }\r
255 \r
256 void CMainFrame::PopUpDialog(CDialog *const pDialog, int *const pnResultDialog, BOOL *const pbDialogExist)\r
257 {\r
258         if (pDialog                     == NULL\r
259          || pnResultDialog      == NULL\r
260          || pbDialogExist       == NULL) {\r
261                 return;\r
262         }\r
263 \r
264         if (!*pbDialogExist) {\r
265                 *pbDialogExist = TRUE;\r
266                 *pnResultDialog = pDialog->DoModal();\r
267                 *pbDialogExist = FALSE;\r
268                 *pnResultDialog = -1;\r
269 \r
270                 SetForegroundSomeDialog();\r
271         } else {\r
272                 SetForegroundTheDialog(pDialog);\r
273         }\r
274 }\r
275 \r
276 void CMainFrame::PopUpPropertiesDialog()\r
277 {\r
278         PopUpDialog(m_pPropertiesDlg, &m_nResultPropertiesDlg, &m_bPropertiesDlgExist);\r
279 }\r
280 \r
281 // show right menu on icon in system tray\r
282 void CMainFrame::ShowRightMenu(const ICON_TYPE icon)\r
283 {\r
284         CMenu rightMenu;\r
285         rightMenu.LoadMenu(IDR_RIGHT_MENU);\r
286 \r
287         CMenu *popUp = rightMenu.GetSubMenu(0);\r
288 \r
289         if (icon == MAIN_ICON) {\r
290                 popUp->SetDefaultItem(IDC_PROPERTIES);\r
291 \r
292                 CString szDisable(MAKEINTRESOURCE(IDS_ENABLE));\r
293                 if (m_pXkeymacsDll->IsKeyboardHook()) {\r
294                         szDisable.LoadString(IDS_DISABLE);\r
295                 }\r
296                 szDisable += _T("\tCtrl+Q");\r
297                 popUp->ModifyMenu(IDC_DISABLE, MF_STRING, IDC_DISABLE, szDisable);\r
298 \r
299                 TCHAR szUserName[UNLEN + 1] = {'0'};\r
300                 DWORD nSize = UNLEN + 1;\r
301                 if (GetUserName(szUserName, &nSize)) {\r
302                         CString szFor;\r
303                         szFor.Format(IDS_KEYBOARD, szUserName);\r
304                         popUp->ModifyMenu(IDC_KEYBOARD, MF_STRING, IDC_KEYBOARD, szFor);\r
305                 }\r
306 \r
307                 if (CProfile::Is9x()) {\r
308                         popUp->DeleteMenu(IDC_KEYBOARD, MF_BYCOMMAND);\r
309                         popUp->DeleteMenu(IDC_KEYBOARD_ANY_USER, MF_BYCOMMAND);\r
310                 } else if (CProfile::IsVistaOrLater()) {\r
311                         popUp->DeleteMenu(IDC_KEYBOARD_ANY_USER, MF_BYCOMMAND);\r
312                 }\r
313         } else {\r
314                 popUp->SetDefaultItem(IDC_OPTIONS);\r
315 \r
316                 popUp->DeleteMenu(IDC_PROPERTIES, MF_BYCOMMAND);\r
317                 popUp->DeleteMenu(IDC_IMPORT, MF_BYCOMMAND);\r
318                 popUp->DeleteMenu(IDC_EXPORT, MF_BYCOMMAND);\r
319                 popUp->DeleteMenu(IDC_KEYBOARD, MF_BYCOMMAND);\r
320                 popUp->DeleteMenu(IDC_KEYBOARD_ANY_USER, MF_BYCOMMAND);\r
321                 popUp->DeleteMenu(IDC_DISABLE, MF_BYCOMMAND);\r
322                 popUp->DeleteMenu(IDC_RESET, MF_BYCOMMAND);\r
323                 popUp->DeleteMenu(IDC_QUIT, MF_BYCOMMAND);\r
324                 popUp->DeleteMenu(0, MF_BYPOSITION);    // Delete separator\r
325                 popUp->DeleteMenu(1, MF_BYPOSITION);    // Delete separator\r
326                 popUp->DeleteMenu(2, MF_BYPOSITION);    // Delete popup menu of Keyboard Layout\r
327         }\r
328 \r
329         SetForegroundWindow();\r
330 \r
331         CPoint pt;\r
332         GetCursorPos(&pt);\r
333         popUp->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);\r
334 }\r
335 \r
336 // get message of icon on system tray\r
337 LRESULT CMainFrame::WindowProc(const UINT message, const WPARAM wParam, const LPARAM lParam) \r
338 {\r
339         static UINT s_uTaskbarRestart;\r
340 \r
341         switch (message) {\r
342         case WM_CREATE:\r
343                 s_uTaskbarRestart = RegisterWindowMessage(_T("TaskbarCreated"));\r
344                 break;\r
345         case WM_USER_NTFYICON:\r
346                 switch (lParam) {\r
347                 case WM_LBUTTONUP:\r
348                         SetForegroundSomeDialog();\r
349                         break;\r
350                 case WM_LBUTTONDBLCLK:\r
351                         if (wParam == MAIN_ICON) {\r
352                                 PopUpPropertiesDialog();\r
353                         } else {\r
354                                 PopUpOptionsDialog();\r
355                         }\r
356                         break;\r
357                 case WM_RBUTTONUP:\r
358                         ShowRightMenu((ICON_TYPE)wParam);\r
359                         break;\r
360                 default:\r
361                         break;\r
362                 }\r
363         default:\r
364                 if (message == s_uTaskbarRestart) {\r
365                         m_pXkeymacsDll->AddAllShell_NotifyIcon();\r
366                 }\r
367                 break;\r
368         }\r
369         \r
370         return CFrameWnd::WindowProc(message, wParam, lParam);\r
371 }\r
372 \r
373 void CMainFrame::OnProperties()\r
374 {\r
375         PopUpPropertiesDialog();\r
376 }\r
377 \r
378 void CMainFrame::PopUpOptionsDialog()\r
379 {\r
380         PopUpDialog(m_pOptionsDlg, &m_nResultOptionsDlg, &m_bOptionsDlgExist);\r
381 }\r
382 \r
383 void CMainFrame::OnOptions() \r
384 {\r
385         PopUpOptionsDialog();\r
386 }\r
387 \r
388 // stop/start keyboard hook\r
389 void CMainFrame::OnDisable() \r
390 {\r
391         if (m_pXkeymacsDll->IsKeyboardHook()) {\r
392                 m_pXkeymacsDll->SetKeyboardHookFlag(FALSE);\r
393         } else {\r
394                 m_pXkeymacsDll->SetKeyboardHookFlag(TRUE);\r
395         }\r
396 }\r
397 \r
398 // Close the Dialog if it is opened.\r
399 void CMainFrame::CloseDialog(CDialog *const pDialog, int *const pnResult)\r
400 {\r
401         if (*pnResult != -1) {\r
402                 pDialog->EndDialog(*pnResult);\r
403                 *pnResult = -1;\r
404         }\r
405 }\r
406 \r
407 void CMainFrame::OnQuit() \r
408 {\r
409         CloseDialog(m_pAboutDlg, &m_nResultAboutDlg);\r
410         CloseDialog(m_pPropertiesDlg, &m_nResultPropertiesDlg);\r
411         CloseDialog(m_pOptionsDlg, &m_nResultOptionsDlg);\r
412         for (int i = 0; i < MAX_HKEY_TYPE; ++i) {\r
413                 CloseDialog(m_p104KeyboardDlg[i], &m_nResultKeyboardDlg[ENGLISH_KEYBOARD][i]);\r
414                 CloseDialog(m_p109KeyboardDlg[i], &m_nResultKeyboardDlg[JAPANESE_KEYBOARD][i]);\r
415         }\r
416 \r
417         m_pXkeymacsDll->ReleaseHooks();\r
418         m_pXkeymacsDll->DeleteAllShell_NotifyIcon();\r
419 \r
420         PostQuitMessage(0);\r
421 }\r
422 \r
423 void CMainFrame::PopUpAboutDialog()\r
424 {\r
425         PopUpDialog(m_pAboutDlg, &m_nResultAboutDlg, &m_bAboutDlgExist);\r
426 }\r
427 \r
428 void CMainFrame::OnAbout() \r
429 {\r
430         PopUpAboutDialog();\r
431 }\r
432 \r
433 void CMainFrame::OnKeyboard() \r
434 {\r
435         PopUpKeyboardDialog(CURRENT_USER);\r
436 }\r
437 \r
438 void CMainFrame::OnKeyboardAnyUser() \r
439 {\r
440         PopUpKeyboardDialog(LOCAL_MACHINE);\r
441 }\r
442 \r
443 void CMainFrame::PopUpKeyboardDialog(const HKEY_TYPE hkeyType)\r
444 {\r
445         if (CProfile::Is106Keyboard()) {\r
446                 PopUpDialog(m_p109KeyboardDlg[hkeyType], &m_nResultKeyboardDlg[JAPANESE_KEYBOARD][hkeyType], &m_bKeyboardDlgExist[JAPANESE_KEYBOARD][hkeyType]);\r
447         } else {\r
448                 PopUpDialog(m_p104KeyboardDlg[hkeyType], &m_nResultKeyboardDlg[ENGLISH_KEYBOARD][hkeyType], &m_bKeyboardDlgExist[ENGLISH_KEYBOARD][hkeyType]);\r
449         }\r
450 }\r
451 \r
452 void CMainFrame::OnImport() \r
453 {\r
454         CProfile::ImportProperties();\r
455         CProfile::InitDllData();\r
456 }\r
457 \r
458 void CMainFrame::OnExport() \r
459 {\r
460         CProfile::ExportProperties();\r
461 }\r
462 \r
463 void CMainFrame::OnReset() \r
464 {\r
465         m_pXkeymacsDll->ReleaseHooks();\r
466         m_pXkeymacsDll->SetHooks();\r
467 }\r
468 \r
469 void CMainFrame::OnHelpFinder() \r
470 {\r
471         TCHAR szPath[MAX_PATH] = {'\0'};\r
472         const TCHAR szExt[] = _T("txt");\r
473         _tmakepath(szPath, NULL, NULL, CString(MAKEINTRESOURCE(IDS_README)), szExt);\r
474 \r
475         TCHAR szModuleFileName[MAX_PATH] = {'\0'};\r
476         if (GetModuleFileName(NULL, szModuleFileName, sizeof(szModuleFileName))) {\r
477                 TCHAR szDrive[_MAX_DRIVE] = {'\0'};\r
478                 TCHAR szDir[_MAX_DIR] = {'\0'};\r
479                 _tsplitpath(szModuleFileName, szDrive, szDir, NULL, NULL);\r
480                 _tmakepath(szPath, szDrive, szDir, CString(MAKEINTRESOURCE(IDS_README)), szExt);\r
481         }\r
482 \r
483         ShellExecute(NULL, NULL, szPath, NULL, NULL, SW_SHOWNORMAL);\r
484 }\r