// CProjectPageComponents.cpp: 实现文件 // #include "stdafx.h" #include "BondEq.h" #include "CProjectPageComponents.h" #include "afxdialogex.h" #include "Alarm.h" #include "AlarmMonitor.h" // CProjectPageComponents 对话框 IMPLEMENT_DYNAMIC(CProjectPageComponents, CDialogEx) CProjectPageComponents::CProjectPageComponents(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_PROJECT_PAGE_COMPONENTS, pParent) { m_crBkgnd = PROPAGE_BACKGROUND_COLOR; m_hbrBkgnd = nullptr; m_pObserver = nullptr; } CProjectPageComponents::~CProjectPageComponents() { } void CProjectPageComponents::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE1, m_treeComponents); } BEGIN_MESSAGE_MAP(CProjectPageComponents, CDialogEx) ON_WM_CTLCOLOR() ON_WM_DESTROY() ON_WM_SIZE() ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CProjectPageComponents::OnTvnSelchangedTree1) ON_MESSAGE(ID_MSG_TREE_CLICK_ITEM, OnTreeClickItem) END_MESSAGE_MAP() // CEQPageComponents 消息处理程序 void CProjectPageComponents::InitRxWindows() { /* code */ // 订阅数据 IRxWindows* pRxWindows = RX_GetRxWindows(); pRxWindows->enableLog(5); if (m_pObserver == NULL) { m_pObserver = pRxWindows->allocObserver([&](IAny* pAny) -> void { // onNext pAny->addRef(); int code = pAny->getCode(); if (RX_CODE_DATA1_MATERIAL_RECEIVED == code) { CComponent* pComponent; if (pAny->getPtrValue("ptr", (void*&)pComponent)) { HTREEITEM hItem = getTreeItem(pComponent); if (hItem != nullptr) { m_treeComponents.ShowItemBadgeDotMode(hItem); } } } else if(RX_CODE_DATA1_MATERIAL_REMOVEED == code) { CComponent* pComponent; if (pAny->getPtrValue("ptr", (void*&)pComponent)) { HTREEITEM hItem = getTreeItem(pComponent); if (hItem != nullptr) { m_treeComponents.HideItemBadge(hItem); } } } else if (RX_CODE_ALARM_ON == code || RX_CODE_ALARM_OFF == code) { CAlarmMonitor* pComponent = nullptr; pAny->getPtrValue("ptr", (void*&)pComponent); ASSERT(pComponent); HTREEITEM hItem = getTreeItem(pComponent); if (hItem != nullptr) { if (pComponent->isAlarming()) m_treeComponents.ShowItemBadgeDotMode(hItem); else m_treeComponents.HideItemBadge(hItem); } } else if (RX_CODE_PLC1_CONNECTTD == code) { CComponent* pComponent; if (pAny->getPtrValue("ptr", (void*&)pComponent)) { HTREEITEM hItem = getTreeItem(pComponent); if (hItem != nullptr) { m_treeComponents.ShowItemBadgeDotMode(hItem); } } } else if (RX_CODE_PLC1_DISCONNECTTD == code) { CComponent* pComponent; if (pAny->getPtrValue("ptr", (void*&)pComponent)) { HTREEITEM hItem = getTreeItem(pComponent); if (hItem != nullptr) { m_treeComponents.HideItemBadge(hItem); } } } pAny->release(); }, [&]() -> void { // onComplete }, [&](IThrowable* pThrowable) -> void { // onErrorm pThrowable->printf(); }); theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread()) ->subscribe(m_pObserver); } } BOOL CProjectPageComponents::OnInitDialog() { CDialogEx::OnInitDialog(); // 组件列表 m_treeComponents.SetBkColor(PROPAGE_BACKGROUND_COLOR); m_treeComponents.SetItemHeight(50); const std::vector& components = theApp.m_model.getBonder().getComponents(); for (auto item : components) { HTREEITEM hItemComponent = m_treeComponents.InsertItem(item->getName().c_str()); m_treeComponents.SetItemData(hItemComponent, (DWORD_PTR)item); if (item->getClassName().compare("CAlarmMonitor") == 0) { m_treeComponents.SetItemBadge(hItemComponent, TREE_BADGE2_BACKGROUND, TREE_BADGE2_FOREGROUND); } else { m_treeComponents.SetItemBadge(hItemComponent, TREE_BADGE_BACKGROUND, TREE_BADGE_FOREGROUND); } } InitRxWindows(); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } HBRUSH CProjectPageComponents::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor == CTLCOLOR_STATIC) { pDC->SetBkColor(m_crBkgnd); } if (m_hbrBkgnd == nullptr) { m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); } return m_hbrBkgnd; } void CProjectPageComponents::OnDestroy() { CDialogEx::OnDestroy(); if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); } ASSERT(m_pObserver != NULL); m_pObserver->unsubscribe(); m_pObserver = NULL; } void CProjectPageComponents::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); if (GetDlgItem(IDC_TREE1) == nullptr) return; CRect rcClient; CWnd* pItem; GetClientRect(&rcClient); pItem = GetDlgItem(IDC_TREE1); pItem->MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24); } void CProjectPageComponents::OnTvnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); HTREEITEM hItem = pNMTreeView->itemNew.hItem; ASSERT(hItem); CComponent* pComponent = (CComponent*)m_treeComponents.GetItemData(hItem); ASSERT(pComponent); // theApp.m_model.notifyPtr(RX_CODE_SELECT_COMPONENT, pComponent); *pResult = 0; } LRESULT CProjectPageComponents::OnTreeClickItem(WPARAM wParam, LPARAM lParam) { HTREEITEM hItem = (HTREEITEM)wParam; ASSERT(hItem); CComponent* pComponent = (CComponent*)m_treeComponents.GetItemData(hItem); ASSERT(pComponent); theApp.m_model.notifyPtr(RX_CODE_SELECT_COMPONENT, pComponent); return 0; } HTREEITEM CProjectPageComponents::getTreeItem(CComponent* pComponent) { HTREEITEM hItem = m_treeComponents.GetChildItem(nullptr); while (hItem != nullptr) { CComponent* p = (CComponent*)m_treeComponents.GetItemData(hItem); if (p == pComponent) { return hItem; } hItem = m_treeComponents.GetNextSiblingItem(hItem); } return nullptr; }