LAPTOP-T815PCOQ\25526
2024-12-23 89bcc7791c48d8bcf8e124e56849e44563f8097c
1.对话框基类加载资源库、卸载资源库
2. 报警模块的界面添加分页功能
已修改4个文件
224 ■■■■ 文件已修改
SourceCode/Bond/BondEq/CBaseDlg.cpp 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CBaseDlg.h 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CPageAlarm.cpp 109 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CPageAlarm.h 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CBaseDlg.cpp
@@ -9,10 +9,15 @@
CFont g_defaultFont;
Theme* g_currentTheme = &g_lightTheme;
// 全局资源句柄
HINSTANCE g_hCurrentResource = NULL;
IMPLEMENT_DYNAMIC(CBaseDlg, CDialogEx)
CBaseDlg::CBaseDlg(UINT id, CWnd* pPage) : CDialogEx(id, pPage), m_bResizing(false)
CBaseDlg::CBaseDlg(UINT nID, CWnd* pPage) : CDialogEx(nID, pPage), m_bResizing(false)
{
    m_nID = nID;
    m_pParent = pPage;
    m_nInitialWidth = 0;
    m_nInitialHeight = 0;
}
@@ -23,6 +28,57 @@
    m_mapFonts.clear();
    m_mapCtrlLayouts.clear();
    m_mapControls.clear();
}
void CBaseDlg::SwitchTheme(ThemeType enThemeType)
{
    // 使用 map 来根据 themeType 查找主题
    static const std::unordered_map<ThemeType, Theme*> themeMap = {
        { ThemeType::Light, &g_lightTheme },
        { ThemeType::Dark, &g_darkTheme }
    };
    // 设置当前主题
    auto it = themeMap.find(enThemeType);
    if (it != themeMap.end()) {
        g_currentTheme = it->second;
    }
    else {
        g_currentTheme = &g_lightTheme;
    }
    // 更新控件的外观
    CWnd* pWnd = GetWindow(GW_CHILD);
    while (pWnd) {
        pWnd->Invalidate();
        pWnd = pWnd->GetNextWindow();
    }
    // 更新对话框背景颜色
    SetBackgroundColor(g_currentTheme->backgroundColor);
}
void CBaseDlg::LoadResourceLibrary(const CString& strLanguage)
{
    // 卸载之前加载的资源库
    UnloadResourceLibrary();
    // 加载新的资源库
    g_hCurrentResource = AfxLoadLibrary(strLanguage);
    // 设置新的资源句柄
    if (g_hCurrentResource != NULL) {
        AfxSetResourceHandle(g_hCurrentResource);
    }
}
void CBaseDlg::UnloadResourceLibrary()
{
    // 卸载之前加载的资源库
    if (g_hCurrentResource != NULL) {
        FreeLibrary(g_hCurrentResource);    // 释放当前资源库
        g_hCurrentResource = NULL;            // 清空资源句柄
    }
}
CFont* CBaseDlg::GetOrCreateFont(int nFontSize)
@@ -104,34 +160,6 @@
        return it->second.get();
    }
    return nullptr;
}
void CBaseDlg::SwitchTheme(ThemeType themeType)
{
    // 使用 map 来根据 themeType 查找主题
    static const std::unordered_map<ThemeType, Theme*> themeMap = {
        { ThemeType::Light, &g_lightTheme },
        { ThemeType::Dark, &g_darkTheme }
    };
    // 设置当前主题
    auto it = themeMap.find(themeType);
    if (it != themeMap.end()) {
        g_currentTheme = it->second;
    }
    else {
        g_currentTheme = &g_lightTheme;
    }
    // 更新控件的外观
    CWnd* pWnd = GetWindow(GW_CHILD);
    while (pWnd) {
        pWnd->Invalidate(); // 重绘控件
        pWnd = pWnd->GetNextWindow();
    }
    // 更新对话框背景颜色
    SetBackgroundColor(g_currentTheme->backgroundColor);
}
void CBaseDlg::AdjustControls(float dScaleX, float dScaleY)
SourceCode/Bond/BondEq/CBaseDlg.h
@@ -19,8 +19,15 @@
    DECLARE_DYNAMIC(CBaseDlg)
