Visio在VB6中的开发有很多现成的项目及代码,但在.NET领域相对比较滞后,但是从Visio SDK2007发布以来,给予Visio的C#开发逐渐多了起来,虽然和VB6的开发思路有一定的相似,不过平台不一样,做出来的东西差别还是有一定的距离,虽然总体慢一点,但是,DotNET框架的逐渐强大以及更多的DotNet程序和开发人员的加入,带给大家更高的整合价值以及更美好的发展未来。
本人将会在C#领域将Visio的二次开发进行下去,希望大家一起学习研究,碰撞出更美的火花

Visio Drawing Control控件使用
Visio开发必备
Visio SDK 2007
VisSDK.chm
Visio Code Samples Library.chm
Visio文档操作
查看ShapeSheet属性及帮助内容
宏的录制

Visio的几个重要对象


Application

Window (Application.ActiveWindow)

Document (Application.ActiveDocument)

Master、Shape

VisioObjects.jpg

Visio XML格式文件分析
Master格式
Visio_Master.jpg

Pages/Shapes格式
Visio_Page.jpg

图纸的XML文档中,Master后面的Shapes集合中只有一个Shape对象
图纸的Shapes集合有多个对象,每个对象的NameU和Name值可能不一样,一般使用NameU


Visio基本操作的实现


VisApplication
=

this
.ctrlDrawing.Document.Application;

VisWindow

=
VisApplication.ActiveWindow;

VisDocument

=
VisApplication.ActiveDocument;


//
Settings


VisApplication.Settings.ShowShapeSearchPane
=

false
;
//
显示搜索形状窗体


VisApplication.Settings.EnableAutoConnect
=

false
;
//
自动链接(2007默认)


VisApplication.Settings.StencilBackgroundColor
=

10070188
;
//
vbGrayText


//
文档各种显示


VisApplication.DoCmd((
short
)VisUICmds.visCmdViewRulers);

VisApplication.DoCmd((

short
)VisUICmds.visCmdViewGrid);

VisApplication.DoCmd((

short
)VisUICmds.ShowGuides);

VisApplication.DoCmd((

short
)VisUICmds.ShowConnectPoints);

VisApplication.DoCmd((

short
)VisUICmds.ShowPageBreaks);


//
各种窗口


VisApplication.DoCmd((
short
)VisUICmds.visCmdShapesWindow);

VisApplication.DoCmd((

short
)VisUICmds.visCmdPanZoom);

VisApplication.DoCmd((

short
)VisUICmds.visCmdCustProp);

VisApplication.DoCmd((

short
)VisUICmds.visCmdSizePos);



SendKeys.Send(

"
^(x)
"
);

//
VisApplication.DoCmd((short)VisUICmds.visCmdUFEditCut);


SendKeys.Send(
"
{DELETE}
"
);

//
VisApplication.DoCmd((short)VisUICmds.visCmdUFEditClear);


SendKeys.Send(
"
^+(p)
"
);

//
VisApplication.DoCmd(VisUICmds.visCmdFormatPainter);


SendKeys.Send(
"
^(z)
"
);

//
VisApplication.DoCmd(VisUICmds.visCmdEditUndo);


调用工具条对象、菜单对象的方法
Application.CommandBars
Microsoft.Office.Core.CommandBars共享Office对象模型
使用CommandBar代替UIObject
CommandBar对象中,菜单及工具条是同一个东西
CommandBar、CommandBarButton、 CommandBarComboBox、CommandBarControl、 和 CommandBarPopup

示例:执行视图中的工具条的所有按钮事件。


Microsoft.Office.Core.CommandBars commandBars;

commandBars

=
(Microsoft.Office.Core.CommandBars)VisApplication.CommandBars;


foreach
(Microsoft.Office.Core.CommandBarControl control
in
commandBars[
"
View
"
].Controls)



{

Microsoft.Office.Core.CommandBarButton button

=
control
as
Microsoft.Office.Core.CommandBarButton;

if
(button
!=

null
)



{

button.Execute();

}



}




StringBuilder sb

=

new
StringBuilder();

foreach
(Microsoft.Office.Core.CommandBar bar
in
commandBars)



{

sb.Append(

string
.Format(
"
CommandBar Name:{0}\r\n
"
, bar.Name));

foreach
(Microsoft.Office.Core.CommandBarControl control
in
bar.Controls)



{

Microsoft.Office.Core.CommandBarButton button

=
control
as
Microsoft.Office.Core.CommandBarButton;

if
(button
!=

null
)



{

sb.Append(

string
.Format(
"
Button Name:{0} \r\n
"
, button.Caption));

}



}



}



Form2 frm

=

new
Form2();

frm.txtContent.Text

=
sb.ToString();

frm.Show();



short
flags
=
(
short
)VisOpenSaveArgs.visOpenDocked
|
(
short
)VisOpenSaveArgs.visOpenRO;

StencilOpenEx(wndVisio.Application, flags);




///

<summary>


///
打开模具的公共方法

///

</summary>


///

<param name="visApp">
按引用调用的VisioApplication对象
</param>


///

<param name="flags">
打开的模式
</param>


private

void
StencilOpenEx(Application visApp,
short
flags)



{

List

<
string
>
stencilList
=
GetStencils();

string
stencilFileName;


foreach
(
string
stencil
in
stencilList)



{

stencilFileName

=
GetStencilsFileName(stencil);

if
(
!
string
.IsNullOrEmpty(stencilFileName))



{

visApp.Documents.OpenEx(Portal.gc.gStencileFileBasePath

+
stencilFileName, flags);

}



}



}




