mrDarker
2025-10-22 e8a27bb203fe2aff70390a5eca002d7438da9b0f
SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
@@ -17,6 +17,7 @@
#define DeviceID 0
// 托盘图标 ID 与消息宏
#define ID_TRAY_OPEN_DIR      2000            // 打开目录
#define ID_TRAY_RESTORE         2001            // 恢复窗口
#define ID_TRAY_EXIT         2002            // 退出程序
#define WM_TRAY_ICON_NOTIFY    (WM_USER + 1000) // 托盘图标回调消息 ID
@@ -416,19 +417,34 @@
   strAppName = strAppName.Left(strAppName.ReverseFind('.'));
   HKEY hKey;
   LONG lRet = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_WRITE, &hKey);
   LONG lRet = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_READ | KEY_WRITE, &hKey);
   if (lRet != ERROR_SUCCESS) { 
      return false;
   }
   DWORD dwType = 0;
   TCHAR szValue[MAX_PATH] = { 0 };
   DWORD dwSize = sizeof(szValue);
   lRet = RegQueryValueEx(hKey, strAppName, 0, &dwType, (LPBYTE)szValue, &dwSize);
   if (bEnable) {
      // 设置自启
      lRet = RegSetValueEx(hKey, strAppName, 0, REG_SZ, (BYTE*)(LPCTSTR)strAppPath, (strAppPath.GetLength() + 1) * sizeof(TCHAR));
      if (lRet != ERROR_SUCCESS || _tcsicmp(szValue, strAppPath) != 0) {
         // 设置自启
         lRet = RegSetValueEx(hKey, strAppName, 0, REG_SZ, (BYTE*)(LPCTSTR)strAppPath, (strAppPath.GetLength() + 1) * sizeof(TCHAR));
      }
      else {
         lRet = ERROR_SUCCESS;
      }
   }
   else {
      // 取消自启
      lRet = RegDeleteValue(hKey, strAppName);
      if (lRet == ERROR_SUCCESS) {
         // 取消自启
         lRet = RegDeleteValue(hKey, strAppName);
      }
      else {
         lRet = ERROR_SUCCESS;
      }
   }
   RegCloseKey(hKey);
@@ -947,6 +963,7 @@
   ON_WM_DRAWITEM()
   ON_WM_CLOSE()
   ON_MESSAGE(WM_TRAY_ICON_NOTIFY, &CSGMeasurementDlg::OnTrayIconClick)
   ON_COMMAND(ID_TRAY_OPEN_DIR, &CSGMeasurementDlg::OnTrayOpenDir)
   ON_COMMAND(ID_TRAY_RESTORE, &CSGMeasurementDlg::OnTrayRestore)
   ON_COMMAND(ID_TRAY_EXIT, &CSGMeasurementDlg::OnTrayExit)
   ON_BN_CLICKED(IDC_BUTTON_CONNECT, &CSGMeasurementDlg::OnBnClickedButtonConnect)
@@ -1206,6 +1223,10 @@
   // 图标
   HICON hIcon = nullptr;
   if (id == ID_TRAY_OPEN_DIR) {
      hIcon = AfxGetApp()->LoadIcon(IDI_ICON_OPEN_DIR);
   }
   if (id == ID_TRAY_RESTORE) {
      hIcon = AfxGetApp()->LoadIcon(IDI_ICON_RESTORE);
   }
@@ -1220,6 +1241,10 @@
   // 文本
   CString str;
   if (id == ID_TRAY_OPEN_DIR) {
      str = _T("打开目录");
   }
   if (id == ID_TRAY_RESTORE) { 
      str = _T("恢复界面");
   }
@@ -1263,22 +1288,23 @@
         // 右键点击弹出菜单
         CMenu menu;
         menu.CreatePopupMenu();
         menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_OPEN_DIR, (LPCTSTR)ID_TRAY_OPEN_DIR);
         menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_RESTORE, (LPCTSTR)ID_TRAY_RESTORE);
         menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_EXIT, (LPCTSTR)ID_TRAY_EXIT);
         // 加载图标
         HICON hIconRestore = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_RESTORE), IMAGE_ICON, 16, 16, LR_SHARED);
         HICON hIconExit = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_EXIT), IMAGE_ICON, 16, 16, LR_SHARED);
         // 设置图标到菜单项
         MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
         mii.fMask = MIIM_BITMAP;
         // 恢复菜单项图标
         // 打开目录菜单项图标
         mii.hbmpItem = HBMMENU_CALLBACK;
         menu.SetMenuItemInfo(ID_TRAY_OPEN_DIR, &mii);
         // 恢复窗口菜单项图标
         mii.hbmpItem = HBMMENU_CALLBACK;
         menu.SetMenuItemInfo(ID_TRAY_RESTORE, &mii);
         // 退出菜单项图标
         // 退出程序菜单项图标
         mii.hbmpItem = HBMMENU_CALLBACK;
         menu.SetMenuItemInfo(ID_TRAY_EXIT, &mii);
@@ -1292,6 +1318,18 @@
   return 0;
}
void CSGMeasurementDlg::OnTrayOpenDir()
{
   CString strDir = GetAppDirectory();
   if (PathFileExists(strDir)) {
      ShellExecute(NULL, _T("open"), strDir, NULL, NULL, SW_SHOWDEFAULT);
      AppendLogLineRichStyled(_T("已打开程序目录"), LOG_COLOR_SUCCESS);
   }
   else {
      AppendLogLineRichStyled(_T("目录不存在,无法打开"), LOG_COLOR_ERROR);
   }
}
void CSGMeasurementDlg::OnTrayRestore()
{
   ShowWindow(SW_SHOW);     // 恢复窗口