日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC开发xml编辑器小结

發布時間:2023/12/29 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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插入節點

CString strName(_T("")); HTREEITEM hCalConfig = m_tree.InsertItem(strName); m_tree.InsertItem(strName, hCalConfig);

2.拖入listControl控件,創建變量m_list,用于顯示子節點CalPoint 的屬性值

表格中插入表頭信息,并設置格式

m_list.ModifyStyle( 0, LVS_REPORT ); // 報表模式 m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT /*| LVS_EX_CHECKBOXES*/);CRect rect;m_list.GetClientRect(rect);m_list.InsertColumn(0, L"", LVCFMT_CENTER);m_list.InsertColumn(1, L"freq", LVCFMT_CENTER, rect.Width() / 2);m_list.InsertColumn(2, L"loss", LVCFMT_CENTER, rect.Width() / 2);CImageList image;image.Create(1, 25, TRUE | ILC_COLOR16, 1, 0); //設置表格的高度 m_list.SetImageList(&image, LVSIL_SMALL);m_list.DeleteColumn(0);//第一列無法居中顯示,刪除第一列

雙擊表格實現內容可編輯,需要往界面上拖入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编辑器小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。