// PagePlcList.cpp : ʵÏÖÎļþ // #include "stdafx.h" #include "BoounionPLC.h" #include "PagePlcList.h" #include "afxdialogex.h" #include "Common.h" #define ID_TIMER_INIT 1 // CPagePlcList ¶Ô»°¿ò IMPLEMENT_DYNAMIC(CPagePlcList, CDialogEx) CPagePlcList::CPagePlcList(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_PAGE_PLC_LIST, pParent) { m_crBkgnd = PAGE_PLC_LIST_BACKGROUND; m_hbrBkgnd = nullptr; m_pObserver = nullptr; } CPagePlcList::~CPagePlcList() { } void CPagePlcList::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE1, m_treeCtrl); } BEGIN_MESSAGE_MAP(CPagePlcList, CDialogEx) 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); SetTimer(ID_TIMER_INIT, 200, nullptr); return TRUE; // return TRUE unless you set the focus to a control // Òì³£: OCX ÊôÐÔÒ³Ó¦·µ»Ø FALSE } HBRUSH CPagePlcList::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor == CTLCOLOR_STATIC) { 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); } return m_hbrBkgnd; } void CPagePlcList::OnDestroy() { CDialogEx::OnDestroy(); 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; 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() { HTREEITEM hItemFirst = nullptr; std::map& 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) { if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) { return TRUE; } 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); }