【问题标题】:Filling a shape of visio with color in c#在c#中用颜色填充visio的形状
【发布时间】:2016-01-13 09:41:37
【问题描述】:

嗨,我正在使用 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)";

上面的代码会抛出一个错误,因为Cell is Guarded。

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

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

我已经尝试过这个解决方案from stackoverflow,但它也不起作用

我可以看到我在 shapesheet FillForeGnd 和 FillBkGnd 中分配的值,但是形状没有填充我给的颜色。

谁能告诉我如何做到这一点..??

【问题讨论】:

    标签: c# visio bpmn visio2013 bpmn.io


    【解决方案1】:

    正如我在上面的答案中提到的(您已将其标记为无用),您的目标形状错误。

    现在您已经编辑了您的问题以包含更多详细信息,很清楚您正在处理哪种形状。

    您要定位的形状似乎是“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;
    }
    

    【讨论】:

    • 感谢您的回复。我会仔细看看的。 :)
    • 所以在这种情况下,如果我需要完成一项任务,那么同样的程序..?
    • 谢谢它的工作..!!但是,如果它是 Task 等的正常形状,而不是折叠的子流程..??
    • Task 看起来是基于相同的结构,因此您可以调整主名称检查以包括“Task”和“Expanded Sub-Process”
    • 如果不在同一个结构上怎么办
    【解决方案2】:

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

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

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

    【讨论】:

    • 你分享的那个链接里有什么。?我没有找到任何东西
    • 这是一个解释什么是 ShapeSheet 的链接,但现在我意识到你是有事件形状问题的人,所以我想你已经知道它是什么了。您是否发现定位错误的单元格或其他问题?
    • 嗨,@dahsra,我认为如果你还没有发现问题,那么标记答案似乎有点苛刻。
    • 我必须同意约翰的观点。请尊重在此论坛中提供免费支持所需的努力和专业知识。
    • @DannyWilson - 很高兴这有帮助。我认为这可能发生在从 2010(.vsd 和类似)文件格式到 2013+(.vsdx 和类似)的转换中,其中形状实现了渐变样式模式。转换过程似乎决定使用更新的渐变停止功能,而不是基于模式的旧版本。
    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 2020-05-14
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2012-06-02
    相关资源
    最近更新 更多