MFC开发xml编辑器小结
生活随笔
收集整理的這篇文章主要介紹了
MFC开发xml编辑器小结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MFC開發xml編輯器整理
xml格式如下所示:
<CalibrationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><CalConfig name="TEST"><CalPath number="1" name="ANT0" data="2022-10-11 20:05:51" dayLimit="999"><CalPoint key="822.500" value="1100"/><CalPoint key="1745.00" value="0.72"/><CalPoint key="1747.50" value="0.71"/> </CalPath><CalPath number="2" name="ANT1" data="2022-10-11 20:05:51" dayLimit="999"><CalPoint key="195000" value="1500"/><CalPoint key="1784.90" value="0.78"/><CalPoint key="1785.00" value="0.78"/><CalPoint key="1805.00" value="0.80"/><CalPoint key="1840.00" value="0.68"/></CalPath><CalPath number="3" name="ANT2" data="2022-10-11 20:05:51" dayLimit="999"><CalPoint key="192500" value="4100"/></CalPath><CalPath number="4" name="ANT3" data="2022-10-11 20:05:51" dayLimit="999"><CalPoint key="192500" value="2900"/></CalPath><CalPath number="5" name="ANT4" data="2022-10-11 20:05:51" dayLimit="999"><CalPoint key="35000" value="3200"/></CalPath></CalConfig> </CalibrationData>設計步驟:
1.拖入treeControl控件,創建變量m_tree,用于顯示TEST節點下的子節點CalPath
向tree插入節點
2.拖入listControl控件,創建變量m_list,用于顯示子節點CalPoint 的屬性值
表格中插入表頭信息,并設置格式
雙擊表格實現內容可編輯,需要往界面上拖入Edit Control控件
OnDblclkList(NMHDR *pNMHDR, LRESULT *pResult) {LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知處理程序代碼NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;m_hitRow = pNMListView->iItem;//獲得選中的行m_hitCol = pNMListView->iSubItem;//獲得選中列if (m_hitRow != -1 && m_hitCol != -1 ){/*if (pNMListView->iSubItem == 0){return;//設置第一列不可編輯}*/CRect rect;m_list.GetSubItemRect(m_hitRow, m_hitCol, LVIR_LABEL, rect);m_editListCtrl.SetWindowText(m_list.GetItemText(m_hitRow, m_hitCol));m_editListCtrl.SetParent(&m_list);m_editListCtrl.MoveWindow(&rect, TRUE);m_editListCtrl.ShowWindow(TRUE);m_editListCtrl.SetFocus();m_editListCtrl.ShowCaret();//顯示光標m_editListCtrl.SetSel(-1);}*pResult = 0; }編輯框中的光標消失后,將數據保存到表格中
OnKillfocusEdit() {// TODO: 在此添加控件通知處理程序代碼CString str;m_editListCtrl.GetWindowText(str); //得到用戶輸入的新的內容m_list.SetItemText(m_hitRow, m_hitCol, str); //設置編輯框的新內容m_editListCtrl.ShowWindow(SW_HIDE); //應用編輯框//同步節點中保存的信息if (!m_hEditItem){return;}CString text = m_tree.GetItemText(m_hEditItem); //CalPoint節點,將界面上修改的參數保存到m_mapDataMTmap<CString, CalPath>::iterator ite = m_mapDataMT.find(text);if (ite == m_mapDataMT.end()){return;}vector<map<CString, CString>>& vecCalPoint = ite->second.CalPathList;//修改數據的行數要小于vecCalPoint容器大小if (m_hitRow < (int)vecCalPoint.size()){map<CString, CString>& mapCalPoint = vecCalPoint[m_hitRow];if (0 == m_hitCol){mapCalPoint[L"freq"] = str;} else if (1 == m_hitCol){mapCalPoint[L"loss"] = str;}} }3.本文借用MSXML讀取和修改xml屬性值,需要在頭文件 #import <msxml4.dll> 這是微軟庫
ReadXml(CString strXmlPath, bool bModify) {if (strXmlPath.IsEmpty()){MessageBox(_T("xml文件名為空"), _T("錯誤"), MB_ICONERROR);}MSXML2::IXMLDOMDocumentPtr pDoc;::CoInitialize(NULL);HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if (!SUCCEEDED(hr)) { MessageBox(_T("創建DOMDocument對象失敗。\n請檢查運行環境"), _T("錯誤"), MB_ICONERROR); return;}// 讀取xmlpDoc->put_async(VARIANT_FALSE);VARIANT_BOOL bhr = pDoc->load((_variant_t)strXmlPath);if (bhr != VARIANT_TRUE) {MessageBox(_T("無法正確讀取xml文件"), _T("錯誤"), MB_ICONERROR);return;}// 根節點取得MSXML2::IXMLDOMElementPtr root = pDoc->documentElement;// 取得根節點的名字_variant_t strRootName = root->nodeName;_bstr_t wstrRootName(strRootName.bstrVal);MSXML2::IXMLDOMNodeListPtr nodeList = root->GetchildNodes();// 解析CalibrationData的子節點ReadCalConfig(nodeList, bModify);if (bModify){pDoc->save((_variant_t)strXmlPath);} } ReadCalConfig(MSXML2::IXMLDOMNodeListPtr nodeList, bool bModify ) {int ilength = nodeList->Getlength();for (int nodeCount = 0; nodeCount < ilength; nodeCount++) {MSXML2::IXMLDOMNodePtr nodePtr = nodeList->nextNode();_variant_t strNodeName = nodePtr->GetnodeName();_variant_t strNodeValue = nodePtr->GetnodeValue();// 取得節點的屬性值MSXML2::IXMLDOMNamedNodeMapPtr pDOMAttrList= nodePtr->Getattributes();MSXML2::IXMLDOMNodePtr pDOMAttr= pDOMAttrList->Getitem(0); CString cstrValue = (CString)(char*)pDOMAttr->GetnodeName();if (0 == CString(L"name").CompareNoCase(cstrValue)){CString strName =pDOMAttr->GetnodeTypedValue();//向combox插入CalConfig節點列表m_comNodeList.AddString(strName);int nSel = m_comNodeList.GetCurSel();CString cstrEditNode = _T("");if (nSel > -1){m_comNodeList.GetLBText(nSel, cstrEditNode);}//判斷combox控件中,當前名字是否跟xml的節點名字一樣if (cstrEditNode == strName && bModify){ReadCalPath(nodePtr->GetchildNodes(), true);}else if (cstrEditNode == strName && !bModify){m_hCalConfig = m_tree.InsertItem(strName);// 讀取指定節點的 CalConfig節點下的子節點ReadCalPath(nodePtr->GetchildNodes());}}} } ReadCalPath(MSXML2::IXMLDOMNodeListPtr nodeList, bool bModify) {CString strNo; CString strNumber; // numberCString strName; // namefor (int nodeCount = 0; nodeCount < nodeList->Getlength(); nodeCount++){MSXML2::IXMLDOMNodePtr nodePtr = nodeList->nextNode();_variant_t strCaseNodeName = nodePtr->GetnodeName();//獲取節點的名字_variant_t strCaseNodeValue = nodePtr->Gettext();//獲取節點內的值BSTR bStrTemp = strCaseNodeName.bstrVal;CString strTemp = CString(bStrTemp);SysFreeString(bStrTemp);CString strNodeName = strTemp;// 節點有屬性值if (0 == strNodeName.CompareNoCase(_T("CalPath"))){strNumber.Empty();strName.Empty();// 取得節點的屬性值MSXML2::IXMLDOMNamedNodeMapPtr pDOMAttrList= nodePtr->Getattributes();for (int j = 0; j < pDOMAttrList->Getlength(); j++){MSXML2::IXMLDOMNodePtr pDOMAttr= pDOMAttrList->Getitem(j); CString cstrValue = (CString)(char*)pDOMAttr->GetnodeName();if (0 == CString(L"number").CompareNoCase(cstrValue)){strNumber = pDOMAttr->GetnodeTypedValue();} else if (0 == CString(L"name").CompareNoCase(cstrValue)){strName =pDOMAttr->GetnodeTypedValue();//向樹控件插入節點if (!bModify){m_tree.InsertItem(strName, m_hCalConfig);}}}}if (bModify){//修改xml節點的值ModifyCalPoint(nodePtr->GetchildNodes(), strName);}else{//只讀xml節點的值ReadCalPoint(nodePtr->GetchildNodes(), strName);}} } ReadCalPoint(MSXML2::IXMLDOMNodeListPtr nodeList, CString cstr) {CString strNo; CString strKey; // keyCString strValue; // valuevector<map<CString, CString>> vecCalPath;for (int nodeCount = 0; nodeCount < nodeList->Getlength(); nodeCount++){MSXML2::IXMLDOMNodePtr nodePtr = nodeList->nextNode();_variant_t strCaseNodeName = nodePtr->GetnodeName();_variant_t strCaseNodeValue = nodePtr->Gettext();BSTR bStrTemp = strCaseNodeName.bstrVal;CString strTemp = CString(bStrTemp);SysFreeString(bStrTemp);CString strNodeName = strTemp;// 節點沒有屬性值if (0 != strNodeName.CompareNoCase(_T("CalPoint"))){continue;}strKey.Empty();strValue.Empty();map<CString, CString> mapCalPoint;// 取得節點的屬性值MSXML2::IXMLDOMNamedNodeMapPtr pDOMAttrList= nodePtr->Getattributes();for (int j = 0; j < pDOMAttrList->Getlength(); j++){MSXML2::IXMLDOMNodePtr pDOMAttr= pDOMAttrList->Getitem(j); CString cstrValue = (CString)(char*)pDOMAttr->GetnodeName();if (0 == CString(L"key").CompareNoCase(cstrValue)){strKey= pDOMAttr->GetnodeTypedValue();mapCalPoint.insert(make_pair(L"key", strFreq));} else if (0 == CString(L"value").CompareNoCase(cstrValue)){strValue=pDOMAttr->GetnodeTypedValue();mapCalPoint.insert(make_pair(L"value", strLoss));}}vecCalPath.push_back(mapCalPoint);}CalPath calPoint;calPoint.CalPathList = vecCalPath;m_mapDataMT.insert(make_pair(cstr, calPoint)); } ModifyCalPoint(MSXML2::IXMLDOMNodeListPtr nodeList, CString cstr) {CString strNo; vector<map<CString, CString>> vecCalPath = m_mapDataMT[cstr].CalPathList;for (int nodeCount = 0; nodeCount < nodeList->Getlength(); nodeCount++){MSXML2::IXMLDOMNodePtr nodePtr = nodeList->nextNode();_variant_t strCaseNodeName = nodePtr->GetnodeName();_variant_t strCaseNodeValue = nodePtr->Gettext();BSTR bStrTemp = strCaseNodeName.bstrVal;CString strTemp = CString(bStrTemp);SysFreeString(bStrTemp);CString strNodeName = strTemp;// 節點沒有屬性值if (0 != strNodeName.CompareNoCase(_T("CalPoint")) || MSXML2::DOMNodeType::NODE_COMMENT == nodePtr->GetnodeType()){continue;}map<CString, CString> mapCalPoint = vecCalPath[nodeCount];// 取得節點的屬性值MSXML2::IXMLDOMNamedNodeMapPtr pDOMAttrList= nodePtr->Getattributes();for (int j = 0; j < pDOMAttrList->Getlength(); j++){MSXML2::IXMLDOMNodePtr pDOMAttr= pDOMAttrList->Getitem(j); CString cstrValue = (CString)(char*)pDOMAttr->GetnodeName();if (0 == CString(L"key").CompareNoCase(cstrValue)){variant_t var = (LPCTSTR)(mapCalPoint[L"key"]);pDOMAttr->PutnodeTypedValue(var);} else if (0 == CString(L"value").CompareNoCase(cstrValue)){variant_t var = (LPCTSTR)(mapCalPoint[L"value"]);pDOMAttr->PutnodeTypedValue(var);}}} }總結
以上是生活随笔為你收集整理的MFC开发xml编辑器小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: steps 逐帧动画
- 下一篇: 为何这些软件要显示ip归属地