// ToolDialog.cpp : 实现文件 // #include "stdafx.h" #include "GetInt.h" #include "ToolDialog.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CToolDialog 对话框 IMPLEMENT_DYNAMIC(CToolDialog, CBCGPDialog) CToolDialog::CToolDialog(CWnd* pParent /*=NULL*/) : CBCGPDialog(IDD_DIALOG, pParent) , m_Value(0) , m_nHigh(99) , m_nLow(0) , m_nTime(1000) { EnableVisualManagerStyle(TRUE, TRUE); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_nViaueMode = 0; } void CToolDialog::DoDataExchange(CDataExchange* pDX) { CBCGPDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_TOOLBAR_LOCATION, m_wndToolbarLocation); DDX_Text(pDX, IDC_EDIT_VALUE, m_Value); DDX_Text(pDX, IDC_EDIT1, m_nHigh); DDV_MinMaxInt(pDX, m_nHigh, -999999, 999999); DDX_Text(pDX, IDC_EDIT2, m_nLow); DDV_MinMaxInt(pDX, m_nLow, -999999, 999999); DDX_Control(pDX, IDC_EDIT_VALUE, m_wndValve); DDX_Text(pDX, IDC_EDIT3, m_nTime); DDV_MinMaxInt(pDX, m_nTime, 10, 1000); } BEGIN_MESSAGE_MAP(CToolDialog, CBCGPDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDOK, &CToolDialog::OnBnClickedOk) ON_BN_CLICKED(IDC_MAIN_EXECUTE, &CToolDialog::onExecute) ON_BN_CLICKED(IDC_MAIN_UPDATE, &CToolDialog::onUpdate) ON_WM_TIMER() ON_BN_CLICKED(IDC_RADIO1, &CToolDialog::OnBnClickedRadio1) ON_BN_CLICKED(IDC_RADIO2, &CToolDialog::OnBnClickedRadio2) ON_BN_CLICKED(IDC_RADIO3, &CToolDialog::OnBnClickedRadio3) ON_BN_CLICKED(IDC_RADIO4, &CToolDialog::OnBnClickedRadio4) ON_BN_CLICKED(IDC_RADIO5, &CToolDialog::OnBnClickedRadio5) END_MESSAGE_MAP() // CToolDialog 消息处理程序 BOOL CToolDialog::OnInitDialog() { CBCGPDialog::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // Create toolbar: m_wndToolBar.Create(this); m_wndToolBar.SetControlVisualMode(this); m_wndToolBar.LoadToolBar(IDR_MAINFRAME, 0, 0, TRUE /* Locked bar */, 0, 0, IDB_TOOLBAR_HC); m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); m_wndToolBar.SetBarStyle( m_wndToolBar.GetBarStyle() & ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT)); CSize sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE, TRUE); // Set ToolBar position and size: CRect rectToolBar; m_wndToolbarLocation.GetWindowRect(&rectToolBar); ScreenToClient(&rectToolBar); m_wndToolBar.SetWindowPos(&wndTop, rectToolBar.left, rectToolBar.top, sizeToolBar.cx, sizeToolBar.cy, SWP_NOACTIVATE); // m_wndToolBar.SetOwner (m_pMenuFrame); // All commands will be routed via this dialog, not via the parent frame: m_wndToolBar.SetRouteCommandsViaFrame(FALSE); // TODO: 在此添加额外的初始化代码 ((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上 SetTimer(1, 1000, NULL); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CToolDialog::OnSysCommand(UINT nID, LPARAM lParam) { CBCGPDialog::OnSysCommand(nID, lParam); } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CToolDialog::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 { CBCGPDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CToolDialog::OnQueryDragIcon() { return static_cast(m_hIcon); } void CToolDialog::OnBnClickedOk() { UpdateData(TRUE); SetTimer(1, m_nTime, NULL); CBCGPDialog::OnOK(); } void CToolDialog::onExecute() { try { this->execOnExecuteCallBack(m_strToolName); } catch (...) { execLogCallBack(MSG_WAY::_ERROR, _T("onExecute Error...")); } } void CToolDialog::onUpdate() { //设置元素名列表 UpdateData(TRUE); SetTimer(1, m_nTime, NULL); } void CToolDialog::Running(bool bRun) { } void CToolDialog::Serialize(CArchive& ar) { int paranum;//参数数量 if (ar.IsStoring())//保存参数流程 { // storing code paranum = 6; ar << paranum;//先保存参数数量 //将枚举类型强制转换为int ar << (int)0 << m_Value; ar << (int)1 << m_nHigh; ar << (int)2 << m_nLow; ar << (int)3 << m_nTime; ar << (int)4 << m_Value; ar << (int)5 << m_nViaueMode; } else//加载参数流程,参数加载顺序一定要跟保存顺序一致 { // loading code { int para; ar >> paranum;//读取参数数量 for (int i = 0; i < paranum; i++) { ar >> para; switch (para) { case 0: ar >> m_Value; break; case 1: ar >> m_nHigh; break; case 2: ar >> m_nLow; break; case 3: ar >> m_nTime; break; case 4: ar >> m_Value; break; case 5: ar >> m_nViaueMode; break; default: { execLogCallBack(MSG_WAY::_ERROR, _T("配置文档错误!")); } break; } } SetTimer(1, m_nTime, NULL); } switch (m_nViaueMode) { case 0: { ((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上 ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO3))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO4))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO5))->SetCheck(FALSE);//不选上 } break; case 1: { ((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//选上 ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(TRUE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO3))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO4))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO5))->SetCheck(FALSE);//不选上 } break; case 2: { ((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//选上 ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO3))->SetCheck(TRUE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO4))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO5))->SetCheck(FALSE);//不选上 } break; case 3: { ((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//选上 ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO3))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO4))->SetCheck(TRUE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO5))->SetCheck(FALSE);//不选上 } break; case 4: { ((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//选上 ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO3))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO4))->SetCheck(FALSE);//不选上 ((CButton *)GetDlgItem(IDC_RADIO5))->SetCheck(TRUE);//不选上 m_Value = 0; } break; default: break; } UpdateData(FALSE); } } EVEN CToolDialog::GetEvent() { m_Even.hEvenHandle = NULL; //如该工具不启用事件功能,请注释以下语句 m_Even.hEvenHandle = CreateEventW(NULL, TRUE, FALSE, NULL); //在需要的地方用以下语句设置事件和手动复位 // SetEvent(m_Even.hEvenHandle); // ResetEvent(m_Even.hEvenHandle); return m_Even; } int CToolDialog::Execute() { if (m_nViaueMode != 4) { EVEN m_Even = this->m_Even; if (m_Even.hEvenHandle != NULL) { DWORD dw = WaitForSingleObject(m_Even.hEvenHandle, m_Even.nEvenTime);//等待重置事件 if (dw == WAIT_TIMEOUT) { return RT_TIMEOUT; } } ResetEvent(m_Even.hEvenHandle); m_Value1 = (int)m_Value; } else { DWORD t = timeGetTime(); CString str; str.Format(_T("%u"), t); str = str.Mid(4); double a = _tcstod(str, 0); m_Value1 = (float)a; m_Value = (int)m_Value1; str.Format(_T("%.0f"), m_Value1); m_wndValve.SetWindowTextW(str); } m_hvTestValue = HTuple(); m_hvTestValue[0] = m_Value1; m_hvTestValue[1] = 22222; m_hvTestValue[2] = 99999; return 0; } void CToolDialog::execToolStateCallBack(int nState) { if (m_pReceToolStateFunction != NULL) { m_pReceToolStateFunction(m_strToolName, nState, m_ToolStateUserParam); } } void CToolDialog::execLogCallBack(MSG_WAY nType, CString strMassage) { if (m_pReceLogFunction != NULL) { m_pReceLogFunction(m_strToolName, nType, strMassage, m_LogUserParam); } } void CToolDialog::execOnExecuteCallBack(CString strToolName) { if (m_pReceOnExecuteFunction != NULL) { m_pReceOnExecuteFunction(strToolName, m_OnExecuteUserParam); } } void CToolDialog::execToolBusyCallBack(int nState, CString strMassage) { if (m_pReceToolBusyFunction != NULL) { m_pReceToolBusyFunction(m_strToolName, nState, strMassage, m_ToolStateUserParam); } } static int GenRandNumber1(const int nLow, const int nHigh) { return rand() % (nHigh - nLow + 1) + nHigh; } void CToolDialog::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 switch (m_nViaueMode) { case 0://随机 { m_Value = GenRandNumber1(m_nHigh, m_nLow); m_Value1 = m_Value; } break; case 1://累加 { m_Value++; if (m_Value > m_nHigh) { m_Value = m_nLow; } m_Value1 = m_Value; } break; case 2://累减 { m_Value--; if (m_Value < m_nLow) { m_Value = m_nHigh; } m_Value1 = m_Value; } break; case 3://固定 { m_Value1 = m_Value; } break; default: break; } // CString str; // str.Format(_T("Vilue= %d"), m_Value); // execLogCallBack(MSG_WAY::_INFO, str); SetEvent(m_Even.hEvenHandle); //if (m_nViaueMode != 3) { CString str; str.Format(_T("%d"), m_Value); m_wndValve.SetWindowTextW(str); } //UpdateData(FALSE); CBCGPDialog::OnTimer(nIDEvent); } void CToolDialog::OnBnClickedRadio1() { // TODO: 在此添加控件通知处理程序代码 m_nViaueMode = 0; } void CToolDialog::OnBnClickedRadio2() { // TODO: 在此添加控件通知处理程序代码 m_nViaueMode = 1; } void CToolDialog::OnBnClickedRadio3() { // TODO: 在此添加控件通知处理程序代码 m_nViaueMode = 2; } void CToolDialog::OnBnClickedRadio4() { // TODO: 在此添加控件通知处理程序代码 m_nViaueMode = 3; } void CToolDialog::OnBnClickedRadio5() { // TODO: 在此添加控件通知处理程序代码 m_nViaueMode = 4; }