//
关闭模具文件


visApp.Documents[
"
Switch.vss
"
].Close();

visApp.Documents[

"
Span.vss
"
].Close();

visApp.Documents[

"
Line.vss
"
].Close();

visApp.Documents[

"
Label.vss
"
].Close();

visApp.Documents[

"
Construct.vss
"
].Close();

visApp.Documents[

"
Monitor.vss
"
].Close();



Visio Shape的属性操作
StringToFormulaForString、FormulaStringToString函数
访问属性
设置属性
添加属性


//
列出模具组


this
.cmbStencilGroup.Items.Clear();

List

<
string
>
stencilGroups
=
stencil.GetStencils();

foreach
(
string
group
in
stencilGroups)



{

this
.cmbStencilGroup.Items.Add(group);

}





//
根据模具组列出模具


string
stencilName
=
stencil.GetStencilsFileName(
this
.cmbStencilGroup.Text);

this
.cmbStencil.Items.Clear();

string
tempName;

foreach
(Master master
in
visApp.Documents[stencilName].Masters)



{

tempName

=
master.Name;

if
(
!
stencil.IsExcludeItem(tempName))



{

this
.cmbStencil.Items.Add(tempName);

}



}





//
根据模具,获取对应的属性集合,遍历属性集合,列出属性名称


string
stencilName
=
stencil.GetStencilsFileName(
this
.cmbStencilGroup.Text);

string
masterName
=

this
.cmbStencil.Text;

Visio.Shape shape

=
visApp.Documents[stencilName].Masters[masterName].Shapes[
1
];

if
(shape
!=

null
)



{

List

<
StencilPropertyInfo
>
propInfos
=
property.GetPropertyCollection(shape);

foreach
(StencilPropertyInfo info
in
propInfos)



{

this
.cmbProperty.Items.Add(info.Name);

}



}





//
根据模具、模具属性,列出对应的属性信息


string
stencilName
=
stencil.GetStencilsFileName(
this
.cmbStencilGroup.Text);

string
masterName
=

this
.cmbStencil.Text;

Visio.Shape shape

=
visApp.Documents[stencilName].Masters[masterName].Shapes[
1
];

StencilPropertyInfo info

=
property.GetProperty(shape,
this
.cmbProperty.Text);

if
(info
!=

null
)



{

this
.txtName.Text
=
info.Name;
//
属性名称



this
.txtValue.Text
=
info.Value;
//
属性值



this
.txtFormat.Text
=
info.Format;
//
属性格式



this
.txtSortKey.Text
=
info.Sort;
//
属性的排序



this
.txtPrompt.Text
=
info.Prompt;
//
属性的提示信息


}





//
根据模具,获取属性对象集合


public
List
<
StencilPropertyInfo
>
GetPropertyCollection(Visio.Shape shape)



{

List

<
StencilPropertyInfo
>
list
=

new
List
<
StencilPropertyInfo
>
();

StencilPropertyInfo propertyInfo;

Visio.Cell shapeCell;

short
shortSectionProp
=
(
short
)VisSectionIndices.visSectionProp;


if
(shape
!=

null
)



{

for
(
short
i
=

0
; i
<
shape.get_RowCount(shortSectionProp)
-

1
; i
++
)



{

if
(shape.get_CellsSRCExists(shortSectionProp, i, (
short
)VisCellIndices.visCustPropsLabel,
0
)
!=

0
)



{

propertyInfo

=

new
StencilPropertyInfo();


shapeCell

=
shape.get_CellsSRC(shortSectionProp, i, (
short
)VisCellIndices.visCustPropsLabel);

propertyInfo.Name

=
VisioUtility.FormulaStringToString(shapeCell.RowNameU);


shapeCell

=
shape.get_CellsSRC(shortSectionProp, i, (
short
)VisCellIndices.visCustPropsPrompt);

propertyInfo.Prompt

=
VisioUtility.FormulaStringToString(shapeCell.FormulaU);


shapeCell

=
shape.get_CellsSRC(shortSectionProp, i, (
short
)VisCellIndices.visCustPropsFormat);

propertyInfo.Format

=
VisioUtility.FormulaStringToString(shapeCell.FormulaU);


shapeCell

=
shape.get_CellsSRC(shortSectionProp, i, (
short
)VisCellIndices.visCustPropsValue);

propertyInfo.Value

=
VisioUtility.FormulaStringToString(shapeCell.FormulaU);


shapeCell

=
shape.get_CellsSRC(shortSectionProp, i, (
short
)VisCellIndices.visCustPropsSortKey);

propertyInfo.Sort

=
VisioUtility.FormulaStringToString(shapeCell.FormulaU);


//
shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsType);

//
propertyInfo.PropType = VisioUtility.FormulaStringToString(shapeCell.FormulaU);


//
shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsInvis);

//
propertyInfo.InVisible = VisioUtility.FormulaStringToString(shapeCell.FormulaU);


//



..



list.Add(propertyInfo);

}



}



}




return
list;

}





//
根据模具和属性名称,获取属性对象信息


public
StencilPropertyInfo GetProperty(Visio.Shape shape,
string
propertyName)



{

List

<
StencilPropertyInfo
>
list
=
GetPropertyCollection(shape);

StencilPropertyInfo propertyInfo

=

null
;

foreach
(StencilPropertyInfo tempInfo
in
list)



{

if
(tempInfo.Name
==
propertyName)



{

propertyInfo

=
tempInfo;

break
;

}



}




return
propertyInfo;

}

标签: none

添加新评论