// CRobotTaskDlg.cpp: 实现文件 // #include "stdafx.h" #include "Servo.h" #include "CRobotTaskDlg.h" #include "afxdialogex.h" // CRobotTaskDlg 对话框 IMPLEMENT_DYNAMIC(CRobotTaskDlg, CDialogEx) CRobotTaskDlg::CRobotTaskDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_ROBOT_TASK, pParent) { m_pRobotTask = nullptr; } CRobotTaskDlg::~CRobotTaskDlg() { } void CRobotTaskDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CRobotTaskDlg, CDialogEx) ON_WM_CTLCOLOR() ON_WM_DESTROY() ON_WM_SIZE() ON_WM_ACTIVATE() ON_BN_CLICKED(IDC_BUTTON_ABORT_TASK, &CRobotTaskDlg::OnBnClickedAbortTask) END_MESSAGE_MAP() // CRobotTaskDlg 消息处理程序 void CRobotTaskDlg::SetRobotTask(SERVO::CRobotTask* pRobotTask) { m_pRobotTask = pRobotTask; // 各控件是否显示; GetDlgItem(IDC_LABEL_NO_TASK)->ShowWindow(m_pRobotTask == nullptr ? SW_SHOW : SW_HIDE); GetDlgItem(IDC_LABEL_GET_PUT)->ShowWindow(m_pRobotTask != nullptr ? SW_SHOW : SW_HIDE); if (m_btnAbortTask.m_hWnd) { m_btnAbortTask.ShowWindow(m_pRobotTask ? SW_SHOW : SW_HIDE); } if (m_pRobotTask != nullptr) { SERVO::CEquipment* pEq1, * pEq2; pEq1 = theApp.m_model.getMaster().getEquipment(m_pRobotTask->getSrcPosition()); pEq2 = theApp.m_model.getMaster().getEquipment(m_pRobotTask->getTarPosition()); CString strText; strText.Format(_T("%s --> %s"), pEq1->getName().c_str(), pEq2->getName().c_str()); SetDlgItemText(IDC_LABEL_GET_PUT, strText); } } BOOL CRobotTaskDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 // 创建“停止任务”按钮 m_btnAbortTask.Create(_T("停止任务"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(0, 0, 100, 30), this, IDC_BUTTON_ABORT_TASK); // 动态按钮创建后设置字体 if (m_fontButton.GetSafeHandle() == nullptr) { m_fontButton.CreatePointFont(110, _T("微软雅黑")); // 或 "Segoe UI" } m_btnAbortTask.SetFont(&m_fontButton); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } HBRUSH CRobotTaskDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性 // TODO: 如果默认的不是所需画笔,则返回另一个画笔 return hbr; } void CRobotTaskDlg::OnDestroy() { CDialogEx::OnDestroy(); // TODO: 在此处添加消息处理程序代码 if (m_fontButton.GetSafeHandle()) { ::DeleteObject(m_fontButton.Detach()); } } void CRobotTaskDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); if (GetDlgItem(IDC_LABEL_NO_TASK) == nullptr) return; Resize(); } void CRobotTaskDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CWnd::OnActivate(nState, pWndOther, bMinimized); if (nState == WA_INACTIVE) { ShowWindow(SW_HIDE); } } void CRobotTaskDlg::Resize() { CRect rcClient, rcItem; CWnd* pItem; GetClientRect(&rcClient); pItem = GetDlgItem(IDC_LABEL_NO_TASK); pItem->GetClientRect(&rcItem); pItem->MoveWindow((rcClient.Width() - rcItem.Width()) / 2, (rcClient.Height() - rcItem.Height()) / 2, rcItem.Width(), rcItem.Height()); pItem = GetDlgItem(IDC_LABEL_GET_PUT); pItem->GetClientRect(&rcItem); pItem->MoveWindow(12, 12, rcItem.Width(), rcItem.Height()); // 设置“停止任务”按钮位置(右下角) if (m_btnAbortTask.m_hWnd != nullptr) { const int nBtnWidth = 100; const int nBtnHeight = 28; const int nMargin = 12; const int nPosX = rcClient.right - nBtnWidth - nMargin; const int nPosY = rcClient.bottom - nBtnHeight - nMargin; m_btnAbortTask.MoveWindow(nPosX, nPosY, nBtnWidth, nBtnHeight); } } void CRobotTaskDlg::OnBnClickedAbortTask() { if (m_pRobotTask) { m_pRobotTask->abort(); AfxMessageBox(_T("任务已停止。")); } }