// CPageCtrlState.cpp: 实现文件 // #include "stdafx.h" #include "Servo.h" #include "CPageCtrlState.h" #include "afxdialogex.h" #include "Common.h" #include "Model.h" #include "ColorTransfer.h" // CPageCtrlState 对话框 IMPLEMENT_DYNAMIC(CPageCtrlState, CDialogEx) CPageCtrlState::CPageCtrlState(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_PROD_CTRL_STATE, pParent) { } CPageCtrlState::~CPageCtrlState() { } void CPageCtrlState::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_BUTTON_OFFLINE, m_btnOffline); DDX_Control(pDX, IDC_BUTTON_ONLINE_LOCAL, m_btnOnlineLocal); DDX_Control(pDX, IDC_BUTTON_ONLINE_REMOTE, m_btnOnlineRemote); } BEGIN_MESSAGE_MAP(CPageCtrlState, CDialogEx) ON_WM_CTLCOLOR() ON_WM_SIZE() ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON_OFFLINE, &CPageCtrlState::OnBnClickedOffline) ON_BN_CLICKED(IDC_BUTTON_ONLINE_LOCAL, &CPageCtrlState::OnBnClickedOnlineLocal) ON_BN_CLICKED(IDC_BUTTON_ONLINE_REMOTE, &CPageCtrlState::OnBnClickedOnlineRemote) END_MESSAGE_MAP() // CPageCtrlState 消息处理程序 void CPageCtrlState::InitRxWindows() { IRxWindows* pRxWindows = RX_GetRxWindows(); if (m_pObserver == nullptr) { m_pObserver = pRxWindows->allocObserver([this](IAny* pAny) -> void { pAny->addRef(); const int code = pAny->getCode(); if (code == RX_CODE_CONTROL_STATE_CHANGED && ::IsWindow(m_hWnd)) { UpdateButtonStyles(); } pAny->release(); }, [&]() -> void { // onComplete }, [&](IThrowable* pThrowable) -> void { // onError pThrowable->printf(); }); theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread()) ->subscribe(m_pObserver); } } void CPageCtrlState::ApplyButtonTheme(CBlButton& btn, bool active) { const COLORREF text = active ? RGB(255, 255, 255) : RGB(0, 0, 0); const COLORREF normal = active ? RGB(34, 177, 76) : RGB(222, 222, 222); const COLORREF hover = CColorTransfer::ApproximateColor(normal, active ? 0.08 : 0.05); const COLORREF press = CColorTransfer::ApproximateColor(normal, active ? -0.10 : -0.12); const COLORREF frame = active ? CColorTransfer::ApproximateColor(normal, -0.18) : RGB(168, 168, 168); btn.SetRoundWidth(6); btn.SetTextColor(BS_NORMAL, text); btn.SetTextColor(BS_HOVER, text); btn.SetTextColor(BS_PRESS, text); btn.SetTextColor(BS_DISABLE, RGB(120, 120, 120)); btn.SetBkgndColor(BS_NORMAL, normal); btn.SetBkgndColor(BS_HOVER, hover); btn.SetBkgndColor(BS_PRESS, press); btn.SetBkgndColor(BS_DISABLE, RGB(210, 210, 210)); btn.SetFrameColor(BS_NORMAL, frame); btn.SetFrameColor(BS_HOVER, frame); btn.SetFrameColor(BS_PRESS, frame); btn.SetFrameColor(BS_DISABLE, RGB(180, 180, 180)); } void CPageCtrlState::UpdateButtonStyles() { const auto state = theApp.m_model.getControlState(); ApplyButtonTheme(m_btnOffline, state == ControlState::OfflineEquipment || state == ControlState::OfflineHost); ApplyButtonTheme(m_btnOnlineLocal, state == ControlState::OnlineLocal); ApplyButtonTheme(m_btnOnlineRemote, state == ControlState::OnlineRemote); Invalidate(); UpdateWindow(); } BOOL CPageCtrlState::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 InitRxWindows(); UpdateButtonStyles(); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } HBRUSH CPageCtrlState::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性 // TODO: 如果默认的不是所需画笔,则返回另一个画笔 return hbr; } void CPageCtrlState::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 } void CPageCtrlState::OnDestroy() { CDialogEx::OnDestroy(); // TODO: 在此处添加消息处理程序代码 } void CPageCtrlState::OnBnClickedOffline() { theApp.m_model.setControlState(ControlState::OfflineEquipment); } void CPageCtrlState::OnBnClickedOnlineLocal() { theApp.m_model.setControlState(ControlState::OnlineLocal); } void CPageCtrlState::OnBnClickedOnlineRemote() { theApp.m_model.setControlState(ControlState::OnlineRemote); }