mrDarker
2025-05-21 78793ce8e51b9a2b175483213017b154e3a5f952
1. 完善机械臂组合界面的控件状态显示和操作
已修改4个文件
169 ■■■■■ 文件已修改
SourceCode/Bond/Servo/CRobotCmdContainerDlg.cpp 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageRobotCmd.cpp 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageRobotCmd.h 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotCmdContainerDlg.cpp
@@ -93,8 +93,13 @@
        m_pageRobotCmd[i].Create(IDD_PAGE_ROBOT_CMD, this);
        m_pageRobotCmd[i].MoveWindow(rcShrinked);
        m_pageRobotCmd[i].ShowWindow(SW_SHOW);
        m_pageRobotCmd[i].EnableWindow(FALSE);
        m_pageRobotCmd[i].SetSequenceNo(i + 1);
        m_pageRobotCmd[i].SetControlsEnabled(i == 0);
        if (i == 0) {
            m_chkEnable[0].SetCheck(BST_CHECKED);
            m_chkEnable[0].EnableWindow(FALSE);
        }
    }
    // 计算整体宽高
@@ -144,6 +149,24 @@
void CRobotCmdContainerDlg::ToggleEnable(int index)
{
    constexpr int kMaxCount = 4;
    if (index < 0 || index >= kMaxCount) {
        return;
    }
    BOOL bChecked = m_chkEnable[index].GetCheck();
    m_pageRobotCmd[index].EnableWindow(bChecked);
    m_pageRobotCmd[index].SetControlsEnabled(bChecked);
    if (bChecked) {
        for (int i = 1; i < index; ++i) {
            m_chkEnable[i].SetCheck(BST_CHECKED);
            m_pageRobotCmd[i].SetControlsEnabled(TRUE);
        }
    }
    else {
        for (int i = index; i < kMaxCount; ++i) {
            m_chkEnable[i].SetCheck(BST_UNCHECKED);
            m_pageRobotCmd[i].SetControlsEnabled(FALSE);
        }
    }
}
SourceCode/Bond/Servo/PageRobotCmd.cpp
@@ -25,6 +25,15 @@
    {_T("MEASUREMENT"), 1}
};
static const std::map < SERVO:: RCMD, RCMDFieldMask > g_cmdFieldMap = {
    { SERVO::RCMD::Robot_home, { false, false, false, false, false, false } },
    { SERVO::RCMD::Transfer,   { true, true, true, true, true, false } },
    { SERVO::RCMD::Move,       { true, true, true, true, true, true } },
    { SERVO::RCMD::Get,        { true, true, false, true, false, false } },
    { SERVO::RCMD::Put,        { true, false, true, false, true, false } },
    { SERVO::RCMD::One_Action_Exchange, { true, true, true, true, true, false } },
};
IMPLEMENT_DYNAMIC(CPageRobotCmd, CDialogEx)
CPageRobotCmd::CPageRobotCmd(CWnd* pParent /*=nullptr*/)
@@ -55,22 +64,62 @@
    }
}
SERVO::ROBOT_CMD_PARAM CPageRobotCmd::GetRobotCmdParam()
BOOL CPageRobotCmd::SetControlsEnabled(BOOL bEnable)
{
    // 窗口销毁时不可用
    if (IsWindow(m_hWnd)) {
        UpdateData(TRUE); // 同步成员变量到界面
    if (!IsWindow(m_hWnd)) {
        return FALSE;
    }
    SERVO::ROBOT_CMD_PARAM param;
    if (bEnable) {
        UpdateData(TRUE);
        UpdateInputUI(static_cast<SERVO::RCMD>(m_nRcmd + 1));
    }
    else {
        // 遍历所有子控件并设置状态
        CWnd* pChild = GetWindow(GW_CHILD);
        while (pChild) {
            pChild->EnableWindow(bEnable);
            pChild = pChild->GetNextWindow();
        }
    }
    return CDialogEx::EnableWindow(bEnable);
}
SERVO::ROBOT_CMD_PARAM CPageRobotCmd::GetRobotCmdParam()
{
    if (!IsWindow(m_hWnd)) {
        return {};
    }
    UpdateData(TRUE);  // 同步 UI 到变量
    SERVO::ROBOT_CMD_PARAM param = {};
    param.sequenceNo = static_cast<short>(m_nSequenceNo);
    param.rcmd = static_cast<short>(m_nRcmd + 1);
    param.armNo = static_cast<short>(m_nArmNo);
    param.getPosition = static_cast<short>(m_nGetPosition + 1);
    param.putPosition = static_cast<short>(m_nPutPosition + 1);
    param.getSlotNo = static_cast<short>(m_nGetSlotNo + 1);
    param.putSlotNo = static_cast<short>(m_nPutSlotNo + 1);
    param.subCmd = static_cast<short>(m_nSubCmd + 1);
    const auto it = g_cmdFieldMap.find(static_cast<SERVO::RCMD>(param.rcmd));
    if (it == g_cmdFieldMap.end()) {
        return {};
    }
    const RCMDFieldMask& mask = it->second;
    if (mask.useArm)       param.armNo = static_cast<short>(m_nArmNo);
    if (mask.useGetPos)    param.getPosition = static_cast<short>(m_nGetPosition + 1);
    if (mask.usePutPos)    param.putPosition = static_cast<short>(m_nPutPosition + 1);
    if (mask.useGetSlot)   param.getSlotNo = static_cast<short>(m_nGetSlotNo + 1);
    if (mask.usePutSlot)   param.putSlotNo = static_cast<short>(m_nPutSlotNo + 1);
    if (mask.useSubCmd)    param.subCmd = static_cast<short>(m_nSubCmd + 1);
    if (param.rcmd == static_cast<short>(SERVO::RCMD::Move)) {
        if (m_nSubCmd == 0) {
            param.putPosition = 0;
            param.putSlotNo = 0;
        }
        else if (m_nSubCmd == 1) {
            param.getPosition = 0;
            param.getSlotNo = 0;
        }
    }
    return param;
}
@@ -90,8 +139,10 @@
BEGIN_MESSAGE_MAP(CPageRobotCmd, CDialogEx)
    ON_CBN_SELCHANGE(IDC_COMBO_RCMD, &CPageRobotCmd::OnCbnSelchangeComboRcmd)
    ON_CBN_SELCHANGE(IDC_COMBO_GET_POS, &CPageRobotCmd::OnCbnSelchangeComboGetPos)
    ON_CBN_SELCHANGE(IDC_COMBO_PUT_POS, &CPageRobotCmd::OnCbnSelchangeComboPutPos)
    ON_CBN_SELCHANGE(IDC_COMBO_SUB_CMD, &CPageRobotCmd::OnCbnSelchangeComboSubCmd)
END_MESSAGE_MAP()
@@ -154,16 +205,18 @@
    pComboSubCmd->AddString(_T("2: Put Ready"));
    pComboSubCmd->SetCurSel(0);
    // 初始化单选框
    // 初始化 ARM 单选框
    CButton* pRadioArmA = (CButton*)GetDlgItem(IDC_RADIO_ARM_A);
    CButton* pRadioArmB = (CButton*)GetDlgItem(IDC_RADIO_ARM_B);
    pRadioArmA->SetCheck(BST_CHECKED);
    pRadioArmB->SetCheck(BST_UNCHECKED);
    // 初始化输入控件状态
    UpdateInputUI(SERVO::RCMD::Robot_home);
    return TRUE;  // return TRUE unless you set the focus to a control
    // 异常: OCX 属性页应返回 FALSE
}
void CPageRobotCmd::UpdateSlotList(CComboBox* pComboDevice, CComboBox* pComboSlot)
{
@@ -191,6 +244,48 @@
    pComboSlot->SetCurSel(0);
}
void CPageRobotCmd::UpdateMoveSubFields()
{
    UpdateData(TRUE);
    if (SERVO::RCMD::Move == static_cast<SERVO::RCMD>(m_nRcmd + 1)) {
        const bool bMoveToGet = (m_nSubCmd == 0); // Move to Get
        const bool bMoveToPut = (m_nSubCmd == 1); // Move to Put
        GetDlgItem(IDC_COMBO_GET_POS)->EnableWindow(bMoveToGet);
        GetDlgItem(IDC_COMBO_GET_SLOT)->EnableWindow(bMoveToGet);
        GetDlgItem(IDC_COMBO_PUT_POS)->EnableWindow(bMoveToPut);
        GetDlgItem(IDC_COMBO_PUT_SLOT)->EnableWindow(bMoveToPut);
    }
}
void CPageRobotCmd::UpdateInputUI(SERVO::RCMD cmd)
{
    const auto it = g_cmdFieldMap.find(cmd);
    if (it == g_cmdFieldMap.end()) {
        return;
    }
    const RCMDFieldMask& mask = it->second;
    GetDlgItem(IDC_EDIT_SEQ_NO)->EnableWindow(TRUE);
    GetDlgItem(IDC_COMBO_RCMD)->EnableWindow(TRUE);
    GetDlgItem(IDC_RADIO_ARM_A)->EnableWindow(mask.useArm);
    GetDlgItem(IDC_RADIO_ARM_B)->EnableWindow(mask.useArm);
    GetDlgItem(IDC_COMBO_GET_POS)->EnableWindow(mask.useGetPos);
    GetDlgItem(IDC_COMBO_PUT_POS)->EnableWindow(mask.usePutPos);
    GetDlgItem(IDC_COMBO_GET_SLOT)->EnableWindow(mask.useGetSlot);
    GetDlgItem(IDC_COMBO_PUT_SLOT)->EnableWindow(mask.usePutSlot);
    GetDlgItem(IDC_COMBO_SUB_CMD)->EnableWindow(mask.useSubCmd);
    // 特殊处理 Move 类型
    UpdateMoveSubFields();
}
void CPageRobotCmd::OnCbnSelchangeComboRcmd()
{
    UpdateData(TRUE);
    UpdateInputUI(static_cast<SERVO::RCMD>(m_nRcmd + 1));
}
void CPageRobotCmd::OnCbnSelchangeComboGetPos()
{
    CComboBox* pDevice = (CComboBox*)GetDlgItem(IDC_COMBO_GET_POS);
@@ -205,4 +300,9 @@
    CComboBox* pDevice = (CComboBox*)GetDlgItem(IDC_COMBO_PUT_POS);
    CComboBox* pSlot = (CComboBox*)GetDlgItem(IDC_COMBO_PUT_SLOT);
    UpdateSlotList(pDevice, pSlot);
}
void CPageRobotCmd::OnCbnSelchangeComboSubCmd()
{
    UpdateMoveSubFields();
}
SourceCode/Bond/Servo/PageRobotCmd.h
@@ -5,6 +5,15 @@
// CPageRobotCmd 对话框
struct RCMDFieldMask {
    bool useArm;
    bool useGetPos;
    bool usePutPos;
    bool useGetSlot;
    bool usePutSlot;
    bool useSubCmd;
};
class CPageRobotCmd : public CDialogEx
{
    DECLARE_DYNAMIC(CPageRobotCmd)
@@ -13,8 +22,11 @@
    CPageRobotCmd(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~CPageRobotCmd();
    void SetSequenceNo(int nSeq);
    BOOL SetControlsEnabled(BOOL bEnable);
    SERVO::ROBOT_CMD_PARAM CPageRobotCmd::GetRobotCmdParam();
// 对话框数据
#ifdef AFX_DESIGN_TIME
@@ -24,12 +36,16 @@
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    virtual BOOL OnInitDialog();
    afx_msg void OnCbnSelchangeComboRcmd();
    afx_msg void OnCbnSelchangeComboGetPos();
    afx_msg void OnCbnSelchangeComboPutPos();
    afx_msg void OnCbnSelchangeComboSubCmd();
    DECLARE_MESSAGE_MAP()
private:
    void UpdateSlotList(CComboBox* pComboDevice, CComboBox* pComboSlot);
    void UpdateMoveSubFields();
    void UpdateInputUI(SERVO::RCMD cmd);
    int m_nSequenceNo;
    int m_nRcmd;
SourceCode/Bond/Servo/Servo.rc
Binary files differ