-- 作者:zhiyu-2000
-- 发布时间:1/17/2005 9:17:00 AM
--
这是用c++生成svg的一段代码 一个是建立空的svg文档,一个是加入svg的根节点,你看看吧! //建立空的SVG文档 BOOL CMXVSVG::CreateNullSVGDocAndPI() { HRESULT hr; hr = CoCreateInstance(MSXML::CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, MSXML::IID_IXMLDOMDocument, (void**)&m_pSVGDOMDocument); if(FAILED(hr)) return FALSE; VARIANT varType; VARIANT varValue; BSTR bstrName; BSTR bstrNameSpaceURI; MSXML::IXMLDOMNode* pPIISVGDOMNode = NULL; MSXML::IXMLDOMNode* pTmpISVGDOMNode = NULL; MSXML::IXMLDOMAttribute* pISVGDOMAttribute = NULL; MSXML::IXMLDOMNamedNodeMap* pISVGDOMNamedNodeMap = NULL; VariantInit(&varType); VariantInit(&varValue); //构造xml文件的预处理指令 varType.vt = VT_BSTR; varType.bstrVal = _com_util::ConvertStringToBSTR("processinginstruction"); bstrName = _com_util::ConvertStringToBSTR("xml"); //xml 不能用大写的 bstrNameSpaceURI = _com_util::ConvertStringToBSTR(""); hr = m_pSVGDOMDocument->createNode(varType,bstrName,bstrNameSpaceURI,&pPIISVGDOMNode); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } hr = m_pSVGDOMDocument->appendChild(pPIISVGDOMNode,&pPIISVGDOMNode); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } //为预指令添加standalone 属性 varType.vt = VT_BSTR; varType.bstrVal = _com_util::ConvertStringToBSTR("attribute"); bstrName = _com_util::ConvertStringToBSTR("standalone"); bstrNameSpaceURI = _com_util::ConvertStringToBSTR(""); hr = m_pSVGDOMDocument->createNode(varType,bstrName,bstrNameSpaceURI,(MSXML::IXMLDOMNode**)&pISVGDOMAttribute); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } varValue.vt = VT_BSTR; varValue.bstrVal = _com_util::ConvertStringToBSTR("no"); hr = pISVGDOMAttribute->put_nodeValue(varValue); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } hr = pPIISVGDOMNode->get_attributes(&pISVGDOMNamedNodeMap); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } hr = pISVGDOMNamedNodeMap->setNamedItem(pISVGDOMAttribute,&pTmpISVGDOMNode); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } VariantClear(&varType); VariantClear(&varValue); return TRUE; } //建立根节点 BOOL CMXVSVG::CreateSVGNode() { int height=1000; int width=1000; VARIANT varType; VARIANT varValue; BSTR bstrName; BSTR bstrNameSpaceURI; MSXML::IXMLDOMNode* pSVGTmpISVGDOMNode = NULL; MSXML::IXMLDOMAttribute* pISVGDOMAttribute = NULL; MSXML::IXMLDOMNamedNodeMap* pISVGDOMNamedNodeMap = NULL; VariantInit(&varType); VariantInit(&varValue); //创建根节点svg varType.vt = VT_BSTR; varType.bstrVal = _com_util::ConvertStringToBSTR("element"); bstrName = _com_util::ConvertStringToBSTR("svg"); bstrNameSpaceURI = _com_util::ConvertStringToBSTR(""); HRESULT hr = m_pSVGDOMDocument->createNode(varType,bstrName,bstrNameSpaceURI,&m_pSVGDOMNode); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } hr = m_pSVGDOMDocument->appendChild(m_pSVGDOMNode,&m_pSVGDOMNode); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } //为svg节点加入height属性 varType.vt = VT_BSTR; varType.bstrVal = _com_util::ConvertStringToBSTR("attribute"); bstrName = _com_util::ConvertStringToBSTR("height"); bstrNameSpaceURI = _com_util::ConvertStringToBSTR(""); hr = m_pSVGDOMDocument->createNode(varType,bstrName,bstrNameSpaceURI,(MSXML::IXMLDOMNode**)&pISVGDOMAttribute); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } varValue.vt = VT_I4; varValue.lVal =height; hr = pISVGDOMAttribute->put_nodeValue(varValue); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } hr = m_pSVGDOMNode->get_attributes(&pISVGDOMNamedNodeMap); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } hr = pISVGDOMNamedNodeMap->setNamedItem(pISVGDOMAttribute,&pSVGTmpISVGDOMNode); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } //为svg节点加入width属性 varType.vt = VT_BSTR; varType.bstrVal = _com_util::ConvertStringToBSTR("attribute"); bstrName = _com_util::ConvertStringToBSTR("width"); bstrNameSpaceURI = _com_util::ConvertStringToBSTR(""); hr = m_pSVGDOMDocument->createNode(varType,bstrName,bstrNameSpaceURI,(MSXML::IXMLDOMNode**)&pISVGDOMAttribute); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } varValue.vt = VT_I4; varValue.lVal = width; hr = pISVGDOMAttribute->put_nodeValue(varValue); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } hr = m_pSVGDOMNode->get_attributes(&pISVGDOMNamedNodeMap); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } hr = pISVGDOMNamedNodeMap->setNamedItem(pISVGDOMAttribute,&pSVGTmpISVGDOMNode); if(FAILED(hr)) { VariantClear(&varType); VariantClear(&varValue); return FALSE; } VariantClear(&varType); VariantClear(&varValue); return TRUE; }
|