在c#中填充带有颜色的visio形状

时间:2015-10-15 04:30:51

标签: c# visio bpmn visio2013 bpmn.io

您好我正在使用c#创建visio2013的形状。现在我需要使用c#填充一些颜色的形状我尝试了以下代码但没有任何意义:( :(

   Visio.Cell cqellname;
            cqellname = shape.get_CellsSRC(
            (short)Visio.VisSectionIndices.visSectionObject,
            (short)Visio.VisRowIndices.visRowFill,
            (short)Visio.VisCellIndices.visFillBkgnd);
            cqellname.FormulaU = "rgb(255,0,0)";

以上代码会因单元格被保护而引发错误。

  shape.get_CellsSRC((short)Visio.VisSectionIndices.visSectionObject,
        (short)Visio.VisRowIndices.visRowFill,
   (short)Visio.VisCellIndices.visFillBkgnd).FormulaForceU = "RGB(" + R + "," + G + "," + B + ")";

尝试了上述内容,它没有抛出任何异常,但形状没有任何变化。

我已经尝试过这个解决方案from stackoverflow而且它的工作也没有用

我能够在形状表 FillForeGnd和FillBkGnd 中看到我指定的值,但是形状没有填充我给出的颜色。

enter image description here

任何人都可以告诉我该怎么做.. ??

2 个答案:

答案 0 :(得分:3)

正如我在上面的回答中提到的那样(你标记为没用),你的目标是错误的形状。

既然您已经编辑了您的问题以包含更多详细信息,那么您就可以清楚地知道您正在处理哪种形式。

您定位的形状似乎是" Collapsed Sub-Process"来自" BPMN基本形状"模版。这是一个组形状,顶层没有几何形状,所以改变它的颜色,正如你在你的问题中所做的那样,没有任何视觉上的变化。要解决此问题,您需要找到用于显示背景的子形状。碰巧在这个特定的母版中,包含您需要定位的填充的子形状具有比父代更大的索引,因此您可以在代码中使用它。该形状缺少任何其他明显的特征(例如用户单元格),这将使更好的候选者,所以请注意,此方法仅适用于此特定形状。

鉴于你似乎对这个模板进行了相当多的工作,我的方法是创建模板的副本并对主人进行一些修改以使这种交互更容易,但我希望与此同时,以下代码回答了您的问题。

如果是这样,请将其标记为已回答。

public void OnCheckFillBPMN()
{
    Color fillColor = Color.FromArgb(1, 255, 0, 0);
    CollapsedSubProcessFill(this.Application.ActiveWindow.Selection.PrimaryItem, fillColor);
}

private void CollapsedSubProcessFill(Visio.Shape vShpIn, Color fillColor)
{
    if (vShpIn != null && vShpIn.Master != null && vShpIn.Master.NameU.StartsWith("Collapsed Sub-Process"))
    {
        //The sub-shape that provides the fill colour in 
        //the 'Collapsed Sub-Process' master is the first index
        //after the group shape. 
        //If you want to use a different method to locate the 
        //correct sub-shape then do that here.
        var targetSubShpId = vShpIn.ID + 1;
        var targetShp = TryGetShapeInCollection(vShpIn.Shapes, targetSubShpId);
        if (targetShp != null)
        {
            var targetCell = targetShp.get_CellsSRC(
                (short)Visio.VisSectionIndices.visSectionObject,
                (short)Visio.VisRowIndices.visRowFill,
                (short)Visio.VisCellIndices.visFillForegnd);
            targetCell.FormulaU = "RGB(" + fillColor.R
                                    + ',' + fillColor.G
                                    + ',' + fillColor.B + ')';
        }
    }
}


private Visio.Shape TryGetShapeInCollection(Visio.Shapes vShps, int shpId)
{
    try
    {
        if (vShps != null)
        {
           var targetShp = vShps.ItemFromID[shpId];
           return targetShp; 
        }  
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
        if (ex.ErrorCode == -2032465756) //Invalid sheet identifier
        {
            return null;
        }
    }
    return null;
}

答案 1 :(得分:0)

如果FormulaForceU有效,但你没有看到任何视觉变化,那么我假设你没有设置正确的单元格。通常情况下,您需要设置FillForegnd单元格(visFillForegnd),除非有不同的模式集。另请注意(对于Visio 2013+)如果FillGradientEnabled设置为true,则会覆盖纯色。

要记住的最后一件事是,您要定位的形状可能没有几何体,或者它的NoFill单元格设置为true,实际上您应该定位到子/子形。

在任何一种情况下,您都应该crack open the ShapeSheet并查看形状的状态。