第一步:新建一个对话框工程,在对话框上添加一个按钮《连接》和一个ComboBox下拉框,如图所示(注意:本次的按钮《断开》和按钮《保存图片》没有用到)
第二步:添加头文件
#import "msxml6.dll"
using namespace MSXML2;
注意:若提示无法打开源文件“msxml6.tlh”,只需要重新生成解决方案即可。
第三步:在***Dlg.h头文件中添加两个变量
MSXML2::IXMLDOMDocumentPtr XMLDoc;
MSXML2::IXMLDOMElementPtr XMLURL;
第四步:在OnInitDialog()中添加以下代码,在代码读取XML文件,若XML文件存在,则不创建,并把XML文件里边的内容添加到ComboBox中;若不存在,则创建一个XML文件,并往里边写入一个初始化数据,并添加到ComboBox中
HRESULT HR = XMLDoc.CreateInstance(_uuidof(MSXML2::DOMDocument60));
if (!SUCCEEDED(HR))
{
MessageBox("faild!!");
return 0;
}
if (!XMLDoc->load("URL.XML")){
XMLURL = XMLDoc->createElement("ROOT");
XMLURL->setAttribute("URL", "Address"); //设置根标签的属性;
XMLDoc->appendChild(XMLURL);
CString TMP;
MSXML2::IXMLDOMElementPtr XMLNODE;
for (int I = 0; I<1; I++)
{
TMP.Format("%d", I + 1);
XMLNODE = XMLDoc->createElement((_bstr_t)("URL" + TMP));
XMLNODE->setAttribute("URL", (_variant_t)"rtsp://172.16.1.122:554/av0_1");//设置标签的属性及内容;
XMLURL->appendChild(XMLNODE);
}
XMLDoc->save("URL.XML");
XMLNODE.Release();
m_URLComboBox.AddString("rtsp://172.16.1.122:554/av0_1");
return 0;
}
//把xml文件中的URL地址添加到combox控件中
MSXML2::IXMLDOMNodeListPtr nodelist = NULL;
XMLURL = XMLDoc->GetdocumentElement();
XMLURL->get_childNodes(&nodelist); //获取根节点的所有子节点
long XMLNODESNUM;
nodelist->get_length(&XMLNODESNUM); //子节点的个数
MSXML2::IXMLDOMNodePtr subnode;
MSXML2::IXMLDOMNamedNodeMapPtr XMLNODEATTS;
long ATTSNUM;
//遍历所有子节点
for (int i = 0; i < XMLNODESNUM; i++){
nodelist->get_item(i, &subnode); //获取一个子节点
subnode->get_attributes(&XMLNODEATTS); //获取子节点的属性
XMLNODEATTS->get_length(&ATTSNUM); //获取属性的个数
for (int j = 0; j < ATTSNUM; j++){ //遍历属性
XMLNODEATTS->get_item(j, &subnode); //获取一个属性
CString url = (char*)(_bstr_t)subnode->nodeName; //获取属性的名字
CString addr = (char*)(_bstr_t)subnode->text; //获取属性的内容
m_URLComboBox.AddString(addr);
}
}
subnode.Release();
XMLNODEATTS.Release();
第五步:在了《连接》按钮中添加以下代码,代码说明如下
1、先获取ComboBox列表框选中项的索引
2、获取ComboBox内容
3、若ComboBox内容为空,则返回,重新输入
4、若索引为-1,则判断ComboBox中的内容是否与XML中存在,如果不存在,则添加到XML文件中,若存在,则跳过,往下执行
UpdateData(TRUE);
//获取ComboBox的内容
CString mURL;
int nSel;
nSel = m_URLComboBox.GetCurSel(); //获取ComboBox列表框中选中项的索引
GetDlgItemText(IDC_COMBO_URL, mURL);
if (mURL == ""){
AfxMessageBox("请先输入rtsp摄像头网络地址!");
return;
}
BOOL isExist = FALSE;
if (nSel == -1){ //若新输入地址
//把新URL地址添加到XML
MSXML2::IXMLDOMNodeListPtr nodelist = NULL;
XMLURL = XMLDoc->GetdocumentElement();
XMLURL->get_childNodes(&nodelist); //获取根节点的所有子节点
long XMLNODESNUM;
nodelist->get_length(&XMLNODESNUM); //子节点的个数
MSXML2::IXMLDOMNodePtr subnode;
MSXML2::IXMLDOMNamedNodeMapPtr XMLNODEATTS;
long ATTSNUM;
CArray<CString, CString> URLList;
//遍历所有子节点
for (int i = 0; i < XMLNODESNUM; i++){
nodelist->get_item(i, &subnode); //获取一个子节点
subnode->get_attributes(&XMLNODEATTS); //获取子节点的属性
XMLNODEATTS->get_length(&ATTSNUM); //获取属性的个数
for (int j = 0; j < ATTSNUM; j++){ //遍历属性
XMLNODEATTS->get_item(j, &subnode); //获取一个属性
CString url = (char*)(_bstr_t)subnode->nodeName; //获取属性的名字
CString addr = (char*)(_bstr_t)subnode->text; //获取属性的内容
URLList.Add(addr);
}
}
subnode.Release();
XMLNODEATTS.Release();
for (int i = 0; i < URLList.GetSize(); i++)
{
if (URLList[i] != mURL)
continue;
isExist == TRUE;
}
if (!isExist){ //如果新输入的URL不存在
CString TMP;
MSXML2::IXMLDOMElementPtr XMLNODE;
TMP.Format("%d", URLList.GetSize() + 1);
XMLNODE = XMLDoc->createElement((_bstr_t)("URL" + TMP));
XMLNODE->setAttribute("URL", (_variant_t)mURL);//设置标签的属性及内容;
XMLURL->appendChild(XMLNODE);
XMLDoc->save("URL.XML");
XMLNODE.Release();
m_URLComboBox.AddString(mURL);
}
}