public:
    CBaseDlg(UINT id, CWnd* pPage);                // 标准构造函数
    CBaseDlg(UINT nID, CWnd* pPage);            // 标准构造函数
    virtual ~CBaseDlg();                        // 析构函数
    // 主题管理
    void SwitchTheme(ThemeType enThemeType);            // 切换主题
    // 资源管理
    void LoadResourceLibrary(const CString& strLanguage);            // 加载资源库
    void UnloadResourceLibrary();                                    // 卸载资源库
    // 字体管理
    CFont* GetOrCreateFont(int nFontSize);        // 获取或创建字体
@@ -32,14 +39,13 @@
    BOOL UpdateControlText(UINT nCtrlID, const CString& strText);   // 更新控件文本
    CWnd* GetControl(UINT nCtrlID);                                    // 获取控件
    // 主题设置
    void SwitchTheme(ThemeType themeType);                            // 切换主题
private:
    void AdjustControls(float dScaleX, float dScaleY);                // 调整控件大小
    void AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight);    // 调整控件字体
private:
    UINT m_nID;                                                    // 对话框ID
    CWnd* m_pParent;                                            // 父窗口
    bool m_bResizing;                                            // 控件是否正在调整大小
    int m_nInitialWidth;                                        // 对话框初始宽度
    int m_nInitialHeight;                                        // 对话框初始高度    
SourceCode/Bond/BondEq/CPageAlarm.cpp
@@ -8,6 +8,7 @@
#include "Common.h"
#include "ToolUnits.h"
#define PAGE_SIZE        20
// CPageAlarm 对话框
@@ -19,6 +20,9 @@
    m_crBkgnd = PAGE_BACKGROUND_COLOR;
    m_hbrBkgnd = nullptr;
    m_pObserver = nullptr;
    m_nCurPage = 0;
    m_nTotalPages = 0;
    m_nDateTimeFlag = 0;
}
CPageAlarm::~CPageAlarm()
@@ -27,6 +31,8 @@
void CPageAlarm::DoDataExchange(CDataExchange* pDX)
{
    DDX_Control(pDX, IDC_DATETIMEPICKER_START, m_dateTimeStart);
    DDX_Control(pDX, IDC_DATETIMEPICKER_END, m_dateTimeEnd);
    CDialogEx::DoDataExchange(pDX);
}
@@ -35,6 +41,8 @@
    ON_WM_CTLCOLOR()
    ON_WM_DESTROY()
    ON_WM_SIZE()
    ON_BN_CLICKED(IDC_BUTTON_PREV_PAGE, &CPageAlarm::OnBnClickedButtonPrevPage)
    ON_BN_CLICKED(IDC_BUTTON_NEXT_PAGE, &CPageAlarm::OnBnClickedButtonNextPage)
