LAPTOP-T815PCOQ\25526
2024-11-28 fc8a07f476648f82abf9934483b04cfee0161e4e
1.扩展静态文本实现回调函数点击事件
2.模拟监听PLC
已修改4个文件
88 ■■■■■ 文件已修改
SourceCode/Bond/BLControlsSDK/include/BLLabel.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/IOMonitoringDlg.h 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BLControlsSDK/include/BLLabel.h
@@ -5,6 +5,8 @@
#pragma once
#endif // _MSC_VER >= 1000
#include <functional>
/////////////////////////////////////////////////////////////////////////////
// CBLLabel window
enum FlashType { None, Text, Background };
@@ -18,6 +20,8 @@
    // 构造与析构
    CBLLabel();
    virtual ~CBLLabel();
    void SetClickCallback(std::function<void()> callback); // 设置点击事件的回调函数
    // 属性设置接口
    CBLLabel& SetBkColor(COLORREF crBkgnd);             // 设置背景颜色
@@ -55,6 +59,7 @@
    TextAlign m_alignment;        // 文本对齐方式
    FlashType m_Type;             // 闪烁类型
    HCURSOR  m_hCursor;           // 超链接光标
    std::function<void()> m_clickCallback; // 点击事件的回调函数
protected:
    // MFC 消息映射
SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp
@@ -952,10 +952,12 @@
    else if (nIDEvent == TIMER_JOG_ADD && m_bJogAddPressed) {
        TRACE("持续发送 JOG+\n");
        handleAxisOperation(AxisOperationType::JOG_ADD, true); // 持续发送 JOG+
        Sleep(20);
    }
    else if (nIDEvent == TIMER_JOG_SUB && m_bJogSubPressed) {
        TRACE("持续发送 JOG-\n");
        handleAxisOperation(AxisOperationType::JOG_SUB, true); // 持续发送 JOG-
        Sleep(20);
    }
    CDialogEx::OnTimer(nIDEvent);
SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
@@ -6,6 +6,8 @@
#include "afxdialogex.h"
#include "IOMonitoringDlg.h"
#define TIMER_INIT                1
#define TIMER_READ_PLC_DATA        2
// CIOMonitoringDlg 对话框
@@ -177,7 +179,21 @@
        x += colWidthLarge + groupSpacing;
        // 创建第 2 组 (3, 4, 5)
        CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("OFF"), true, AlignCenter);
        CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("OFF"), true, AlignCenter, [this, i]() {
            // 自定义点击事件的逻辑
            auto* pControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 3]);
            CString currentText;
            pControl->GetWindowText(currentText);
            if (currentText == _T("OFF")) {
                pControl->SetBkColor(RGB(0, 255, 0)); // 绿色背景
                pControl->SetText(_T("ON"));          // 更新文本为 ON
            }
            else {
                pControl->SetBkColor(RGB(255, 0, 0)); // 红色背景
                pControl->SetText(_T("OFF"));         // 更新文本为 OFF
            }
        });
        x += colWidthSmall;
        CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("Y1010"), false, AlignCenter);
        x += colWidthSmall;
