/////////////////////////////////////////////////////////////////////////////// // Handles events at the window (both hot key and from the tray icon) LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: g_uTaskbarRestart = RegisterWindowMessage(L"TaskbarCreated"); AddTrayIcon(hWnd, 0, APPWM_TRAYICON, IDI_MAINFRAME, TITLE); return 0; case APPWM_TRAYICON: return OnTrayIcon(hWnd, wParam, lParam); case WM_COMMAND: return OnCommand(hWnd, LOWORD(wParam), (HWND)lParam); case WM_CLOSE: DestroyWindow(hWnd); return 0; case WM_DESTROY: RemoveTrayIcon(hWnd, 0); PostQuitMessage(0); return 0; default: if(uMsg == g_uTaskbarRestart) { AddTrayIcon(hWnd, 0, APPWM_TRAYICON, IDI_MAINFRAME, TITLE); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 大小改变 VOID CMainWnd::OnSize(WPARAM wParam, LPARAM lParam) { if (wParam == SIZE_MINIMIZED) { if (IsMenuChecked(IDM_View_MinToTray)) { // 添加系统托盘图标,隐藏主窗口 OnTrayIcon(); } } else { MoveWindow(CClientWnd::m_hWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); _ExIf(CClientWnd::IsScrabble(), CClientWnd::Scrabble()); } }
LRESULT CView::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { // This function is our message procedure. We process the messages for // the view window here. Unprocessed messages are passed on for // default processing. switch(uMsg) { case WM_SIZE: return OnSize(); case WM_SYSCOMMAND: return OnSysCommand(wParam, lParam); case MSG_TRAYICON: return OnTrayIcon(wParam, lParam); } // pass unhandled messages on for default processing return WndProcDefault(uMsg, wParam, lParam); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 回调函数 LRESULT CALLBACK CMainWnd::MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CChildWnd *pWnd; TCHAR tzTemp[MAX_PATH]; switch (uMsg) { case WM_CREATE: // 窗口被创建 m_hWnd = hWnd; m_hMenu = GetMenu(m_hWnd); OnCreate(); break; case WM_SIZE: // 尺寸改变 OnSize(wParam, lParam); return 0; case WM_WINDOWPOSCHANGED: // 位置改变 for (pWnd = CChildWnd::m_pHead; pWnd; pWnd = pWnd->m_pNext) { if (pWnd->m_hWnd) { pWnd->SetDrawRect(); } } break; case WM_INITMENUPOPUP: // 弹出菜单初始化 OnMenuPopup(wParam, lParam); break; case WM_MENUSELECT: // 菜单项被选择 OnMenuSelect(LOWORD(wParam)); break; case WM_EXITMENULOOP: // 退出菜单循环 CClientWnd::SetStatusText(LNG_Ready); break; case WM_COMMAND: // 命令处理 OnCommand(wParam, lParam); break; case WM_COPYDATA: // 本程序的其它实例通知打开文件 if (((PCOPYDATASTRUCT) lParam)->dwData == IDM_File_Open) { static TCHAR s_tzFileName[MAX_PATH]; lstrcpyn(s_tzFileName, (PTSTR) ((PCOPYDATASTRUCT) lParam)->lpData, MAX_PATH); PostMessage(m_hWnd, WM_COMMAND, IDM_File_Open, (LPARAM) s_tzFileName); } break; case WM_HOTKEY: // 热键消息 if ((m_hWnd != GetForegroundWindow()) && (wParam == IDC_TrayIcon)) { OnTrayIcon(FALSE); } break; case WM_DROPFILES: // 拖动文件 DragQueryFile((HDROP) wParam, 0, tzTemp, MAX_PATH); DragFinish((HDROP) wParam); OnFileOpen(tzTemp); break; case WM_HELP: // 帮助 OnCommand(IDM_Help_Content); break; case WM_DESTROY: // 窗口被销毁 OnDestroy(); break; } return DefFrameProc(hWnd, CClientWnd::m_hWnd, uMsg, wParam, lParam); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 命令处理 VOID CMainWnd::OnCommand(WPARAM wParam, LPARAM lParam) { PTSTR p; DWORD dwSize; CChildWnd *pWnd; TCHAR tzTemp[512]; TCHAR tzPath[512]; if ((LOWORD(wParam) >= IDM_View_Default) && (LOWORD(wParam) < IDM_View_Default + 50)) { // 改变语言 if (IsMenuChecked(LOWORD(wParam)) == FALSE) { OnViewLanguage(LOWORD(wParam)); } return; } else if ((LOWORD(wParam) >= IDM_File_Recent) && (LOWORD(wParam) < IDM_File_Recent + 10)) { // 打开新近文件 GetMenuString(m_hMenu, LOWORD(wParam), tzTemp, _NumOf(tzTemp), MF_BYCOMMAND); OnFileOpen(tzTemp + 4); return; } switch (LOWORD(wParam)) { case IDM_File_Open: OnFileOpen((PTSTR) lParam); break; case IDM_File_Exit: PostMessage(m_hWnd, WM_CLOSE, 0, 0); break; case IDM_View_Toolbar: case IDM_View_StatusBar: case IDM_View_AlwaysOnTop: case IDM_View_MinToTray: case IDM_View_ShowSplash: case IDM_View_ShowOpen: case IDM_View_PlayOnOpen: // 查看选项 OnViewMenu(LOWORD(wParam), FALSE); break; case IDM_View_AssociateFile: GetModuleFileName(NULL, tzPath, MAX_PATH); wsprintf(tzTemp, TEXT("\"%s\" \"%%1\""), tzPath); dwSize = _NumOf(tzPath); SHGetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\shell\\open\\command"), NULL, NULL, tzPath, &dwSize); if (lstrcmpi(tzTemp, tzPath) == 0) { SHDeleteKey(HKEY_CLASSES_ROOT, STR_AppName); for (p = STR_ExtList; *p; p += lstrlen(p) + 1) { SHDeleteKey(HKEY_CLASSES_ROOT, p); } } else { SHSetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\shell\\open\\command"), NULL, REG_SZ, tzTemp, _StrSize(tzTemp)); GetModuleFileName(NULL, tzPath, MAX_PATH); wsprintf(tzTemp, TEXT("\"%s\",1"), tzPath); SHSetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\DefaultIcon"), NULL, REG_SZ, tzTemp, _StrSize(tzTemp)); for (p = STR_ExtList; *p; p += lstrlen(p) + 1) { SHSetValue(HKEY_CLASSES_ROOT, p, NULL, REG_SZ, STR_AppName, sizeof(STR_AppName)); } } break; case IDM_Window_Cascade: SendMessage(CClientWnd::m_hWnd, WM_MDICASCADE, 0, 0); return; case IDM_Window_TitleHorz: SendMessage(CClientWnd::m_hWnd, WM_MDITILE, MDITILE_HORIZONTAL, 0); break; case IDM_Window_TitleVert: SendMessage(CClientWnd::m_hWnd, WM_MDITILE, MDITILE_VERTICAL, 0); break; case IDM_Window_ArrangeIcons: SendMessage(CClientWnd::m_hWnd, WM_MDIICONARRANGE, 0, 0); break; case IDM_Window_CloseAll: CClientWnd::CloseAll(); break; case IDM_Help_Content: // 查看帮助内容 GetModuleFileName(NULL, tzTemp, MAX_PATH); lstrcpy(_StrEnd(tzTemp) - _LenOf(EXT_Chm), EXT_Chm); if (ShellExecute(NULL, NULL, tzTemp, NULL, NULL, SW_SHOW) <= (HINSTANCE) 32) { ErrorBox(ERR_HelpErr); } break; case IDM_Help_Desktop: case IDM_Help_StartMenu: case IDM_Help_ProgramMenu: case IDM_Help_QuickLaunch: case IDM_Help_VisualStudio: // 创建或删除快捷方式 OnHelpShortcut(LOWORD(wParam)); break; case IDM_Help_About: // 显示关于对话框 CAboutDlg::Show(m_hWnd); break; case IDC_TrayIcon: // 系统托盘消息 if ((lParam == WM_LBUTTONUP) || (lParam == WM_RBUTTONUP)) { OnTrayIcon(FALSE); } break; default: pWnd = CClientWnd::GetChildWnd(); _ExIf(pWnd, pWnd->OnCommand(wParam, lParam)); } }