学习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>
*/
这就是一个形状的相关颜色。有好多不太认识,比如填充前景透明度,填充背景透明度,阴影角度,阴影放大比例等等。不过似乎我们不太关心这个。我们更关心的是如何设置FillForegnd、FillBkgnd之类的东西。
根据前边的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吗?是的,参见VisioSDK的XML 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),然后设置颜色就是。不过,好像脸蛋儿可以改颜色,眼睛不行。Why?why?
其实原因很简单,因为眼睛木有<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();
}
}
- 学习C#操纵Visio之四:设置Shape颜色
- 学习C#操纵Visio之三:移动Shape位置
- 学习C#操纵Visio之一:定位Shape
- 学习C#操纵Visio之二:响应鼠标事件
- 学习C#操纵Visio之六:Visio版本俄罗斯方块源码下载
- 学习C#操纵Visio之五:做了个俄罗斯方块的游戏
- shape 动态颜色设置
- matplotlib学习之(四)设置线条颜色、形状
- C#多线程学习之如何操纵一个线程
- VISIO如何设置形状的颜色
- Android学习之四样式、主题、shape、回调
- C#学习之四---ListBox
- C#学习教程之四
- MFC 学习之 颜色设置<1>
- matplotlib学习之设置线条颜色、形状
- C#设置word颜色
- OpenGL入门学习之四——颜色的选择
- Android学习之shape属性
- 经典SQL语句大全
- Groovy笔记(6)_闭包
- SQL 通配符
- 软件研发企业如何做好内训
- Java设计模式之Facade模式
- 学习C#操纵Visio之四:设置Shape颜色
- VNC远程控制
- win7小技巧之GodMode设置
- 数据库编程总结
- 介绍一个开源的SIP协议库PJSIP
- Java设计模式之Flyweight模式
- pjsip编译及使用说明
- 客户端图像地图
- win7上的c和asm互调用