学习C#操纵Visio之四:设置Shape颜色

来源:互联网 发布:wget mysql 5.7.20 编辑:程序博客网 时间:2024/05/17 09:34

修改颜色

         有了移动Shape的经验,我们修改Shape的颜色应该是很有趣的一件事情。我们选择的笑脸和哭脸有点巧合,巧合的是他是一个复合形状!也就是说它包括的不止一个形状!因此,它的颜色修改还有点儿小特别。

         Visio来说(起码我目前认为),颜色应当和某个具体的东西相关联,比如和线条、矩形等等,也就是说一个由基础形状(线、曲线等)构成的Shape,可以有颜色,一个由Shape聚合成为的复合形状,颜色由其内在的Shape决定。

         这是什么意思呢?一个笑脸、或者一个哭脸,这个形状由两个形状组成,一个是圆圆的黄脸蛋,一个是黑漆漆的眼睛和嘴巴。这个笑脸(哭脸)的颜色分别是黄色(脸蛋),黑色(眼睛和嘴巴),而这两个形状组成的,这个笑脸或者哭脸本身,是没有颜色的。

         说的很拗口,其实就是说,复合Shape设置颜色必须设置到组成它的基层Shape上。比如你不能说设置笑脸为红色,你必须说设置笑脸的脸蛋颜色为红色,或者设置笑脸的眼睛颜色为红色。

         So,同样的,我们保存成XML看看到底该怎么改颜色。首先,我们有了Cell的基础,知道该怎么去修改XML中的项目的值;其次,我们知道颜色跟形状相关。

    /* <Fill>

     *           < FillForegnd />

                 < FillBkgnd />

                 < FillPattern />

                 < ShdwForegnd />

                 < ShdwBkgnd />

                 < ShdwPattern />

                 < FillForegndTrans />

                 < FillBkgndTrans />

                 < ShdwForegndTrans />

                 < ShdwBkgndTrans />

                 < ShapeShdwType />

                 < ShapeShdwOffsetX/>

                 < ShapeShdwOffsetY/>

                 < ShapeShdwObliqueAngle/>

                 < ShapeShdwScaleFactor/>

     * </Fill>

     */

这就是一个形状的相关颜色。有好多不太认识,比如填充前景透明度,填充背景透明度,阴影角度,阴影放大比例等等。不过似乎我们不太关心这个。我们更关心的是如何设置FillForegndFillBkgnd之类的东西。

 

         根据前边的Cell操作,我认为取得FillForegnd的方式应该是:

m_Cell = m_Shape.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowFill, (short)VisCellIndices.visFillForegnd);

return m_Cell.get_ResultStr(VisUnitCodes.visUnitsColor);

没错,就是get_ResultStr。参数是visUnitsColor。说起来这个参数究竟是visUnitColor吗?是的,参见VisioSDKXML Elements的描述中的相关类型。这个确实是UnitsColor。不过取得的值确是类似”RGB(xxx,yyy,zzz)”样式的string

         怎么处理这个返回字串我还没有想到。不过应当如何设置这个Cell呢?我前边已经自嘲过用Formula=xxx是不太规范的做法,不过set_Result只有个参数是double,我可不想写一段代码辛辛苦苦把我的RGB转成一个double写进去。(似乎应该Visio有这个函数,但是没有,我真没找到)。

         So,我用了很土的方法,就是直接设置Formula=”RGB(xxx,yyy,zzz)”搞定的。(不过根据我事后的检查,发现保存成XML后,他还是转成了Result类型,不是写的Formula格式)

 

public void set_FillForegnd(int R,int G,int B)

{

    Cell m_Cell;

 

    if (m_bHaveFillSection == false)

        return ;

    m_Cell = m_Shape.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowFill,

        (short)VisCellIndices.visFillForegnd);

    m_Cell.Formula = "RGB(" + R + "," + G + "," + B + ")";

}

 

嘿,好像都可以了,我们可以枚举这个笑脸Shape下的所有形状(Shapes),然后设置颜色就是。不过,好像脸蛋儿可以改颜色,眼睛不行。Whywhy

其实原因很简单,因为眼睛木有<Fill></Fill>节。怎么办?增加一个就可以啦。

m_Shape.AddRow((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowFill, (short)0);

 

为了操作颜色方便,我把操作颜色封装了一个类CShapeFillColor m_ShapeColor类代码有点儿长,啰了吧嗦的,什么时候放附件好了。

 

测试代码如下,也是动画哦。(美中不足是眼睛会忽闪一下,AddRow增加缺省Row属性的问题..唉,烦恼)

/* ------------------------------------------------------------ */

/* 设置fill color */

private void f_part4_set_fill_color(string sShape,int r,int g,int b)

{

    CShapeFillColor m_ShapeColor;

    Shape sp;

 

    sp = findshapebyid(sShape);

    if (sp == null)

        return;

    if (sp.Shapes.Count>1)

    {

        sp = sp.Shapes[1];

        m_ShapeColor = new CShapeFillColor(sp);

        string s_Color = m_ShapeColor.get_FillForegnd();

        m_ShapeColor.set_FillForegnd(r, g, b);

        s_Color = m_ShapeColor.get_FillForegnd();

    }

}

/* ------------------------------------------------------------ */

/* 修改眼睛的颜色 */

private void f_part4_set_fill_color2(string sShape, int r, int g, int b)

{

    CShapeFillColor m_ShapeColor;

    Shape sp;

 

    sp = findshapebyid(sShape);

    if (sp == null)

        return;

    if (sp.Shapes.Count > 1)

    {

        sp = sp.Shapes[2];

        m_ShapeColor = new CShapeFillColor(sp);

        m_ShapeColor.AddShapeFillSection();

        string s_Color = m_ShapeColor.get_FillForegnd();

        m_ShapeColor.set_FillForegnd(r, g, b);

        s_Color = m_ShapeColor.get_FillForegnd();

    }

}

/* ------------------------------------------------------------ */

/* 设置颜色CUSTID1 */

public void TestCase01Part4()

{

    bool m_bRet;

    int i;

    m_Gvar = new CGvars();

    m_bRet = m_Gvar.OpenVisioDocument("D://TestVisio//TestCase01.vsd", icrosoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenCopy);

    if (m_bRet == false)

        return;

    m_App = m_Gvar.GetApplicationClass();

    m_Doc = m_Gvar.GetDocument();

    try

    {

        /* 切换到全屏 */

        m_App.DoCmd((short)VisUICmds.visCmdFullScreenMode);

        for (i = 0; i < 50; i++)

        {

            f_part4_set_fill_color("/"CUSTID1/"", i * 2 + 130, 120 - i * 2, 100);

            Thread.Sleep(50);

        }

        for (i = 0; i < 50; i++)

        {

            f_part4_set_fill_color2("/"CUSTID1/"", i * 2 + 130, 120 - i * 2, 100);

            Thread.Sleep(50);

        }

        Thread.Sleep(3000);                         /* 3秒之后程序退出 */

        m_Doc.Saved = true;                         // 防止关闭弹出保存对话框

    }

    finally

    {

        m_Doc.Close();

        m_App.Quit();

    }

}