| | |
| | | #include "Common.h" |
| | | |
| | | |
| | | #define ID_TIMER_INIT 1 |
| | | |
| | | // CPagePlcList 对话框 |
| | | |
| | | IMPLEMENT_DYNAMIC(CPagePlcList, CDialogEx) |
| | |
| | | { |
| | | m_crBkgnd = PAGE_PLC_LIST_BACKGROUND; |
| | | m_hbrBkgnd = nullptr; |
| | | m_pObserver = nullptr; |
| | | } |
| | | |
| | | CPagePlcList::~CPagePlcList() |
| | |
| | | ON_WM_CTLCOLOR() |
| | | ON_WM_DESTROY() |
| | | ON_WM_SIZE() |
| | | ON_MESSAGE(ID_MSG_TREE_CLICK_ITEM, OnTreeClickItem) |
| | | ON_WM_TIMER() |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CPagePlcList 消息处理程序 |
| | | |
| | | |
| | | void CPagePlcList::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_ADD_PLC == code) { |
| | | CPLC* pPlc; |
| | | if (pAny->getPtrValue("ptr", (void*&)pPlc)) { |
| | | HTREEITEM hItem = m_treeCtrl.InsertItem(pPlc->getName().c_str(), nullptr, nullptr); |
| | | m_treeCtrl.SetItemData(hItem, (DWORD_PTR)pPlc); |
| | | m_treeCtrl.ShowWindow(SW_SHOW); |
| | | GetDlgItem(IDC_LABEL_NO_PLC)->ShowWindow(SW_HIDE); |
| | | } |
| | | } |
| | | else if (RX_CODE_REMOVE_PLC == code) { |
| | | CPLC* pPlc; |
| | | if (pAny->getPtrValue("ptr", (void*&)pPlc)) { |
| | | HTREEITEM hItem = FindItem(pPlc); |
| | | if (hItem != nullptr) { |
| | | m_treeCtrl.DeleteItem(hItem); |
| | | } |
| | | BOOL bNoPLC = m_treeCtrl.GetChildItem(nullptr) == nullptr; |
| | | m_treeCtrl.ShowWindow(bNoPLC ? SW_HIDE : SW_SHOW); |
| | | GetDlgItem(IDC_LABEL_NO_PLC)->ShowWindow(bNoPLC ? SW_SHOW : SW_HIDE); |
| | | |
| | | // 更新节点 |
| | | HTREEITEM hSelectedItem = m_treeCtrl.GetSelectedItem(); |
| | | CPLC* pSelectedPlc = nullptr; |
| | | if (hSelectedItem != NULL) { |
| | | pSelectedPlc = (CPLC*)m_treeCtrl.GetItemData(hSelectedItem); |
| | | } |
| | | theApp.m_model.notifyPtr(RX_CODE_SELECT_PLC, pSelectedPlc); |
| | | } |
| | | } |
| | | else if (RX_PLC_STATE_CHANGED == code) { |
| | | CPLC* pPlc; |
| | | if (pAny->getPtrValue("ptr", (void*&)pPlc)) { |
| | | HTREEITEM hItem = FindItem(pPlc); |
| | | if (hItem != nullptr && pPlc->isConnected()) { |
| | | m_treeCtrl.ShowItemBadgeDotMode(hItem); |
| | | } |
| | | else { |
| | | m_treeCtrl.HideItemBadge(hItem); |
| | | } |
| | | } |
| | | } |
| | | |
| | | pAny->release(); |
| | | }, [&]() -> void { |
| | | // onComplete |
| | | }, [&](IThrowable* pThrowable) -> void { |
| | | // onErrorm |
| | | pThrowable->printf(); |
| | | }); |
| | | |
| | | theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread()) |
| | | ->subscribe(m_pObserver); |
| | | } |
| | | } |
| | | |
| | | BOOL CPagePlcList::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | InitRxWindows(); |
| | | |
| | | |
| | | HFONT hFontDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT); |
| | | LOGFONT lf; |
| | | ::GetObject(hFontDefault, sizeof(LOGFONT), &lf); |
| | | lf.lfHeight -= 8; |
| | | lf.lfWeight = 400; |
| | | m_fontNoPlc.CreateFontIndirect(&lf); |
| | | GetDlgItem(IDC_LABEL_NO_PLC)->SetFont(&m_fontNoPlc); |
| | | |
| | | |
| | | m_treeCtrl.SetBkColor(PAGE_PLC_LIST_BACKGROUND); |
| | | m_treeCtrl.SetItemHeight(50); |
| | | ReadPLCList(); |
| | | SetTimer(ID_TIMER_INIT, 200, nullptr); |
| | | |
| | | |
| | | return TRUE; // return TRUE unless you set the focus to a control |
| | | // 异常: OCX 属性页应返回 FALSE |
| | |
| | | pDC->SetBkColor(m_crBkgnd); |
| | | } |
| | | |
| | | if (pWnd->GetDlgCtrlID() == IDC_LABEL_NO_PLC) { |
| | | pDC->SetTextColor(RGB(128, 128, 128)); |
| | | } |
| | | |
| | | if (m_hbrBkgnd == nullptr) { |
| | | m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); |
| | | } |
| | |
| | | { |
| | | CDialogEx::OnDestroy(); |
| | | |
| | | // TODO: 在此处添加消息处理程序代码 |
| | | if (m_pObserver != nullptr) { |
| | | m_pObserver->unsubscribe(); |
| | | m_pObserver = NULL; |
| | | } |
| | | } |
| | | |
| | | void CPagePlcList::OnSize(UINT nType, int cx, int cy) |
| | |
| | | CDialogEx::OnSize(nType, cx, cy); |
| | | if (GetDlgItem(IDC_TREE1) == nullptr) return; |
| | | |
| | | CRect rcClient; |
| | | CWnd* pItem; |
| | | CRect rcClient, rcItem; |
| | | GetClientRect(&rcClient); |
| | | GetDlgItem(IDC_TREE1)->MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24); |
| | | GetDlgItem(IDC_TOOLBAR_LINE1)->MoveWindow(rcClient.right - 3, 0, |
| | | 2, rcClient.Height()); |
| | | GetDlgItem(IDC_TOOLBAR_LINE1)->Invalidate(); |
| | | |
| | | pItem = GetDlgItem(IDC_LABEL_NO_PLC); |
| | | pItem->GetClientRect(&rcItem); |
| | | pItem->MoveWindow((rcClient.Width() - rcItem.Width()) / 2, (rcClient.Height() - rcItem.Height()) / 2, |
| | | rcItem.Width(), rcItem.Height()); |
| | | } |
| | | |
| | | LRESULT CPagePlcList::OnTreeClickItem(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | HTREEITEM hItem = (HTREEITEM)wParam; |
| | | ASSERT(hItem); |
| | | CPLC* pPlc = (CPLC*)m_treeCtrl.GetItemData(hItem); |
| | | ASSERT(pPlc); |
| | | theApp.m_model.notifyPtr(RX_CODE_SELECT_PLC, pPlc); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | void CPagePlcList::ReadPLCList() |
| | | { |
| | | m_treeCtrl.InsertItem("PLC1", nullptr, nullptr); |
| | | m_treeCtrl.InsertItem("PLC2", nullptr, nullptr); |
| | | HTREEITEM hItemFirst = nullptr; |
| | | std::map<std::string, CPLC*>& plcs = theApp.m_model.getPlcMap(); |
| | | for (auto item : plcs) { |
| | | HTREEITEM hItem = m_treeCtrl.InsertItem(item.second->getName().c_str(), nullptr, nullptr); |
| | | m_treeCtrl.SetItemData(hItem, (DWORD_PTR)item.second); |
| | | m_treeCtrl.SetItemBadge(hItem, TREE_BADGE_BACKGROUND, TREE_BADGE_FOREGROUND); |
| | | if (item.second->isConnected()) { |
| | | m_treeCtrl.ShowItemBadgeDotMode(hItem); |
| | | } |
| | | if (hItemFirst == nullptr) { |
| | | hItemFirst = hItem; |
| | | } |
| | | } |
| | | if (!plcs.empty()) { |
| | | m_treeCtrl.ShowWindow(SW_SHOW); |
| | | GetDlgItem(IDC_LABEL_NO_PLC)->ShowWindow(SW_HIDE); |
| | | } |
| | | |
| | | if (hItemFirst != nullptr) { |
| | | m_treeCtrl.SelectItem(hItemFirst); |
| | | CPLC* pPlc = (CPLC*)m_treeCtrl.GetItemData(hItemFirst); |
| | | theApp.m_model.notifyPtr(RX_CODE_SELECT_PLC, pPlc); |
| | | } |
| | | } |
| | | |
| | | BOOL CPagePlcList::PreTranslateMessage(MSG* pMsg) |
| | |
| | | |
| | | return CDialogEx::PreTranslateMessage(pMsg); |
| | | } |
| | | |
| | | HTREEITEM CPagePlcList::FindItem(CPLC* pPlc) |
| | | { |
| | | HTREEITEM item = m_treeCtrl.GetChildItem(nullptr); |
| | | while (item != nullptr) { |
| | | if (m_treeCtrl.GetItemData(item) == (DWORD_PTR)pPlc) { |
| | | return item; |
| | | } |
| | | |
| | | item = m_treeCtrl.GetNextItem(item, TVGN_NEXT); |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | void CPagePlcList::OnTimer(UINT_PTR nIDEvent) |
| | | { |
| | | // TODO: 在此添加消息处理程序代码和/或调用默认值 |
| | | if (ID_TIMER_INIT == nIDEvent) { |
| | | KillTimer(ID_TIMER_INIT); |
| | | ReadPLCList(); |
| | | } |
| | | |
| | | CDialogEx::OnTimer(nIDEvent); |
| | | } |