// UserManagerDlg.cpp: 实现文件 // #include "stdafx.h" #include "BondEq.h" #include "afxdialogex.h" #include "UserManagerDlg.h" #include "InputDialog.h" #include "NewCellTypes/GridCellCombo.h" #include "NewCellTypes/GridCellNumeric.h" #include const COLORREF CURR_USER_BK_COLOR = RGB(0, 255, 0); // CUserManagerDlg 对话框 IMPLEMENT_DYNAMIC(CUserManagerDlg, CDialogEx) CUserManagerDlg::CUserManagerDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_USER_MANAGER, pParent) { m_nInitialWidth = 0; m_nInitialHeight = 0; } CUserManagerDlg::~CUserManagerDlg() { for (auto& pair : m_mapFonts) { if (pair.second) { pair.second->DeleteObject(); delete pair.second; } } m_mapFonts.clear(); } void CUserManagerDlg::DoDataExchange(CDataExchange* pDX) { DDX_Control(pDX, IDC_CUSTOM_USER, m_gridUserManager); CDialogEx::DoDataExchange(pDX); } void CUserManagerDlg::InitUserManager() { if (m_gridUserManager.GetSafeHwnd() == NULL) return; int nRows = 1; int nCols = 8; int nFixRows = 1; int nFixCols = 0; int nRowIdx = 0; int nColIdx = 0; m_gridUserManager.DeleteAllItems(); m_gridUserManager.SetVirtualMode(FALSE); m_gridUserManager.GetDefaultCell(TRUE, FALSE)->SetBackClr(g_nGridFixCellColor); // 设置固定行背景色 m_gridUserManager.GetDefaultCell(FALSE, TRUE)->SetBackClr(g_nGridFixCellColor); // 设置固定列背景色 m_gridUserManager.GetDefaultCell(FALSE, FALSE)->SetBackClr(g_nGridCellColor); // 设置单元格背景色 m_gridUserManager.SetFixedTextColor(g_nGridFixFontColor); // 设置固定行列字体颜色 m_gridUserManager.SetRowCount(nRows); m_gridUserManager.SetColumnCount(nCols); m_gridUserManager.SetFixedRowCount(nFixRows); m_gridUserManager.SetFixedColumnCount(nFixCols); // Col m_gridUserManager.SetColumnWidth(nColIdx, 20); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("No.")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("用户名")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("密码")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("权限")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("会话超时(分钟)")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("会话过期(小时)")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("最后一次登录时间")); m_gridUserManager.SetColumnWidth(nColIdx, 100); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("角色描述")); m_gridUserManager.SetFixedRowSelection(FALSE); m_gridUserManager.SetFixedColumnSelection(FALSE); m_gridUserManager.SetEditable(TRUE); m_gridUserManager.SetRowResize(FALSE); m_gridUserManager.SetColumnResize(TRUE); m_gridUserManager.ExpandColumnsToFit(TRUE); m_gridUserManager.SetListMode(TRUE); // 启用列表模式 m_gridUserManager.EnableSelection(TRUE); // 启用选择 m_gridUserManager.SetSingleRowSelection(TRUE); // 自动整行高亮(限制为单行选择) m_gridUserManager.ExpandLastColumn(); // 最后一列填充网格 m_mapRoleDescriptions.clear(); m_mapRoleDescriptions.emplace(_T("管理员"), _T("管理所有用户,分配权限")); m_mapRoleDescriptions.emplace(_T("工程师"), _T("维护系统,解决技术问题")); m_mapRoleDescriptions.emplace(_T("操作员"), _T("执行日常操作任务")); FillUserManager(); } void CUserManagerDlg::FillUserManager() { UserManager& userManager = UserManager::getInstance(); if (!userManager.isLoggedIn()) { AfxMessageBox(_T("未登录")); return; } if (userManager.getCurrentUserRole() != UserRole::SuperAdmin) { AfxMessageBox(_T("非管理员用户")); return; } int nCurrNameRow = -1; std::vector> usersData = userManager.getUsers(); if (!usersData.empty()) { m_gridUserManager.SetRowCount(usersData.size() + 1); for (int i = 0; i < usersData.size(); i++) { int nRowIdx = i + 1; int nColIdx = 0; m_gridUserManager.SetItemText(nRowIdx, nColIdx++, std::to_string(i + 1).c_str()); for (int j = 0; j < usersData[i].size(); j++) { if (usersData[i][1].empty()) { continue; } m_gridUserManager.SetItemText(nRowIdx, nColIdx++, usersData[i][j].c_str()); } // 当前登录用户高亮 if (nCurrNameRow == -1 && usersData[i][0] == userManager.getCurrentUser()) { nCurrNameRow = nRowIdx; } } } CStringArray permissions; permissions.Add(_T("管理员")); permissions.Add(_T("工程师")); permissions.Add(_T("操作员")); int nCols = m_gridUserManager.GetColumnCount(); for (int i = 1; i < m_gridUserManager.GetRowCount(); ++i) { m_gridUserManager.SetItemState(i, 0, GVIS_READONLY); // 第一列只读 m_gridUserManager.SetItemState(i, nCols - 2, GVIS_READONLY); // 倒数第二列只读 m_gridUserManager.SetItemState(i, nCols - 1, GVIS_READONLY); // 最后一列只读 // 第四列设置权限列为下拉框 if (m_gridUserManager.SetCellType(i, 3, RUNTIME_CLASS(CGridCellCombo))) { CGridCellCombo* pCell = static_cast(m_gridUserManager.GetCell(i, 3)); pCell->SetOptions(permissions); pCell->SetStyle(CBS_DROPDOWNLIST); CString cstrRole = m_gridUserManager.GetItemText(i, 3); int nRole = _ttoi(cstrRole); if (nRole < 0 || nRole > 2) { CString cstrMessage; cstrMessage.Format(_T("用户 [%s],权限异常!将设置成操作员!"), m_gridUserManager.GetItemText(i, 1)); AfxMessageBox(cstrMessage); nRole = 2; } m_gridUserManager.SetItemText(i, 3, permissions.GetAt(nRole)); auto it = m_mapRoleDescriptions.find(permissions.GetAt(nRole)); if (it != m_mapRoleDescriptions.end()) { m_gridUserManager.SetItemText(i, 7, it->second); } } // 第五、六列(会话超时)设置为Numeric //m_gridUserManager.SetCellType(i, 4, RUNTIME_CLASS(CGridCellNumeric)); //m_gridUserManager.SetCellType(i, 5, RUNTIME_CLASS(CGridCellNumeric)); m_gridUserManager.SetItemState(i, 4, GVIS_READONLY); // 第五列只读 m_gridUserManager.SetItemState(i, 5, GVIS_READONLY); // 第六列只读 m_gridUserManager.ExpandColumnsToFit(FALSE); m_gridUserManager.ExpandLastColumn(); } for (int i = 0; i < nCols; i++) { m_gridUserManager.SetItemBkColour(nCurrNameRow, i, CURR_USER_BK_COLOR); } m_gridUserManager.SetItemState(nCurrNameRow, 3, GVIS_READONLY); m_gridUserManager.Invalidate(); m_gridUserManager.UpdateWindow(); } void CUserManagerDlg::AddRow(CGridCtrl* pGridCtrl) { if (!pGridCtrl) return; if (pGridCtrl->GetRowCount() <= 0 || pGridCtrl->GetColumnCount() <= 0) { AfxMessageBox(_T("网格控件未正确初始化,请检查初始化逻辑!")); return; } CInputDialog inputDialog(_T("添加用户"), _T("请输入用户名:")); if (inputDialog.DoModal() != IDOK) { return; } CString inputText = inputDialog.GetInputText(); if (inputText.IsEmpty()) { AfxMessageBox(_T("用户名不能为空!")); return; } if (IsUsernameDuplicate(inputText)) { AfxMessageBox(_T("用户名重复!")); return; } int nRowCount = pGridCtrl->GetRowCount(); pGridCtrl->SetRowCount(nRowCount + 1); int newRowIndex = nRowCount; CString strText; strText.Format(_T("%d"), newRowIndex); pGridCtrl->SetItemText(newRowIndex, 0, strText); pGridCtrl->SetItemText(newRowIndex, 1, inputText); pGridCtrl->SetItemText(newRowIndex, 2, _T("123456")); pGridCtrl->SetItemText(newRowIndex, 3, _T("操作员")); pGridCtrl->SetItemText(newRowIndex, 4, _T("30")); pGridCtrl->SetItemText(newRowIndex, 5, _T("72")); pGridCtrl->SetItemText(newRowIndex, 6, _T("2024-01-01 00:00:00")); auto it = m_mapRoleDescriptions.find(_T("操作员")); if (it != m_mapRoleDescriptions.end()) { pGridCtrl->SetItemText(newRowIndex, 7, it->second); } int nCols = pGridCtrl->GetColumnCount(); pGridCtrl->SetItemState(newRowIndex, 0, GVIS_READONLY); // 第一列只读 pGridCtrl->SetItemState(newRowIndex, nCols - 2, GVIS_READONLY); // 倒数第二列只读 pGridCtrl->SetItemState(newRowIndex, nCols - 1, GVIS_READONLY); // 最后一列只读 // 第四列设置(权限列)为下拉框 CStringArray permissions; permissions.Add(_T("管理员")); permissions.Add(_T("工程师")); permissions.Add(_T("操作员")); if (pGridCtrl->SetCellType(newRowIndex, 3, RUNTIME_CLASS(CGridCellCombo))) { CGridCellCombo* pCell = static_cast(pGridCtrl->GetCell(newRowIndex, 3)); pCell->SetOptions(permissions); pCell->SetStyle(CBS_DROPDOWNLIST); pGridCtrl->SetItemText(newRowIndex, 3, permissions.GetAt(2)); } // 第五、六列(会话超时)设置为Numeric //pGridCtrl->SetCellType(newRowIndex, 4, RUNTIME_CLASS(CGridCellNumeric)); //pGridCtrl->SetCellType(newRowIndex, 5, RUNTIME_CLASS(CGridCellNumeric)); pGridCtrl->SetItemState(newRowIndex, 4, GVIS_READONLY); // 第五列只读 pGridCtrl->SetItemState(newRowIndex, 5, GVIS_READONLY); // 第六列只读 pGridCtrl->ExpandColumnsToFit(FALSE); pGridCtrl->ExpandLastColumn(); pGridCtrl->Invalidate(); pGridCtrl->UpdateWindow(); CString cstrMessage; cstrMessage.Format(_T("预添加用户 [%s]!"), inputText); std::string strMessage = CT2A(cstrMessage); SystemLogManager::getInstance().log(SystemLogManager::LogType::Operation, strMessage); } void CUserManagerDlg::DeleteSelectedRow(CGridCtrl* pGridCtrl) { if (!pGridCtrl) return; CCellRange selectedRange = pGridCtrl->GetSelectedCellRange(); if (selectedRange.IsValid()) { CString currentUser = UserManager::getInstance().getCurrentUser().c_str(); std::vector rowsToDelete; for (int row = selectedRange.GetMinRow(); row <= selectedRange.GetMaxRow(); ++row) { BOOL isRowSelected = FALSE; for (int col = selectedRange.GetMinCol(); col <= selectedRange.GetMaxCol(); ++col) { if (pGridCtrl->IsCellSelected(row, col)) { isRowSelected = TRUE; break; } } if (!isRowSelected) { continue; } CString selectedUser = pGridCtrl->GetItemText(row, 1); if (selectedUser == currentUser) { CString message; message.Format(_T("用户 [%s] 是当前登录用户,不能删除!"), currentUser); AfxMessageBox(message); return; } rowsToDelete.push_back(row); } if (rowsToDelete.empty()) { AfxMessageBox(_T("请先选择要删除的行!")); return; } CString message; if (rowsToDelete.size() == 1) { CString selectedUser = pGridCtrl->GetItemText(rowsToDelete[0], 1); message.Format(_T("确定要删除选中用户 [%s] 吗?"), selectedUser); CString cstrMessage; cstrMessage.Format(_T("预删除用户 [%s]!"), selectedUser); std::string strMessage = CT2A(cstrMessage); SystemLogManager::getInstance().log(SystemLogManager::LogType::Operation, strMessage); } else { message.Format(_T("确定要删除选中的 %d 个用户吗?"), rowsToDelete.size()); } if (AfxMessageBox(message, MB_YESNO | MB_ICONQUESTION) == IDYES) { for (auto it = rowsToDelete.rbegin(); it != rowsToDelete.rend(); ++it) { pGridCtrl->DeleteRow(*it); } pGridCtrl->ExpandColumnsToFit(FALSE); pGridCtrl->ExpandLastColumn(); pGridCtrl->Invalidate(); pGridCtrl->UpdateWindow(); } } else { AfxMessageBox(_T("请先选择要删除的用户!")); } } bool CUserManagerDlg::IsUsernameDuplicate(const CString& username) { for (int row = 1; row < m_gridUserManager.GetRowCount(); ++row) { if (m_gridUserManager.GetItemText(row, 1) == username) { return true; } } return false; } CFont* CUserManagerDlg::GetOrCreateFont(int nFontSize) { auto it = m_mapFonts.find(nFontSize); if (it != m_mapFonts.end()) { return it->second; } CFont* font = new CFont(); LOGFONT logFont = { 0 }; _tcscpy_s(logFont.lfFaceName, _T("Segoe UI")); logFont.lfHeight = -nFontSize; logFont.lfQuality = CLEARTYPE_QUALITY; font->CreateFontIndirect(&logFont); m_mapFonts[nFontSize] = font; return font; } void CUserManagerDlg::SetDefaultFont() { CFont* defaultFont = GetOrCreateFont(12); // 遍历所有控件,应用默认字体 CWnd* pWnd = GetWindow(GW_CHILD); while (pWnd) { // 跳过特殊控件(如 MFCGridCtrl) TCHAR szClassName[256]; GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName)); if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) { pWnd = pWnd->GetNextWindow(); continue; } pWnd->SetFont(defaultFont, TRUE); pWnd = pWnd->GetNextWindow(); } } void CUserManagerDlg::AdjustControls(float dScaleX, float dScaleY) { CWnd* pWnd = GetWindow(GW_CHILD); while (pWnd) { int nCtrlID = pWnd->GetDlgCtrlID(); if (nCtrlID != -1 && m_mapCtrlLayouts.find(nCtrlID) != m_mapCtrlLayouts.end()) { CRect originalRect = m_mapCtrlLayouts[nCtrlID]; CRect newRect( static_cast(originalRect.left * dScaleX), static_cast(originalRect.top * dScaleY), static_cast(originalRect.right * dScaleX), static_cast(originalRect.bottom * dScaleY)); TCHAR szClassName[256]; GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName)); if (_tcsicmp(szClassName, _T("ComboBox")) == 0) { CComboBox* pComboBox = (CComboBox*)pWnd; pComboBox->SetItemHeight(-1, newRect.Height()); // -1 表示所有项的高度 } if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) { CGridCtrl* pGridCtrl = (CGridCtrl*)pWnd; pGridCtrl->SetDefCellHeight(newRect.Height() / 21); pGridCtrl->ExpandColumnsToFit(TRUE); pGridCtrl->ExpandLastColumn(); pGridCtrl->Invalidate(); pGridCtrl->UpdateWindow(); } pWnd->MoveWindow(&newRect); AdjustControlFont(pWnd, newRect.Width(), newRect.Height()); } pWnd = pWnd->GetNextWindow(); } } void CUserManagerDlg::AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight) { TCHAR szClassName[256]; GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName)); // 跳过特殊控件(如 MFCGridCtrl) if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) { return; } // 根据控件高度动态调整字体大小 int fontSize = nHeight / 2; if (fontSize < 8) fontSize = 8; // 获取或创建字体 CFont* pFont = GetOrCreateFont(fontSize); pWnd->SetFont(pFont); pWnd->Invalidate(); // 刷新控件显示 } BEGIN_MESSAGE_MAP(CUserManagerDlg, CDialogEx) ON_WM_SIZE() ON_NOTIFY(GVN_COMBOSELCHANGE, IDC_CUSTOM_USER, &CUserManagerDlg::OnGridComboSelChange) ON_BN_CLICKED(IDC_BUTTON_ADD, &CUserManagerDlg::OnBnClickedButtonAdd) ON_BN_CLICKED(IDC_BUTTON_DEL, &CUserManagerDlg::OnBnClickedButtonDel) ON_BN_CLICKED(IDOK, &CUserManagerDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON_INSERT, &CUserManagerDlg::OnBnClickedButtonInsert) ON_WM_GETMINMAXINFO() END_MESSAGE_MAP() // CUserManagerDlg 消息处理程序 BOOL CUserManagerDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 CRect screenRect, dlgRect, clientRect; SetWindowText(_T("用户管理")); SystemParametersInfo(SPI_GETWORKAREA, 0, &screenRect, 0); GetClientRect(&clientRect); m_nInitialWidth = clientRect.Width(); m_nInitialHeight = clientRect.Height(); // 初始化默认字体 CFont* pDefaultFont = GetOrCreateFont(12); // 遍历所有子控件,记录初始位置并设置默认字体 CWnd* pWnd = GetWindow(GW_CHILD); while (pWnd) { int nCtrlID = pWnd->GetDlgCtrlID(); if (nCtrlID != -1) { // 记录控件初始布局 CRect ctrlRect; pWnd->GetWindowRect(&ctrlRect); ScreenToClient(&ctrlRect); m_mapCtrlLayouts[nCtrlID] = ctrlRect; // 跳过特殊控件(如 MFCGridCtrl) TCHAR szClassName[256]; GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName)); if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) { pWnd = pWnd->GetNextWindow(); continue; } // 设置默认字体 pWnd->SetFont(pDefaultFont); } pWnd = pWnd->GetNextWindow(); } GetWindowRect(&dlgRect); int dlgWidth = dlgRect.Width() * 3; int dlgHeight = dlgRect.Height() * 3; if (dlgWidth > screenRect.Width()) { dlgWidth = screenRect.Width(); } if (dlgHeight > screenRect.Height()) { dlgHeight = screenRect.Height(); } int centerX = screenRect.left + (screenRect.Width() - dlgWidth) / 2; int centerY = screenRect.top + (screenRect.Height() - dlgHeight) / 2; MoveWindow(centerX, centerY, dlgWidth, dlgHeight); // 初始化用户管理表格 InitUserManager(); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CUserManagerDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 if (nType == SIZE_MINIMIZED || m_mapCtrlLayouts.empty()) { return; } float dScaleX = static_cast(cx) / m_nInitialWidth; float dScaleY = static_cast(cy) / m_nInitialHeight; // 遍历对话框中的所有控件 AdjustControls(dScaleX, dScaleY); } void CUserManagerDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { // TODO: 在此添加消息处理程序代码和/或调用默认值 lpMMI->ptMinTrackSize.x = 400; // 最小宽度 lpMMI->ptMinTrackSize.y = 300; // 最小高度 CDialogEx::OnGetMinMaxInfo(lpMMI); } void CUserManagerDlg::OnGridComboSelChange(NMHDR* pNMHDR, LRESULT* pResult) { NM_GRIDVIEW* pItem = (NM_GRIDVIEW*)pNMHDR; int nRow = pItem->iRow; int nCol = pItem->iColumn; // 第4列为权限列, 第8列为角色描述列, 从映射中查找对应描述 if (nCol == 3) { if (m_gridUserManager.GetItemBkColour(nRow, nCol) == CURR_USER_BK_COLOR) { AfxMessageBox(_T("当前登录用户权限不能修改!")); } else { CString selectedRole = m_gridUserManager.GetItemText(nRow, nCol); auto it = m_mapRoleDescriptions.find(selectedRole); if (it != m_mapRoleDescriptions.end()) { m_gridUserManager.SetItemText(nRow, 7, it->second); m_gridUserManager.RedrawCell(nRow, 7); } else { m_gridUserManager.SetItemText(nRow, 7, _T("")); m_gridUserManager.RedrawCell(nRow, 7); } } } *pResult = 0; } void CUserManagerDlg::OnBnClickedButtonAdd() { // TODO: 在此添加控件通知处理程序代码 AddRow(&m_gridUserManager); } void CUserManagerDlg::OnBnClickedButtonInsert() { // TODO: 在此添加控件通知处理程序代码 if (!m_gridUserManager.GetSafeHwnd()) return; CCellRange selectedRange = m_gridUserManager.GetSelectedCellRange(); if (!selectedRange.IsValid()) { AfxMessageBox(_T("请先选择要插入的位置!")); return; } int minRow = selectedRange.GetMinRow(); int maxRow = selectedRange.GetMaxRow(); if (minRow < 1) { AfxMessageBox(_T("请选择有效的行!")); return; } for (int row = maxRow; row >= minRow; --row) { std::vector rowData; for (int col = 0; col < m_gridUserManager.GetColumnCount(); ++col) { rowData.push_back(m_gridUserManager.GetItemText(row, col)); } m_gridUserManager.InsertRow(_T("新用户"), row); CString newUsername = rowData[1]; int suffix = 1; while (IsUsernameDuplicate(newUsername)) { newUsername.Format(_T("%s_%d"), rowData[1], suffix++); } rowData[1] = newUsername; for (int col = 0; col < m_gridUserManager.GetColumnCount(); ++col) { m_gridUserManager.SetItemText(row, col, rowData[col]); } CStringArray permissions; permissions.Add(_T("管理员")); permissions.Add(_T("工程师")); permissions.Add(_T("操作员")); if (m_gridUserManager.SetCellType(row, 3, RUNTIME_CLASS(CGridCellCombo))) { CGridCellCombo* pCell = static_cast(m_gridUserManager.GetCell(row, 3)); pCell->SetOptions(permissions); pCell->SetStyle(CBS_DROPDOWNLIST); m_gridUserManager.SetItemText(row, 3, rowData[3]); } m_gridUserManager.SetCellType(row, 4, RUNTIME_CLASS(CGridCellNumeric)); m_gridUserManager.SetCellType(row, 5, RUNTIME_CLASS(CGridCellNumeric)); } for (int row = 1; row < m_gridUserManager.GetRowCount(); ++row) { CString strIndex; strIndex.Format(_T("%d"), row); m_gridUserManager.SetItemText(row, 0, strIndex); } m_gridUserManager.Invalidate(); m_gridUserManager.UpdateWindow(); } void CUserManagerDlg::OnBnClickedButtonDel() { // TODO: 在此添加控件通知处理程序代码 DeleteSelectedRow(&m_gridUserManager); } void CUserManagerDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 std::vector> vecData; std::set usernameSet; // 用于存储用户名,检查是否重复 int nCurrUserRow = -1; UserManager& userManager = UserManager::getInstance(); for (int i = 1; i < m_gridUserManager.GetRowCount(); ++i) { std::vector rowData; CString cellText = m_gridUserManager.GetItemText(i, 1); std::string username = CT2A(cellText.GetString()); cellText = m_gridUserManager.GetItemText(i, 2); std::string userpass = CT2A(cellText.GetString()); if (username.empty() || userpass.empty()) { AfxMessageBox(_T("用户名和密码不能为空!")); return; } if (usernameSet.find(username) != usernameSet.end()) { CString message; message.Format(_T("用户名 [%s] 重复,请修改后保存!"), cellText); AfxMessageBox(message, MB_ICONEXCLAMATION); return; } usernameSet.insert(username); if (nCurrUserRow == -1 && m_gridUserManager.GetItemBkColour(i, 0) == CURR_USER_BK_COLOR){ nCurrUserRow = i; if (username.compare(userManager.getCurrentUser()) != 0) { userManager.setCurrentUser(username); } if (userpass.compare(userManager.getCurrentPass()) != 0) { userManager.setCurrentPass(userpass); } userManager.clearSession(); userManager.saveSession(); } for (int j = 1; j < m_gridUserManager.GetColumnCount() - 1; ++j) { CString cellText = m_gridUserManager.GetItemText(i, j); std::string cellString = CT2A(cellText.GetString()); // 第4列是权限,转换为数字字符串 if (j == 3) { if (cellText == _T("管理员")) cellString = "0"; else if (cellText == _T("工程师")) cellString = "1"; else if (cellText == _T("操作员")) cellString = "2"; else cellString = "2"; } rowData.push_back(cellString); } vecData.push_back(rowData); } userManager.setUsers(vecData); CDialogEx::OnOK(); }