END_MESSAGE_MAP()
@@ -150,13 +158,12 @@
    GetClientRect(&rcClient);
    pItem = GetDlgItem(IDC_LIST_ALARM);
    pItem->MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24);
    pItem->MoveWindow(12, 52, rcClient.Width() - 24, rcClient.Height() - 64);
}
void CPageAlarm::LoadAlarms()
{
    CAlarmMonitor* pMonitor = (CAlarmMonitor*)theApp.m_model.getBonder().GetComponent(ALARM_MONITOR);
    // 当前正在发生的报警
    pMonitor->Lock();
@@ -166,19 +173,9 @@
    }
    pMonitor->Unlock();
    // 获取历史报警数据
    auto vecData = AlarmManager::getInstance().getAllAlarms();
    // 填充数据
    CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
    for (auto item : vecData) {
        pListCtrl->InsertItem(0, _T(""));
        pListCtrl->SetItemText(0, 1, item[0].c_str());
        pListCtrl->SetItemText(0, 2, item[1].c_str());
        pListCtrl->SetItemText(0, 3, item[2].c_str());
        pListCtrl->SetItemText(0, 4, item[3].c_str());
    }
    // 刷新历史报警数据
    m_nCurPage = 1;
    UpdatePageData();
}
void CPageAlarm::AddAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm)
@@ -213,6 +210,74 @@
    }
}
void CPageAlarm::UpdatePageData()
{
    // 计算总页数
    int totalRecords = AlarmManager::getInstance().getTotalAlarmCount("", "", "");
    m_nTotalPages = (totalRecords + PAGE_SIZE - 1) / PAGE_SIZE;
    std::vector<std::vector<std::string>> vecData;
    // 根据时间过滤条件加载数据
    if (m_nDateTimeFlag == 0) {
        vecData = AlarmManager::getInstance().getAlarms((m_nCurPage - 1) * PAGE_SIZE, PAGE_SIZE);
    }
    else {
        COleDateTime startTime, endTime;
        m_dateTimeStart.GetTime(startTime);
        m_dateTimeEnd.GetTime(endTime);
        CString strStartTime = startTime.Format(_T("%Y-%m-%d %H:%M:%S"));
        CString strEndTime = endTime.Format(_T("%Y-%m-%d %H:%M:%S"));
        std::string start = CT2A(strStartTime);
        std::string end = CT2A(strEndTime);
        vecData = AlarmManager::getInstance().getFilteredAlarms("", start, end, m_nCurPage, PAGE_SIZE);
    }
    if (vecData.empty()) return;
    // 填充数据到控件
    CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
    FillDataToListCtrl(pListCtrl, vecData);
    // 更新分页控件(页数和按钮)
    UpdatePageControls();
}
void CPageAlarm::UpdatePageControls()
{
    // 更新分页信息
    CString strPage;
    strPage.Format(_T("第 %d 页"), m_nCurPage);
    SetDlgItemText(IDC_LABEL_PAGE_NUMBER, strPage);
    // 启用/禁用翻页按钮
    GetDlgItem(IDC_BUTTON_PREV_PAGE)->EnableWindow(m_nCurPage > 1);
    GetDlgItem(IDC_BUTTON_NEXT_PAGE)->EnableWindow(m_nCurPage < m_nTotalPages);
}
void CPageAlarm::FillDataToListCtrl(CListCtrl* pListCtrl, const std::vector<std::vector<std::string>>& vecData)
{
    // 清空当前CListCtrl中的所有项
    for (int i = 0; i < pListCtrl->GetItemCount(); i++) {
        CAlarm* pAlarm = (CAlarm*)pListCtrl->GetItemData(i);
        if (pAlarm != nullptr) {
            pAlarm->release();
        }
    }
    pListCtrl->DeleteAllItems();
    // 遍历数据并插入到CListCtrl中
    for (const auto& item : vecData) {
        int nItem = pListCtrl->InsertItem(pListCtrl->GetItemCount(), _T(""));    // 插入新行
        pListCtrl->SetItemText(nItem, 1, item[0].c_str());                        // 设置第一列的文本
        pListCtrl->SetItemText(nItem, 2, item[1].c_str());                        // 设置第二列的文本
        pListCtrl->SetItemText(nItem, 3, item[2].c_str());                        // 设置第三列的文本
        pListCtrl->SetItemText(nItem, 4, item[3].c_str());                        // 设置第四列的文本
    }
}
BOOL CPageAlarm::DestroyWindow()
{
    CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
@@ -225,3 +290,17 @@
    return CDialogEx::DestroyWindow();
}
void CPageAlarm::OnBnClickedButtonPrevPage()
{
    // 点击上一页
    m_nCurPage--;
    UpdatePageData();  // 调用分页更新函数
}
void CPageAlarm::OnBnClickedButtonNextPage()
{
    // 点击下一页
    m_nCurPage++;
    UpdatePageData();  // 调用分页更新函数
}
SourceCode/Bond/BondEq/CPageAlarm.h
@@ -18,11 +18,24 @@
    void LoadAlarms();
    void AddAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm);
    void UpdateAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm);
    void UpdatePageData();
    void UpdatePageControls();
    void FillDataToListCtrl(CListCtrl* pListCtrl, const std::vector<std::vector<std::string>>& vecData);
private:
    COLORREF m_crBkgnd;
    HBRUSH m_hbrBkgnd;
    IObserver* m_pObserver;
    // 页码
    int m_nCurPage;
    int m_nTotalPages;
    // 日期时间标志
    int m_nDateTimeFlag;
    // 控件
    CDateTimeCtrl m_dateTimeStart;
    CDateTimeCtrl m_dateTimeEnd;
// 对话框数据
@@ -40,4 +53,6 @@
    afx_msg void OnDestroy();
    afx_msg void OnSize(UINT nType, int cx, int cy);
    virtual BOOL DestroyWindow();
    afx_msg void OnBnClickedButtonPrevPage();
    afx_msg void OnBnClickedButtonNextPage();
};