// BoounionPLCDlg.cpp : ʵÏÖÎļþ // #include "stdafx.h" #include "BoounionPLC.h" #include "BoounionPLCDlg.h" #include "afxdialogex.h" #include "Common.h" #include "PlcView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // ÓÃÓÚÓ¦ÓóÌÐò¡°¹ØÓÚ¡±²Ëµ¥ÏîµÄ CAboutDlg ¶Ô»°¿ò class CAboutDlg : public CDialogEx { public: CAboutDlg(); // ¶Ô»°¿òÊý¾Ý #ifdef AFX_DESIGN_TIME enum { IDD = IDD_ABOUTBOX }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Ö§³Ö // ʵÏÖ protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CBoounionPLCDlg ¶Ô»°¿ò CBoounionPLCDlg::CBoounionPLCDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_BOOUNIONPLC_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pTopToolbar = nullptr; m_pObserver = nullptr; m_crBkgnd = APP_MAIN_DLG_BACKGROUND; m_hbrBkgnd = nullptr; m_pActiveView = nullptr; } void CBoounionPLCDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CBoounionPLCDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_DESTROY() ON_WM_SIZE() ON_WM_CTLCOLOR() ON_COMMAND(ID_MENU_FILE_EXIT, &CBoounionPLCDlg::OnMenuFileExit) ON_UPDATE_COMMAND_UI(ID_MENU_FILE_EXIT, &CBoounionPLCDlg::OnUpdateMenuFileExit) ON_COMMAND(ID_MENU_FILE_SETTINGS, &CBoounionPLCDlg::OnMenuFileSettings) ON_UPDATE_COMMAND_UI(ID_MENU_FILE_SETTINGS, &CBoounionPLCDlg::OnUpdateMenuFileSettings) ON_COMMAND(ID_MENU_HELP_ABOUT, &CBoounionPLCDlg::OnMenuHelpAbout) ON_WM_INITMENUPOPUP() ON_MESSAGE(ID_MSG_TOOLBAR_BTN_CLICKED, &CBoounionPLCDlg::OnToolbarBtnClicked) ON_MESSAGE(ID_MSG_VIEW_ACTIVE, &CBoounionPLCDlg::OnViewActive) ON_MESSAGE(ID_MSG_BTN_CLICKED, &CBoounionPLCDlg::OnViewBtnClicked) ON_MESSAGE(ID_MSG_BTN_MENU_ITEM, &CBoounionPLCDlg::OnViewBtnMenuItem) END_MESSAGE_MAP() // CBoounionPLCDlg ÏûÏ¢´¦Àí³ÌÐò void CBoounionPLCDlg::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_SELECT_PLC == code) { CPLC* pPlc; if (pAny->getPtrValue("ptr", (void*&)pPlc)) { ASSERT(m_pMainContainer != nullptr); if (m_pActiveView == nullptr) { m_pActiveView = (CPlcView*)CreatePlcView(pPlc); } ASSERT(m_pActiveView); if (m_pActiveView->GetContext() != (void*)pPlc) { m_pActiveView->SetWindowText(pPlc->getName().c_str()); m_pActiveView->SetContext(pPlc); } } } pAny->release(); }, [&]() -> void { // onComplete }, [&](IThrowable* pThrowable) -> void { // onErrorm pThrowable->printf(); }); theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread()) ->subscribe(m_pObserver); } } BOOL CBoounionPLCDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // ½«¡°¹ØÓÚ...¡±²Ëµ¥ÏîÌí¼Óµ½ÏµÍ³²Ëµ¥ÖС£ // IDM_ABOUTBOX ±ØÐëÔÚϵͳÃüÁΧÄÚ¡£ ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // ÉèÖô˶Ի°¿òµÄͼ±ê¡£ µ±Ó¦ÓóÌÐòÖ÷´°¿Ú²»ÊǶԻ°¿òʱ£¬¿ò¼Ü½«×Ô¶¯ // Ö´Ðд˲Ù×÷ SetIcon(m_hIcon, TRUE); // ÉèÖôóͼ±ê SetIcon(m_hIcon, FALSE); // ÉèÖÃСͼ±ê theApp.m_model.init(); // toolbar m_pTopToolbar = new CTopToolbar(); m_pTopToolbar->Create(IDD_TOP_TOOLBAR, this); m_pTopToolbar->ShowWindow(SW_SHOW); HMENU hMenu = m_pTopToolbar->GetOperatorMenu(); ASSERT(hMenu); ::EnableMenuItem(hMenu, ID_OPEATOR_SWITCH, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); // page plc list m_pPagePlcList = new CPagePlcList(); m_pPagePlcList->Create(IDD_PAGE_PLC_LIST, this); m_pPagePlcList->ShowWindow(SW_SHOW); // Ö÷´°¿ÚÒ³ m_pMainContainer = new CMainContainer(); m_pMainContainer->Create(IDD_MAIN_CONTAINER, this); m_pMainContainer->ShowWindow(SW_SHOW); // ²Ëµ¥ CMenu menu; menu.LoadMenu(IDR_MENU_APP); SetMenu(&menu); InitRxWindows(); ShowWindow(SW_MAXIMIZE); Resize(); return TRUE; // ³ý·Ç½«½¹µãÉèÖõ½¿Ø¼þ£¬·ñÔò·µ»Ø TRUE } void CBoounionPLCDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // Èç¹ûÏò¶Ô»°¿òÌí¼Ó×îС»¯°´Å¥£¬ÔòÐèÒªÏÂÃæµÄ´úÂë // À´»æÖƸÃͼ±ê¡£ ¶ÔÓÚʹÓÃÎĵµ/ÊÓͼģÐ굀 MFC Ó¦ÓóÌÐò£¬ // Õ⽫ÓÉ¿ò¼Ü×Ô¶¯Íê³É¡£ void CBoounionPLCDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // ÓÃÓÚ»æÖƵÄÉ豸ÉÏÏÂÎÄ SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // ʹͼ±êÔÚ¹¤×÷Çø¾ØÐÎÖоÓÖÐ int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // »æÖÆÍ¼±ê dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //µ±Óû§Í϶¯×îС»¯´°¿Úʱϵͳµ÷Óô˺¯ÊýÈ¡µÃ¹â±ê //ÏÔʾ¡£ HCURSOR CBoounionPLCDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CBoounionPLCDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { ASSERT(pPopupMenu != NULL); CCmdUI state; state.m_pMenu = pPopupMenu; ASSERT(state.m_pOther == NULL); ASSERT(state.m_pParentMenu == NULL); HMENU hParentMenu; if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu) state.m_pParentMenu = pPopupMenu; else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL) { CWnd* pParent = this; if (pParent != NULL && (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL) { int nIndexMax = ::GetMenuItemCount(hParentMenu); for (int nIndex = 0; nIndex < nIndexMax; nIndex++) { if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu) { state.m_pParentMenu = CMenu::FromHandle(hParentMenu); break; } } } } state.m_nIndexMax = pPopupMenu->GetMenuItemCount(); for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++) { state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex); if (state.m_nID == 0) continue; ASSERT(state.m_pOther == NULL); ASSERT(state.m_pMenu != NULL); if (state.m_nID == (UINT)-1) { state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex); if (state.m_pSubMenu == NULL || (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 || state.m_nID == (UINT)-1) { continue; } state.DoUpdate(this, TRUE); } else { state.m_pSubMenu = NULL; state.DoUpdate(this, FALSE); } UINT nCount = pPopupMenu->GetMenuItemCount(); if (nCount < state.m_nIndexMax) { state.m_nIndex -= (state.m_nIndexMax - nCount); while (state.m_nIndex < nCount && pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID) { state.m_nIndex++; } } state.m_nIndexMax = nCount; } } void CBoounionPLCDlg::OnDestroy() { CDialogEx::OnDestroy(); if (m_pTopToolbar != nullptr) { m_pTopToolbar->DestroyWindow(); delete m_pTopToolbar; m_pTopToolbar = nullptr; } if (m_pPagePlcList != nullptr) { m_pPagePlcList->DestroyWindow(); delete m_pPagePlcList; m_pPagePlcList = nullptr; } if (m_pMainContainer != nullptr) { m_pMainContainer->DestroyWindow(); delete m_pMainContainer; m_pMainContainer = nullptr; } if (m_pActiveView != nullptr) { m_pActiveView->DestroyWindow(); delete m_pActiveView; m_pActiveView = nullptr; } if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); m_hbrBkgnd = nullptr; } if (m_pObserver != nullptr) { m_pObserver->unsubscribe(); m_pObserver = NULL; } } void CBoounionPLCDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); if (m_pTopToolbar == nullptr || !::IsWindow(m_pTopToolbar->m_hWnd)) return; Resize(); } #define TOOLBAR_HEIGHT 78 #define PAGE_PLC_LIST_WIDTH 218 void CBoounionPLCDlg::Resize() { CRect rcClient, rcItem; GetClientRect(&rcClient); int x = 0; int y = 0; m_pTopToolbar->MoveWindow(0, 0, rcClient.Width(), TOOLBAR_HEIGHT); y += TOOLBAR_HEIGHT; m_pPagePlcList->MoveWindow(0, y, PAGE_PLC_LIST_WIDTH, rcClient.Height() - y - 2); x = PAGE_PLC_LIST_WIDTH; m_pMainContainer->MoveWindow(x + 1, y, rcClient.Width() - x - 0, rcClient.bottom - y - 2); } HBRUSH CBoounionPLCDlg::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 CBoounionPLCDlg::OnMenuFileSettings() { //CSettingsDlg dlg; //dlg.DoModal(); } void CBoounionPLCDlg::OnUpdateMenuFileSettings(CCmdUI* pCmdUI) { pCmdUI->Enable(FALSE); } void CBoounionPLCDlg::OnMenuFileExit() { PostMessage(WM_CLOSE); } void CBoounionPLCDlg::OnUpdateMenuFileExit(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); } void CBoounionPLCDlg::OnMenuHelpAbout() { CAboutDlg dlgAbout; dlgAbout.DoModal(); } LRESULT CBoounionPLCDlg::OnToolbarBtnClicked(WPARAM wParam, LPARAM lParam) { int id = (int)lParam; if (id == IDC_BUTTON_ADD) { static int i = 0; char szName[256]; sprintf_s(szName, 256, "PLC%d", ++i); theApp.m_model.addPlc(szName, "192.168.1.188", 1001); } else if (id == IDC_BUTTON_DELETE) { static int i = 0; i += 1; char szName[256]; sprintf_s(szName, 256, "PLC%d", i); theApp.m_model.removePlc(szName); } else if (id == IDC_BUTTON_SETTINGS) { } else if (id == IDC_BUTTON_OPERATOR) { /* int menuId = (int)wParam; UserManager& userManager = UserManager::getInstance(); if (menuId == 0) { CLoginDlg loginDlg; loginDlg.DoModal(); } else if (1 == menuId) { CChangePasswordDlg changePasswordDlg; changePasswordDlg.DoModal(); } else if (2 == menuId) { CUserManagerDlg dlg; if (dlg.DoModal() != IDOK) { logManager.log(SystemLogManager::LogType::Operation, _T("Óû§¹ÜÀíµÄÔ¤²Ù×÷±»È¡Ïû£¡")); } } else if (3 == menuId) { CSystemLogManagerDlg dlg; dlg.DoModal(); } else if (4 == menuId) { int ret = AfxMessageBox(_T("ÊÇ·ñÇл»Óû§£¿Çл»Óû§»áÍ˳öµ±Ç°Õ˺ţ¡"), MB_OKCANCEL | MB_ICONEXCLAMATION); if (ret != IDOK) { return 0; } logManager.log(SystemLogManager::LogType::Operation, _T("È·ÈÏÇл»½ÇÉ«£¡")); if (userManager.isLoggedIn()) { logManager.log(SystemLogManager::LogType::Info, _T("Í˳öµÇ¼£¡")); userManager.logout(); } CLoginDlg loginDlg; loginDlg.DoModal(); } else { CString cstrMessage; cstrMessage.Format(_T("ÊÇ·ñÍ˳öÓû§ [%s]£¿"), userManager.getCurrentUser().c_str()); int ret = AfxMessageBox(_T(cstrMessage), MB_OKCANCEL | MB_ICONEXCLAMATION); if (ret != IDOK) { return 0; } logManager.log(SystemLogManager::LogType::Info, _T("Í˳öµÇ¼£¡")); userManager.logout(); } UpdateLoginStatus(); */ } return 0; } LRESULT CBoounionPLCDlg::OnViewActive(WPARAM wParam, LPARAM lParam) { CBaseView* pView = (CBaseView*)wParam; int code = (int)lParam; if (code == MA_ACTIVATE || code == MA_ACTIVATEANDEAT) { } return 0; } LRESULT CBoounionPLCDlg::OnViewBtnClicked(WPARAM wParam, LPARAM lParam) { int id = (int)lParam; if (id == VIEW_TOOL_BTN_CLOSE) { CloseView((CBaseView*)wParam); } return 0; } LRESULT CBoounionPLCDlg::OnViewBtnMenuItem(WPARAM wParam, LPARAM lParam) { UINT id = (UINT)lParam; return 0; } CBaseView* CBoounionPLCDlg::CreatePlcView(CPLC* pPlc) { CPlcView* pDlg = new CPlcView(m_pMainContainer); pDlg->SetContext(pPlc); pDlg->Create(IDD_VIEW_PLC, m_pMainContainer); CString strIcon0, strIcon1, strIcon2, strIcon3; strIcon0.Format(_T("%s\\Res\\small_close0.ico"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); strIcon1.Format(_T("%s\\Res\\small_close1.ico"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); strIcon2.Format(_T("%s\\Res\\small_close2.ico"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); strIcon3.Format(_T("%s\\Res\\small_close3.ico"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); pDlg->AddToolBtn(VIEW_TOOL_BTN_CLOSE, (LPTSTR)(LPCTSTR)strIcon0, (LPTSTR)(LPCTSTR)strIcon1, (LPTSTR)(LPCTSTR)strIcon2, (LPTSTR)(LPCTSTR)strIcon3, "¹Ø±Õ"); pDlg->SetWindowText(pPlc->getName().c_str()); m_pMainContainer->Resize(); return pDlg; } void CBoounionPLCDlg::CloseView(CBaseView* pView) { pView->DestroyWindow(); delete (CBaseView*)pView; m_pActiveView = nullptr; m_pMainContainer->Resize(); }