/ / GlobalValue.cpp : 实现文件 // #include "stdafx.h" #include "VisionPlus.h" #include "GlobalValue.h" #include "afxdialogex.h" #include "GlobalSetting.h" // CGlobalValue 对话框 IMPLEMENT_DYNAMIC(CGlobalValue, CBCGPDialog) CGlobalValue::CGlobalValue(CWnd* pParent /*=NULL*/) : CBCGPDialog(IDD_GLOBALVALUE, pParent) { EnableVisualManagerStyle(TRUE, TRUE); m_nRow = 0; m_nCol = 0; m_pDllPtr = NULL; } CGlobalValue::~CGlobalValue() { if (m_pDllPtr) { delete m_pDllPtr; m_pDllPtr = NULL; } } void CGlobalValue::DoDataExchange(CDataExchange* pDX) { CBCGPDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_GLOBLE_VAR, m_wndGlobleVar); DDX_Control(pDX, IDC_GV_ANNOTATION, m_wndEdit); } BEGIN_MESSAGE_MAP(CGlobalValue, CBCGPDialog) ON_BN_CLICKED(IDC_GV_ADD_INT, &CGlobalValue::OnBnClickedGvAddInt) ON_BN_CLICKED(IDC_GV_ADD_STR, &CGlobalValue::OnBnClickedGvAddStr) ON_BN_CLICKED(IDC_GV_ADD_BOOL, &CGlobalValue::OnBnClickedGvAddBool) ON_BN_CLICKED(IDC_GV_DELETE, &CGlobalValue::OnBnClickedGvDelete) ON_EN_KILLFOCUS(IDC_GV_ANNOTATION, &CGlobalValue::OnEnKillfocusGvAnnotation) ON_WM_SHOWWINDOW() ON_BN_CLICKED(IDC_GV_ADD_FLOAT, &CGlobalValue::OnBnClickedGvAddFloat) ON_NOTIFY(NM_DBLCLK, IDC_GLOBLE_VAR, &CGlobalValue::OnNMDblclkGlobleVar) END_MESSAGE_MAP() // CGlobalValue 消息处理程序 // 清空所有控件 void CGlobalValue::Clear() { m_GV_Tools.Interfaces.clear(); m_wndGlobleVar.DeleteAllItems(); for (int i = 0; i < 999; i++) { m_bool_VarLink[i] = false; m_int_VarLink[i] = 0; m_string_VarLink[i].Empty(); } } BOOL CGlobalValue::OnInitDialog() { CBCGPDialog::OnInitDialog(); // TODO: 在此添加额外的初始化 m_wndGlobleVar.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); m_wndGlobleVar.DeleteAllItems(); // 添加控件内容 m_wndGlobleVar.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 50); m_wndGlobleVar.InsertColumn(1, _T("变量类型"), LVCFMT_LEFT, 70); m_wndGlobleVar.InsertColumn(2, _T("变量名称"), LVCFMT_LEFT, 150); m_wndGlobleVar.InsertColumn(3, _T("变量数值"), LVCFMT_LEFT, 150); m_wndGlobleVar.InsertColumn(4, _T("变量注释"), LVCFMT_LEFT, 150); for (int i = 0; i < 999; i++) { m_bool_VarLink[i] = false; m_int_VarLink[i] = 0; m_string_VarLink[i].Empty(); } ////////////////////////////////////////////////////////////////////////// m_pDllPtr = new CDllTool(); m_GV_Tools.strName = _T("GlobalValue"); m_GV_Tools.strShowName = _T("GlobalValue"); m_GV_Tools.strDll = _T("GlobalValue"); m_GV_Tools.nUseCount = 1; m_GV_Tools.nToolID = TASK_SYSTEM_GV; m_GV_Tools.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_GV_Tools.pDllPtr = m_pDllPtr; return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } // 执行序列化 BOOL CGlobalValue::DoSerialize(CArchive& ar) { // 序列化 if (ar.IsStoring()) { return DoSerializeOut(ar); } else { if (g_nDocVersion > 102) { theApp.UpdateSplash(_T("CGlobalValue::DoSerialize()")); return DoSerializeIn(ar); } return TRUE; } return TRUE; } /////////////////////////////////////////////////// // 保存控件信息到文件中 BOOL CGlobalValue::DoSerializeOut(CArchive& ar) { // 写入总数量 int nParanum = 2; ar << nParanum; //具体参数 ar << (int)1 << (UINT)m_GV_Tools.Interfaces.size(); ar << (int)2 << (UINT)m_GV_Tools.Interfaces.size(); nParanum = 7;//以下参数的数量 ar << nParanum;//先保存参数数量 ar << (UINT)m_GV_Tools.Interfaces.size(); for (UINT i = 0; i < m_GV_Tools.Interfaces.size(); i++) { TOOL_INTERFACE inf = m_GV_Tools.Interfaces[i]; ar << (int)1 << inf.nIndex; ar << (int)2 << inf.InfDirection; ar << (int)3 << inf.strName; ar << (int)4 << (int)inf.VarType; ar << (int)5 << inf.strInfo; ar << (int)6 << inf.strParentName; ar << (int)7 << inf.strParentName; } for (int i = 0; i < 999; i++) { ar << m_int_VarLink[i]; } for (int i = 0; i < 999; i++) { ar << m_flot_VarLink[i]; } for (int i = 0; i < 999; i++) { ar << m_string_VarLink[i]; } for (int i = 0; i < 999; i++) { ar << m_bool_VarLink[i]; } return TRUE; } /////////////////////////////////////////////////// // 从文件中加载控件信息 BOOL CGlobalValue::DoSerializeIn(CArchive& ar) { // 参数数量 int nParanum = 0; int nSize = 0; int nPpara = 0; ar >> nParanum;//读取参数数量 for (int i = 0; i < nParanum; i++) { ar >> nPpara; switch (nPpara) { case 1: ar >> (UINT&)nSize; break; case 2: ar >> (UINT&)nSize; break; default: CString strMsg; strMsg.Format(_T("加载失败! 配置文档错误! ")); USES_CONVERSION; char * s_str = T2A(strMsg); g_Logger.Error(0, __FILE__, __LINE__, s_str); return FALSE; } } ar >> nParanum;//读取参数数量 ar >> nSize; if (g_nDocVersion > 105) { for (int i = 0; i < nSize; i++) { TOOL_INTERFACE inf; for (int j = 0; j < nParanum; j++) { ar >> nPpara; switch (nPpara) { case 1: ar >> inf.nIndex; break;// case 2: ar >> (int&)inf.InfDirection; break;// case 3: ar >> inf.strName; break;// case 4: ar >> (int&)inf.VarType; break;// case 5: ar >> inf.strInfo; break;// case 6: ar >> inf.strParentName; break;// case 7: ar >> inf.strParentName; break;// default: CString strMsg; strMsg.Format(_T("加载失败! 配置文档错误! ")); USES_CONVERSION; char * s_str = T2A(strMsg); g_Logger.Error(0, __FILE__, __LINE__, s_str); return FALSE; break; } } if (inf.VarType == VAR_TYPE::Bool_Var) { inf.pValue = (LPVOID*)&m_bool_VarLink[m_GV_Tools.Interfaces.size()]; } else if (inf.VarType == VAR_TYPE::Int_Var) { inf.pValue = (LPVOID*)&m_int_VarLink[m_GV_Tools.Interfaces.size()]; } else if (inf.VarType == VAR_TYPE::CString_Var) { inf.pValue = (LPVOID*)&m_string_VarLink[m_GV_Tools.Interfaces.size()]; } else if (inf.VarType == VAR_TYPE::float_Var) { inf.pValue = (LPVOID*)&m_flot_VarLink[m_GV_Tools.Interfaces.size()]; } else { CString strMsg; strMsg.Format(_T("%s 数据类型暂时不支持"), inf.VarType); USES_CONVERSION; char * s_str = T2A(strMsg); g_Logger.Error(0, __FILE__, __LINE__, s_str); return FALSE; } m_GV_Tools.Interfaces.push_back(inf); } } if (g_nDocVersion > 107) { for (int i = 0; i < 999; i++) { ar >> m_int_VarLink[i]; } for (int i = 0; i < 999; i++) { ar >> m_flot_VarLink[i]; } for (int i = 0; i < 999; i++) { ar >> m_string_VarLink[i]; } for (int i = 0; i < 999; i++) { ar >> m_bool_VarLink[i]; } } UpdateUI(); return TRUE; } void CGlobalValue::OnBnClickedGvAddInt() { // TODO: 在此添加控件通知处理程序代码 TOOL_INTERFACE inf; CString strName; strName.Format(_T("GlobleVar[%d].int"), m_GV_Tools.Interfaces.size()); inf.strParentName = SYSTEM_ROOT; inf.nIndex = (int)m_GV_Tools.Interfaces.size() + 1; inf.InfDirection = INF_OUT; inf.InfType = INF_TYPE::INF_VALUE_1; inf.strName = strName; inf.VarType = VAR_TYPE::Int_Var; inf.strInfo = _T("添加了一个 int 型变量"); inf.pValue = (LPVOID*)&m_int_VarLink[m_GV_Tools.Interfaces.size()]; m_GV_Tools.Interfaces.push_back(inf); UpdateUI(); } void CGlobalValue::OnBnClickedGvAddStr() { // TODO: 在此添加控件通知处理程序代码 TOOL_INTERFACE inf; CString strName; strName.Format(_T("GlobleVar[%d].CString"), m_GV_Tools.Interfaces.size()); inf.strParentName = SYSTEM_ROOT; inf.nIndex = (int)m_GV_Tools.Interfaces.size() + 1; inf.InfDirection = INF_OUT; inf.InfType = INF_TYPE::INF_VALUE_1; inf.strName = strName; inf.VarType = VAR_TYPE::CString_Var; inf.strInfo = _T("添加了一个 string 型变量"); inf.pValue = (LPVOID*)&m_string_VarLink[m_GV_Tools.Interfaces.size()]; m_GV_Tools.Interfaces.push_back(inf); UpdateUI(); } void CGlobalValue::OnBnClickedGvAddBool() { // TODO: 在此添加控件通知处理程序代码 TOOL_INTERFACE inf; CString strName; strName.Format(_T("GlobleVar[%d].bool"), m_GV_Tools.Interfaces.size()); inf.strParentName = SYSTEM_ROOT; inf.nIndex = (int)m_GV_Tools.Interfaces.size() + 1; inf.InfDirection = INF_OUT; inf.InfType = INF_TYPE::INF_VALUE_1; inf.strName = strName; inf.VarType = VAR_TYPE::Bool_Var; inf.strInfo = _T("添加了一个 bool 型变量"); inf.pValue = (LPVOID*)&m_bool_VarLink[m_GV_Tools.Interfaces.size()]; m_GV_Tools.Interfaces.push_back(inf); UpdateUI(); } void CGlobalValue::OnBnClickedGvAddFloat() { // TODO: 在此添加控件通知处理程序代码 TOOL_INTERFACE inf; CString strName; strName.Format(_T("GlobleVar[%d].float"), m_GV_Tools.Interfaces.size()); inf.strParentName = SYSTEM_ROOT; inf.nIndex = (int)m_GV_Tools.Interfaces.size() + 1; inf.InfDirection = INF_OUT; inf.InfType = INF_TYPE::INF_VALUE_1; inf.strName = strName; inf.VarType = VAR_TYPE::float_Var; inf.strInfo = _T("添加了一个 float 型变量"); inf.pValue = (LPVOID*)&m_flot_VarLink[m_GV_Tools.Interfaces.size()]; m_GV_Tools.Interfaces.push_back(inf); UpdateUI(); } void CGlobalValue::OnBnClickedGvDelete() { // TODO: 在此添加控件通知处理程序代码 // if (m_GV_Tools.Interfaces.size()>0) // { // m_GV_Tools.Interfaces.pop_back(); // UpdateUI(); // } } void CGlobalValue::UpdateUI() { m_GV_Tools.pDllPtr->InterfaceClear(); m_wndGlobleVar.DeleteAllItems(); CString strNoble; // 遍历所有类别 for (unsigned int i = 0; i < m_GV_Tools.Interfaces.size(); i++) { TOOL_INTERFACE inf = m_GV_Tools.Interfaces[i]; strNoble.Format(_T("%d"), i + 1); m_wndGlobleVar.InsertItem(i, strNoble);// 序号 CString strVar; if (inf.VarType == VAR_TYPE::Bool_Var) { m_bool_VarLink[i] ? strVar.Format(_T("TRUE")) : strVar.Format(_T("FALSE")); } else if (inf.VarType == VAR_TYPE::Int_Var) { strVar.Format(_T("%d"), m_int_VarLink[i]); } else if (inf.VarType == VAR_TYPE::CString_Var) { strVar.Format(_T("%s"), m_string_VarLink[i]); } else if (inf.VarType == VAR_TYPE::float_Var) { strVar.Format(_T("%.5f"), m_flot_VarLink[i]); } CString str; str.Format(_T("%s"), g_VatTypeMap.GetVarTypeName(inf.VarType)); m_wndGlobleVar.SetItemText(i, 1, str);//类型 需要修改为显示数据类型 m_wndGlobleVar.SetItemText(i, 2, inf.strName);//变量名称 m_wndGlobleVar.SetItemText(i, 3, strVar);//变量数据 m_wndGlobleVar.SetItemText(i, 4, inf.strInfo);//变量注释 DLL_INF Dllinf; Dllinf.strName = inf.strName; Dllinf.InfDirection = INF_DIRECTION::INF_INOUT; Dllinf.InfWay = inf.InfWay; Dllinf.pValue = inf.pValue; m_GV_Tools.pDllPtr->AddInterface(Dllinf); } } void CGlobalValue::OnOK() { // TODO: 在此添加专用代码和/或调用基类 //CBCGPDialog::OnOK(); } void CGlobalValue::OnShowWindow(BOOL bShow, UINT nStatus) { CBCGPDialog::OnShowWindow(bShow, nStatus); // TODO: 在此处添加消息处理程序代码 if (bShow) { UpdateUI(); } } /////////////////////////////////////////////////////////////// // 根据Interface获取Interface TOOL_INTERFACE* CGlobalValue::GetInterfaceByInterface(TOOL_INTERFACE& inf) { for (unsigned int n = 0; n < m_GV_Tools.Interfaces.size(); n++) { TOOL_INTERFACE& infSearch = m_GV_Tools.Interfaces[n]; if (IsSameInterface(inf, infSearch)) { return &infSearch; } } return NULL; } //////////////////////////////////////////////////////////////////// // 判断是否是同一个接口 bool CGlobalValue::IsSameInterface(const TOOL_INTERFACE& source, const TOOL_INTERFACE& dest) { return source.strParentName == dest.strParentName && source.strName == dest.strName && source.InfDirection == dest.InfDirection && source.InfWay == dest.InfWay; } void CGlobalValue::OnNMDblclkGlobleVar(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; CString strTemp; NM_LISTVIEW *pNMListView = (NM_LISTVIEW *)pNMHDR; m_nRow = pNMListView->iItem; m_nCol = pNMListView->iSubItem; DWORD dwPos = GetMessagePos(); CPoint point(LOWORD(dwPos), HIWORD(dwPos)); m_wndGlobleVar.ScreenToClient(&point); LVHITTESTINFO lvinfo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; int nItem = m_wndGlobleVar.SubItemHitTest(&lvinfo); if (m_nCol == 4 || m_nCol == 3) { CRect rect; m_wndGlobleVar.GetSubItemRect(m_nRow, m_nCol, LVIR_LABEL, rect); m_wndEdit.SetParent(&m_wndGlobleVar); m_wndEdit.MoveWindow(rect); m_wndEdit.SetWindowText(m_wndGlobleVar.GetItemText(m_nRow, m_nCol)); m_wndEdit.ShowWindow(SW_SHOW); m_wndEdit.SetFocus(); m_wndEdit.ShowCaret(); m_wndEdit.SetSel(-1); } UpdateUI(); } void CGlobalValue::OnEnKillfocusGvAnnotation() { // TODO: 在此添加控件通知处理程序代码 CString str; m_wndEdit.GetWindowText(str); m_wndGlobleVar.SetItemText(m_nRow, m_nCol, str); m_wndEdit.ShowWindow(SW_HIDE); if (str.IsEmpty()) { return; } if (m_GV_Tools.Interfaces.size() > m_nRow) { TOOL_INTERFACE inf = m_GV_Tools.Interfaces[m_nRow]; if (m_nCol == 4) { m_wndGlobleVar.SetItemText(m_nRow, 4, str); //设置编辑框的新内容 TOOL_INTERFACE& inf = m_GV_Tools.Interfaces[m_nRow]; inf.strInfo = str; } else { m_wndGlobleVar.SetItemText(m_nRow, 3, str); //设置编辑框的新内容 TOOL_INTERFACE& inf = m_GV_Tools.Interfaces[m_nRow]; //inf.strInfo = tem; if (inf.VarType == VAR_TYPE::Bool_Var) { int b = _wtoi(str); b == (int)1 ? m_bool_VarLink[m_nRow] = true : m_bool_VarLink[m_nRow] = false; m_GV_Tools.Interfaces[m_nRow].pValue = (LPVOID*)&m_bool_VarLink[m_nRow]; } else if (inf.VarType == VAR_TYPE::Int_Var) { int b = _wtoi(str); m_int_VarLink[m_nRow] = b; m_GV_Tools.Interfaces[m_nRow].pValue = (LPVOID*)&m_int_VarLink[m_nRow]; } else if (inf.VarType == VAR_TYPE::CString_Var) { m_string_VarLink[m_nRow] = str; m_GV_Tools.Interfaces[m_nRow].pValue = (LPVOID*)&m_string_VarLink[m_nRow]; } else if (inf.VarType == VAR_TYPE::float_Var) { double b = _wtof(str); m_flot_VarLink[m_nRow] = (float)b; m_GV_Tools.Interfaces[m_nRow].pValue = (LPVOID*)&m_flot_VarLink[m_nRow]; } } UpdateUI(); } }