| | |
| | | #include "Servo.h" |
| | | #include "afxdialogex.h" |
| | | #include "PageRecipe.h" |
| | | #include "MsgDlg.h" |
| | | #include "RecipeDeviceBindDlg.h" |
| | | |
| | | // CPageRecipe 对话框 |
| | | |
| | |
| | | { |
| | | } |
| | | |
| | | void CPageRecipe::UpdateRecipeByPPID(const CString& strPPID) |
| | | { |
| | | if (strPPID.IsEmpty()) { |
| | | AfxMessageBox(_T("请选择一个配方!")); |
| | | return; |
| | | } |
| | | |
| | | auto& mgr = RecipeManager::getInstance(); |
| | | |
| | | // 查询选中配方的详细数据 |
| | | std::string oldPPID = CT2A(strPPID); |
| | | RecipeInfo oldRecipe = mgr.getRecipeByPPID(oldPPID); |
| | | if (oldRecipe.strPPID.empty()) { |
| | | AfxMessageBox(_T("获取配方数据失败!")); |
| | | return; |
| | | } |
| | | |
| | | // 弹出编辑对话框,并初始化为当前内容 |
| | | CRecipeDeviceBindDlg dlg(this); |
| | | dlg.SetRecipeInfo(oldRecipe); |
| | | |
| | | if (dlg.DoModal() == IDOK) { |
| | | const RecipeInfo& newRecipe = dlg.GetRecipeInfo(); |
| | | |
| | | bool success = false; |
| | | // 判断PPID是否有改动 |
| | | if (oldRecipe.strPPID != newRecipe.strPPID) { |
| | | // 先更新PPID,再整体更新内容 |
| | | if (mgr.updatePPID(oldRecipe.strPPID, newRecipe.strPPID)) { |
| | | success = mgr.updateRecipe(newRecipe); |
| | | if (!success) { |
| | | AfxMessageBox(_T("已更改PPID,但更新配方内容失败,请检查日志")); |
| | | } |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("更新PPID失败,请检查日志")); |
| | | return; |
| | | } |
| | | } |
| | | else { |
| | | // 只更新内容 |
| | | success = mgr.updateRecipe(newRecipe); |
| | | if (!success) { |
| | | AfxMessageBox(_T("更新配方失败,请检查日志")); |
| | | } |
| | | } |
| | | |
| | | if (success) { |
| | | auto vecData = mgr.getAllRecipes(); |
| | | FillDataToListCtrl(vecData); |
| | | } |
| | | } |
| | | } |
| | | |
| | | void CPageRecipe::FillDataToListCtrl(const std::vector<RecipeInfo>& vecRecipe) { |
| | | CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_PPID); |
| | | if (pListCtrl == nullptr || pListCtrl->m_hWnd == nullptr) { |
| | | if (pListCtrl == nullptr || !::IsWindow(pListCtrl->m_hWnd)) { |
| | | return; |
| | | } |
| | | |
| | |
| | | // 遍历数据并插入到CListCtrl中 |
| | | for (int i = 0; i < static_cast<int>(vecRecipe.size()); ++i) { |
| | | const RecipeInfo& recipe = vecRecipe[i]; |
| | | if (recipe.vecDeviceList.empty() || recipe.vecDeviceList.size() > 6){ |
| | | continue; |
| | | } |
| | | |
| | | m_listPPID.InsertItem(i, _T("")); // 第0列空白 |
| | | |
| | | CString strNo; |
| | | strNo.Format(_T("%d"), i + 1); |
| | | m_listPPID.SetItemText(i, 1, strNo); |
| | | |
| | | m_listPPID.SetItemText(i, 2, CA2T(recipe.strPPID.c_str())); |
| | | m_listPPID.SetItemText(i, 3, CA2T(recipe.strDescription.c_str())); |
| | | m_listPPID.SetItemText(i, 4, CA2T(recipe.strCreateTime.c_str())); |
| | | |
| | | for (int j = 0; j < recipe.vecDeviceList.size(); j++){ |
| | | CString str; |
| | | str.Format(_T("%d"), recipe.vecDeviceList.at(j).nRecipeID); |
| | | m_listPPID.SetItemText(i, j + 3, str); |
| | | } |
| | | |
| | | m_listPPID.SetItemText(i, 9, CA2T(recipe.strCreateTime.c_str())); |
| | | m_listPPID.SetItemText(i, 10, CA2T(recipe.strDescription.c_str())); |
| | | } |
| | | |
| | | // 获取列数 |
| | | int nColCount = m_listPPID.GetHeaderCtrl()->GetItemCount(); |
| | | m_listPPID.SetColumnWidth(nColCount - 1, LVSCW_AUTOSIZE_USEHEADER); |
| | | } |
| | | |
| | | void CPageRecipe::FillRecipeListToListCtrl(SERVO::CRecipeList* pList) |
| | | { |
| | | CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_PPID); |
| | | if (pListCtrl == nullptr || !::IsWindow(pListCtrl->m_hWnd)) { |
| | | return; |
| | | } |
| | | |
| | | // 清空当前CListCtrl中的所有项 |
| | | pListCtrl->DeleteAllItems(); |
| | | if (pList == nullptr) { |
| | | return; |
| | | } |
| | | |
| | | // 遍历数据并插入到CListCtrl中 |
| | | std::map<int, short>& ids = pList->getIds(); |
| | | for (auto item : ids) { |
| | | int index = m_listPPID.InsertItem(m_listPPID.GetItemCount(), _T("")); |
| | | m_listPPID.SetItemText(index, 1, std::to_string(item.first).c_str()); |
| | | m_listPPID.SetItemText(index, 2, std::to_string(item.second).c_str()); |
| | | } |
| | | |
| | | // 获取列数 |
| | |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | DDX_Control(pDX, IDC_LIST_PPID, m_listPPID); |
| | | DDX_Control(pDX, IDC_EDIT_PPID, m_editPPID); |
| | | DDX_Control(pDX, IDC_EDIT_DESC, m_editDesc); |
| | | } |
| | | |
| | | |
| | | BEGIN_MESSAGE_MAP(CPageRecipe, CDialogEx) |
| | | ON_WM_SIZE() |
| | | ON_WM_DESTROY() |
| | | ON_WM_SHOWWINDOW() |
| | | ON_BN_CLICKED(IDC_BUTTON_NEW, &CPageRecipe::OnBnClickedButtonNew) |
| | | ON_BN_CLICKED(IDC_BUTTON_SEARCH, &CPageRecipe::OnBnClickedButtonSearch) |
| | | ON_BN_CLICKED(IDC_BUTTON_MODIFY, &CPageRecipe::OnBnClickedButtonModify) |
| | | ON_BN_CLICKED(IDC_BUTTON_DELETE, &CPageRecipe::OnBnClickedButtonDelete) |
| | | ON_BN_CLICKED(IDC_BUTTON_DELETE_ALL, &CPageRecipe::OnBnClickedButtonDeleteAll) |
| | | ON_BN_CLICKED(IDC_BUTTON_REFRESH, &CPageRecipe::OnBnClickedButtonRefresh) |
| | | ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_PPID, &CPageRecipe::OnLvnItemChangedListPPID) |
| | | ON_CBN_SELCHANGE(IDC_COMBO_EQUIPMENT, &CPageRecipe::OnCbnSelchangeComboEquipment) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | |
| | | BOOL CPageRecipe::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | // 读出列宽 |
| | | CString strIniFile, strItem; |
| | | strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); |
| | | int width[12] = { 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 180 }; |
| | | for (int i = 0; i < 12; i++) { |
| | | strItem.Format(_T("Col_%d_Width"), i); |
| | | width[i] = GetPrivateProfileInt("PageRecipeListCtrl", strItem, width[i], strIniFile); |
| | | } |
| | | |
| | | // TODO: 在此添加额外的初始化 |
| | | CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_PPID); |
| | |
| | | HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1); |
| | | ListView_SetImageList(pListCtrl->GetSafeHwnd(), imageList, LVSIL_SMALL); |
| | | pListCtrl->InsertColumn(0, _T(""), LVCFMT_RIGHT, 0); // 隐藏列 |
| | | pListCtrl->InsertColumn(1, _T("No."), LVCFMT_LEFT, 80); |
| | | pListCtrl->InsertColumn(2, _T("PPID"), LVCFMT_LEFT, 120); |
| | | pListCtrl->InsertColumn(3, _T("描述"), LVCFMT_LEFT, 180); |
| | | pListCtrl->InsertColumn(4, _T("创建时间"), LVCFMT_LEFT, 160); |
| | | pListCtrl->SetColumnWidth(4, LVSCW_AUTOSIZE_USEHEADER); |
| | | pListCtrl->InsertColumn(1, _T("No."), LVCFMT_LEFT, width[1]); |
| | | pListCtrl->InsertColumn(2, _T("PPID/Recipe ID"), LVCFMT_LEFT, width[2]); |
| | | pListCtrl->InsertColumn(3, _T("真空烘烤"), LVCFMT_LEFT, width[6]); |
| | | pListCtrl->InsertColumn(4, _T("Bonder1"), LVCFMT_LEFT, width[4]); |
| | | pListCtrl->InsertColumn(5, _T("Bonder2"), LVCFMT_LEFT, width[5]); |
| | | pListCtrl->InsertColumn(6, _T("后烘冷却"), LVCFMT_LEFT, width[7]); |
| | | pListCtrl->InsertColumn(7, _T("精度检查"), LVCFMT_LEFT, width[8]); |
| | | pListCtrl->InsertColumn(8, _T("EFEM"), LVCFMT_LEFT, width[3]); |
| | | pListCtrl->InsertColumn(9, _T("创建时间"), LVCFMT_LEFT, width[9]); |
| | | pListCtrl->InsertColumn(10, _T("描述"), LVCFMT_LEFT, width[10]); |
| | | pListCtrl->SetColumnWidth(10, LVSCW_AUTOSIZE_USEHEADER); |
| | | |
| | | // 获取所有数据 |
| | | auto vecData = RecipeManager::getInstance().getAllRecipes(); |
| | |
| | | { |
| | | CDialogEx::OnSize(nType, cx, cy); |
| | | |
| | | if (m_listPPID.GetSafeHwnd()) { |
| | | // 左侧列表宽高自适应 |
| | | int margin = 10; |
| | | int buttonWidth = 80; |
| | | int buttonHeight = 30; |
| | | int buttonSpacing = 10; |
| | | if (!m_listPPID.GetSafeHwnd()) |
| | | return; |
| | | |
| | | CRect rect; |
| | | GetClientRect(&rect); |
| | | |
| | | int listWidth = rect.Width() - buttonWidth - 3 * margin; |
| | | int listHeight = rect.Height() - 2 * margin; |
| | | // 左侧列表宽高自适应 |
| | | int margin = 12; |
| | | int buttonWidth = 80; |
| | | int buttonHeight = 30; |
| | | int buttonSpacing = 10; |
| | | |
| | | m_listPPID.MoveWindow(margin, margin + 80, listWidth, listHeight - 80); |
| | | CWnd* pItem; |
| | | CRect rect, rcItem; |
| | | GetClientRect(&rect); |
| | | |
| | | // 编辑框调整位置:右边对齐列表,左边固定起始 |
| | | int labelWidth = 60; |
| | | int rightEdge = rect.right - buttonWidth - 2 * margin; |
| | | pItem = GetDlgItem(IDC_EDIT_KEYWORD); |
| | | ASSERT(pItem); |
| | | pItem->GetWindowRect(rcItem); |
| | | ScreenToClient(&rcItem); |
| | | |
| | | if (m_editPPID.GetSafeHwnd()) { |
| | | m_editPPID.MoveWindow(labelWidth, margin, rightEdge - labelWidth, 25); |
| | | int y = rcItem.bottom; |
| | | y += 12; |
| | | int listWidth = rect.Width() - buttonWidth - 3 * margin; |
| | | m_listPPID.MoveWindow(margin, y, listWidth, rect.bottom - 12 - y); |
| | | |
| | | |
| | | // 按钮竖直排列在右侧 |
| | | CWnd* buttons[] = { |
| | | GetDlgItem(IDC_BUTTON_REFRESH), |
| | | GetDlgItem(IDC_BUTTON_NEW), |
| | | GetDlgItem(IDC_BUTTON_MODIFY), |
| | | GetDlgItem(IDC_BUTTON_DELETE), |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL) |
| | | }; |
| | | |
| | | for (auto pBtn : buttons) { |
| | | if (pBtn && pBtn->GetSafeHwnd()) { |
| | | pBtn->MoveWindow(rect.right - buttonWidth - margin, y, buttonWidth, buttonHeight); |
| | | y += buttonHeight + buttonSpacing; |
| | | } |
| | | if (m_editDesc.GetSafeHwnd()) { |
| | | m_editDesc.MoveWindow(labelWidth, margin + 35, rightEdge - labelWidth, 25); |
| | | } |
| | | } |
| | | |
| | | void CPageRecipe::OnDestroy() |
| | | { |
| | | CDialogEx::OnDestroy(); |
| | | |
| | | // 保存列宽 |
| | | CString strIniFile, strItem, strTemp; |
| | | strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); |
| | | CHeaderCtrl* pHeader = m_listPPID.GetHeaderCtrl(); |
| | | for (int i = 0; i < pHeader->GetItemCount(); i++) { |
| | | RECT rect; |
| | | pHeader->GetItemRect(i, &rect); |
| | | strItem.Format(_T("Col_%d_Width"), i); |
| | | strTemp.Format(_T("%d"), rect.right - rect.left); |
| | | WritePrivateProfileString("PageRecipeListCtrl", strItem, strTemp, strIniFile); |
| | | } |
| | | } |
| | | |
| | | void CPageRecipe::OnShowWindow(BOOL bShow, UINT nStatus) |
| | | { |
| | | CDialogEx::OnShowWindow(bShow, nStatus); |
| | | |
| | | if (bShow) { |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | if (pComboBox->GetCount() == 0) { |
| | | SERVO::CMaster& master = theApp.m_model.getMaster(); |
| | | SERVO::CEquipment* pEq[] = { |
| | | nullptr, |
| | | master.getEquipment(EQ_ID_EFEM), |
| | | master.getEquipment(EQ_ID_Bonder1), |
| | | master.getEquipment(EQ_ID_Bonder2), |
| | | master.getEquipment(EQ_ID_BAKE_COOLING), |
| | | master.getEquipment(EQ_ID_VACUUMBAKE), |
| | | master.getEquipment(EQ_ID_MEASUREMENT), |
| | | }; |
| | | |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | for (int i = 0; i < sizeof(pEq) / sizeof(pEq[0]); i++) { |
| | | pComboBox->InsertString(i, |
| | | pEq[i] == nullptr ? _T("Master") : pEq[i]->getName().c_str()); |
| | | pComboBox->SetItemDataPtr(i, pEq[i]); |
| | | } |
| | | pComboBox->SetCurSel(0); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 按钮竖直排列在右侧 |
| | | CWnd* buttons[] = { |
| | | GetDlgItem(IDC_BUTTON_SEARCH), |
| | | GetDlgItem(IDC_BUTTON_MODIFY), |
| | | GetDlgItem(IDC_BUTTON_DELETE), |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL), |
| | | GetDlgItem(IDC_BUTTON_REFRESH) |
| | | }; |
| | | void CPageRecipe::OnBnClickedButtonNew() |
| | | { |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | //CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | //int nSel = pComboBox->GetCurSel(); |
| | | //SERVO::CEquipment* pEq = (SERVO::CEquipment*)pComboBox->GetItemDataPtr(nSel); |
| | | //if (pEq == nullptr) { |
| | | // return; |
| | | //} |
| | | |
| | | int y = margin; |
| | | for (auto pBtn : buttons) { |
| | | if (pBtn && pBtn->GetSafeHwnd()) { |
| | | pBtn->MoveWindow(rect.right - buttonWidth - margin, y, buttonWidth, buttonHeight); |
| | | y += buttonHeight + buttonSpacing; |
| | | CRecipeDeviceBindDlg dlg(this); |
| | | if (dlg.DoModal() == IDOK) { |
| | | const RecipeInfo& newRecipe = dlg.GetRecipeInfo(); |
| | | |
| | | auto& mgr = RecipeManager::getInstance(); |
| | | if (mgr.ppidExists(newRecipe.strPPID)) { |
| | | // 已存在,询问是否覆盖 |
| | | int ret = AfxMessageBox(_T("该 PPID 已存在,是否覆盖原配方?"), MB_YESNO | MB_ICONQUESTION); |
| | | if (ret == IDYES) { |
| | | if (mgr.updateRecipe(newRecipe)) { |
| | | auto vecData = mgr.getAllRecipes(); |
| | | FillDataToListCtrl(vecData); |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("更新配方失败,请检查日志")); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 列宽重设 |
| | | int col0 = 50; // No. |
| | | int col1 = 120; // PPID |
| | | int col3 = 160; // 创建时间自动填充 |
| | | int col2 = listWidth - col0 - col1 - col3 - 2; // 描述自动填充 |
| | | if (col2 < 80) { |
| | | col2 = 80; |
| | | else { |
| | | // 不存在,直接新增 |
| | | if (mgr.addRecipe(newRecipe)) { |
| | | auto vecData = mgr.getAllRecipes(); |
| | | FillDataToListCtrl(vecData); |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("添加配方失败,请检查日志")); |
| | | } |
| | | } |
| | | |
| | | m_listPPID.SetColumnWidth(1, col0); |
| | | m_listPPID.SetColumnWidth(2, col1); |
| | | m_listPPID.SetColumnWidth(3, col2); |
| | | m_listPPID.SetColumnWidth(4, col3); |
| | | } |
| | | } |
| | | |
| | | void CPageRecipe::OnBnClickedButtonSearch() |
| | | { |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | CString strInput; |
| | | m_editPPID.GetWindowText(strInput); |
| | | CString strKeyword; |
| | | GetDlgItemText(IDC_EDIT_KEYWORD, strKeyword); |
| | | strKeyword.Trim(); |
| | | |
| | | int nCount = m_listPPID.GetItemCount(); |
| | | for (int i = 0; i < nCount; ++i) { |
| | | CString strItemText = m_listPPID.GetItemText(i, 2); // 第2列为PPID |
| | | if (strItemText == strInput) { |
| | | m_listPPID.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); |
| | | m_listPPID.EnsureVisible(i, FALSE); |
| | | break; |
| | | } |
| | | std::vector<RecipeInfo> vecData; |
| | | if (strKeyword.IsEmpty()) { |
| | | // 关键词为空,显示全部配方 |
| | | vecData = RecipeManager::getInstance().getAllRecipes(); |
| | | } |
| | | else { |
| | | // 根据关键词搜索配方 |
| | | vecData = RecipeManager::getInstance().getRecipesByKeyword(std::string(CT2A(strKeyword))); |
| | | } |
| | | |
| | | // 如果没有数据,弹出提示 |
| | | if (vecData.empty()) { |
| | | AfxMessageBox(_T("未找到匹配的配方!")); |
| | | return; |
| | | } |
| | | |
| | | FillDataToListCtrl(vecData); |
| | | } |
| | | |
| | | void CPageRecipe::OnBnClickedButtonModify() |
| | |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | POSITION pos = m_listPPID.GetFirstSelectedItemPosition(); |
| | | if (!pos) { |
| | | AfxMessageBox(_T("请选择要修改的配方")); |
| | | AfxMessageBox(_T("请先选择一条配方记录进行修改!")); |
| | | return; |
| | | } |
| | | |
| | | int nSel = m_listPPID.GetNextSelectedItem(pos); |
| | | CString strOldPPID = m_listPPID.GetItemText(nSel, 2); |
| | | CString strOldDesc = m_listPPID.GetItemText(nSel, 3); |
| | | |
| | | CString strNewPPID, strNewDesc; |
| | | m_editPPID.GetWindowText(strNewPPID); |
| | | m_editDesc.GetWindowText(strNewDesc); |
| | | |
| | | // 判空 |
| | | if (strOldPPID.IsEmpty() || strNewPPID.IsEmpty()) { |
| | | AfxMessageBox(_T("PPID 不能为空")); |
| | | return; |
| | | } |
| | | |
| | | std::string oldPPID = CT2A(strOldPPID); |
| | | std::string newPPID = CT2A(strNewPPID); |
| | | std::string newDesc = CT2A(strNewDesc); |
| | | |
| | | bool bPPIDChanged = (strOldPPID.Compare(strNewPPID) != 0); |
| | | bool bDescChanged = (strOldDesc.Compare(strNewDesc) != 0); |
| | | |
| | | if (!bPPIDChanged && !bDescChanged) { |
| | | return; |
| | | } |
| | | |
| | | if (bPPIDChanged) { |
| | | // 新 PPID 不可重复 |
| | | if (RecipeManager::getInstance().ppidExists(newPPID)) { |
| | | AfxMessageBox(_T("新 PPID 已存在,请使用其他值")); |
| | | return; |
| | | } |
| | | |
| | | // 调用 updatePPID,同时更新描述 |
| | | if (RecipeManager::getInstance().updatePPID(oldPPID, newPPID)) { |
| | | m_listPPID.SetItemText(nSel, 2, strNewPPID); |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("更新失败,请检查日志")); |
| | | } |
| | | } |
| | | |
| | | if (bDescChanged) { |
| | | // 更新描述 |
| | | if (RecipeManager::getInstance().updateDescription(oldPPID, newDesc)) { |
| | | m_listPPID.SetItemText(nSel, 3, strNewDesc); |
| | | } |
| | | else { |
| | | AfxMessageBox(_T("描述更新失败")); |
| | | } |
| | | } |
| | | CString strPPID = m_listPPID.GetItemText(nSel, 2); |
| | | UpdateRecipeByPPID(strPPID); |
| | | } |
| | | |
| | | void CPageRecipe::OnBnClickedButtonDelete() |
| | |
| | | |
| | | void CPageRecipe::OnBnClickedButtonRefresh() |
| | | { |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | auto vecData = RecipeManager::getInstance().getAllRecipes(); |
| | | FillDataToListCtrl(vecData); |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | int nSel = pComboBox->GetCurSel(); |
| | | SERVO::CEquipment* pEq = (SERVO::CEquipment*)pComboBox->GetItemDataPtr(nSel); |
| | | |
| | | if (pEq == nullptr) { |
| | | // 获取master配方(本地) |
| | | auto vecData = RecipeManager::getInstance().getAllRecipes(); |
| | | FillDataToListCtrl(vecData); |
| | | } |
| | | else { |
| | | // enable port |
| | | CMsgDlg msgDlg("请等待", "正在获取配方..."); |
| | | pEq->masterRecipeListRequest(0, [&, pEq](int status) -> void { |
| | | if (status == SS_FAILED || status == SS_TIMEOUT) { |
| | | CString strMsg; |
| | | strMsg.Format(status == SS_FAILED ? _T("获取配方失败!") : _T("获取配方超时!")); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.SetIcon(MSG_BOX_ERROR); |
| | | msgDlg.SetTitle(_T("操作失败")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(-1); |
| | | } |
| | | else if (status == SS_COMPLETE) { |
| | | CString strMsg; |
| | | strMsg.Format(_T("获取配方完成!")); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.SetIcon(MSG_BOX_SUCCEED); |
| | | msgDlg.SetTitle(_T("操作成功")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(0); |
| | | SERVO::CRecipeList* pRecipeList = pEq->getRecipeList(0); |
| | | FillRecipeListToListCtrl(pRecipeList); |
| | | } |
| | | }); |
| | | msgDlg.DoModal(); |
| | | } |
| | | } |
| | | |
| | | void CPageRecipe::OnLvnItemChangedListPPID(NMHDR* pNMHDR, LRESULT* pResult) |
| | |
| | | LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); |
| | | *pResult = 0; |
| | | |
| | | if ((pNMLV->uChanged & LVIF_STATE) && |
| | | (pNMLV->uNewState & LVIS_SELECTED)) { |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | int nEqSel = pComboBox->GetCurSel(); |
| | | int selectedCount = ListView_GetSelectedCount(m_listPPID.GetSafeHwnd()); |
| | | |
| | | int nItem = pNMLV->iItem; |
| | | CString strPPID = m_listPPID.GetItemText(nItem, 2); |
| | | m_editPPID.SetWindowText(strPPID); |
| | | GetDlgItem(IDC_BUTTON_MODIFY)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | } |
| | | |
| | | CString strDesc = m_listPPID.GetItemText(nItem, 3); |
| | | m_editDesc.SetWindowText(strDesc); |
| | | void CPageRecipe::OnCbnSelchangeComboEquipment() |
| | | { |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | int nEqSel = pComboBox->GetCurSel(); |
| | | int selectedCount = ListView_GetSelectedCount(m_listPPID.GetSafeHwnd()); |
| | | |
| | | GetDlgItem(IDC_BUTTON_MODIFY)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_EDIT_KEYWORD)->EnableWindow(nEqSel == 0); |
| | | GetDlgItem(IDC_BUTTON_SEARCH)->EnableWindow(nEqSel == 0); |
| | | |
| | | SERVO::CEquipment* pEq = (SERVO::CEquipment*)pComboBox->GetItemDataPtr(nEqSel); |
| | | if (pEq == nullptr) { |
| | | auto vecData = RecipeManager::getInstance().getAllRecipes(); |
| | | FillDataToListCtrl(vecData); |
| | | } |
| | | } |
| | | else { |
| | | SERVO::CRecipeList* pRecipeList = pEq->getRecipeList(0); |
| | | FillRecipeListToListCtrl(pRecipeList); |
| | | } |
| | | } |