@@ -185,7 +201,7 @@
    }
}
void CIOMonitoringDlg::CreateStaticControl(int x, int y, int width, int height, const CString& text, bool hasBorder, TextAlign alignment)
void CIOMonitoringDlg::CreateStaticControl(int x, int y, int width, int height, const CString& text, bool hasBorder, TextAlign alignment, std::function<void()> clickCallback)
{
    // 创建动态控件
    CBLLabel* pStatic = new CBLLabel();
@@ -205,6 +221,11 @@
    pStatic->SetFontSize(nSize);
    pStatic->SetDynamicFont(TRUE);
    // 设置回调
    if (clickCallback) {
        pStatic->SetClickCallback(clickCallback);
    }
    // 存储控件指针
    m_staticControls.push_back(pStatic);
}
@@ -214,11 +235,18 @@
    int startIndex = (m_nCurrentPage - 1) * m_nRowsPerPage;
    int endIndex = min(startIndex + m_nRowsPerPage, static_cast<int>(m_displayData.size()));
    m_inputPLCAddresses.clear();
    m_outputPLCAddresses.clear();
    for (int i = 0; i < m_nRowsPerPage; ++i) {
        int row = i;
        if (startIndex + i < endIndex) {
            const auto& data = m_displayData[startIndex + i];
            // 添加 PLC 地址到容器中
            m_inputPLCAddresses.push_back(CString(data.inputAddress.c_str()));        // 1 列
            m_outputPLCAddresses.push_back(CString(data.outputAddress.c_str()));    // 4 列
            // 显示控件并设置内容
            m_staticControls[row * m_nCols + 0]->SetWindowText(_T("OFF"));
@@ -263,10 +291,32 @@
    m_staticControls.clear();
}
void CIOMonitoringDlg::UpdatePLCStates()
{
    // 随机值模拟
    for (size_t i = 0; i < m_inputPLCAddresses.size(); ++i) {
        // 模拟获取输入状态
        bool inputState = (rand() % 2 == 0); // 偶尔为 true/false
        auto* inputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 0]);
        inputControl->SetBkColor(inputState ? RGB(0, 255, 0) : RGB(255, 0, 0));
        inputControl->SetText(inputState ? _T("ON") : _T("OFF"));
    }
    for (size_t i = 0; i < m_outputPLCAddresses.size(); ++i) {
        // 模拟获取输出状态
        bool outputState = (rand() % 2 == 0); // 偶尔为 true/false
        auto* outputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 3]);
        outputControl->SetBkColor(outputState ? RGB(0, 255, 0) : RGB(255, 0, 0));
        outputControl->SetText(outputState ? _T("ON") : _T("OFF"));
    }
}
BEGIN_MESSAGE_MAP(CIOMonitoringDlg, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON_PREV_PAGE, &CIOMonitoringDlg::OnBnClickedButtonPrevPage)
    ON_BN_CLICKED(IDC_BUTTON_NEXT_PAGE, &CIOMonitoringDlg::OnBnClickedButtonNextPage)
    ON_WM_SIZE()
    ON_WM_TIMER()
    ON_WM_CLOSE()
END_MESSAGE_MAP()
@@ -331,6 +381,8 @@
    CreateDynamicControls();
    DisplayCurrentPage();
    SetTimer(TIMER_READ_PLC_DATA, 500, nullptr);
    return TRUE;  // return TRUE unless you set the focus to a control
    // 异常: OCX 属性页应返回 FALSE
}
@@ -374,3 +426,21 @@
        AfxMessageBox(_T("已经是最后一页!"));
    }
}
void CIOMonitoringDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    if (TIMER_READ_PLC_DATA == nIDEvent) {
        //ASSERT(m_pPLC);
        UpdatePLCStates();
        Sleep(100);
    }
    CDialogEx::OnTimer(nIDEvent);
}
void CIOMonitoringDlg::OnClose()
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    KillTimer(TIMER_READ_PLC_DATA);
    CDialogEx::OnClose();
}
SourceCode/Bond/BondEq/View/IOMonitoringDlg.h
@@ -28,9 +28,10 @@
    void UpdatePageInfo();            // 更新分页信息
    void CreateDynamicControls();    // 动态创建控件
    void CreateStaticControl(int x, int y, int width, int height, const CString& text, bool hasBorder = false, TextAlign alignment = AlignLeft); // 创建静态控件
    void CreateStaticControl(int x, int y, int width, int height, const CString& text, bool hasBorder = false, TextAlign alignment = AlignLeft, std::function<void()> clickCallback = nullptr); // 创建静态控件
    void DisplayCurrentPage();        // 显示当前页数据
    void ClearDynamicControls();    // 清除动态创建的控件
    void UpdatePLCStates();            // 定时器更新状态的方法
private:
    int m_nInitialWidth;
@@ -43,6 +44,8 @@
    std::map<int, CFont*> m_mapFonts;        // 字体映射
    std::map<int, CRect> m_mapCtrlLayouts;    // 控件布局映射
    std::vector<IOData> m_displayData;        // 当前显示的数据
    std::vector<CString> m_inputPLCAddresses;  // 存储 1 列 PLC 地址
    std::vector<CString> m_outputPLCAddresses; // 存储 4 列 PLC 地址
private:
    CStatic m_staticPageNum;
@@ -57,4 +60,6 @@
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnBnClickedButtonPrevPage();
    afx_msg void OnBnClickedButtonNextPage();
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    afx_msg void OnClose();
};