使用C++进行SVG开发

来源:互联网 发布:武汉大学数据库 编辑:程序博客网 时间:2024/04/29 06:33

  进行SVG开发的时候,可以使用的语言有很多钟。其中,JAVA对SVG的支持比较好,而且有相应的开发包。这里就不讲JAVA方面,主要讲一下使用C++进行SVG方面的开发。 不懂SVG的先看我博客的两篇关于SVG方面的文章再来看这篇文章。

  SVG是基于XML的可扩展矢量图形。说简单了,它是一个规范,跟C++语言一样。大家只要按照这个规范去编写,SVG解析器就能够把你编写的文件解析并渲染成图形。从这个层面来说,SVG是属于一门语言。

   既然它的基础是XML,所以我们只要按照XML的方式来操作SVG文件就OK了,当然,前提是,变量命名和部分格式我们要遵从SVG的规范,因为SVG是XML文件,但XML就不一定是SVG文件啦。所以,我们采用C++进行SVG开发时,就是在遵从SVG规范的前提下,以操作XML的方式来操作SVG文件就OK了。

  知道怎么去操作SVG了,我们下一步要做的是寻找如何操作XML的方法,只要知道如何操作XML,就知道如何操作SVG。我们并不需要自己去动手去编写一个XML解析器。目前比较多人用的XML解析器是VC自带的一个组件,具体名称我忘记了,因为我比较注意的是平台无关性的技术;一个是IBM的Xerces C,该方法支持完整的XML规范,只是有个缺点,既你一下子要加载12M的内存模块;最后一个是使用开源类tinyxml类啦,这也是我要介绍的方式。

  tinyxml是一个开源的类,你可以将它使用到商业的开发中。我的资源中有个tinyxml的版本可以下载,如果要最新的可以到官方去下。

下面是我写的一个使用tinyxml操作SVG文件的一个例子

 

#include "stdafx.h"
#include 
<iostream>
#include 
"tixml.h"
using namespace std;

int main(int argc, char* argv[])
{
/////////生成SVG文件的框架//////////////////////
    string temp,tempstring;
    CString tempstr;
     
//生成SVG文件框架
    tempstr.Format("<?xml version="1.0"  standalone='no' > "
    
"<!-- IBoard SVG File -->"
    
"<svg height="%d" width="%d"> "
    
"<!-- SVG File --> "
    
"</svg>",height,width);
    temp.append(tempstr);

    
const char* demoStart=temp.data();
    
//若文件名不为空
    if(filename!="")
      tempstring.append(filename);
    
else
        tempstring.append(
"iboardfile.svg");
     
    
const   char *FileName=tempstring.data();
    TiXmlDocument doc( FileName );
    doc.Parse( demoStart );

    
if ( doc.Error() )
    
{
        AfxMessageBox(
"some error ,fix here");    
        
return -1;
    }

    
else
       doc.SaveFile();
//////////////////////////////////////////////////


/////使用tinyxml操作SVG文件/////////////////////////////////////////

    TiXmlDocument doc1("iboardfile.svg");
    
bool loadOkay = doc.LoadFile();
    
if(!loadOkay )
    
{
        
return FALSE;
    }

    TiXmlNode
* node = doc.FirstChild( "svg" );
    assert(node);
    
//向SVG文件插入一个圆
    TiXmlElement child("ellipse");
    child.SetAttribute(
"cx","50");
    child.SetAttribute(
"cy","50");
    child.SetAttribute(
"rx","100");
    child.SetAttribute(
"ry","100");
    child.SetAttribute(
"style","fill:Red;stroke:red");
    node.InserEndChild(child);
    doc1.SaveFile();
    
/////插入圆成功,保存文件
    return 0;
}

 

好了,告诉大家思路了,也演示过了,大家好好玩。

原创粉丝点击