ActiveX控件在C#中的使用
在开始一切工作之前,请确保ActiveX控件已经注册到计算机,请运行系统安装目录下面“注册控件.bat”。
在C#中,新建一个Windows应用程序,并指定一个位置和项目名称。
按“确定”,画面上出现主窗口界面。然后在工具箱上单击右键,出现下面菜单
选择“添加/移除项(I)...”,出现一个窗口,选择COM控件页,选择Visual Graph ActiveX Control
按“确定”,会增加下面的图标。
按下图标,在主窗口上拉框创建一个Visual Graph ActiveX控件,缺省的名字为axvgctrl1。
编辑源代码,在前面添加
using vg;
第一步:双击窗口,填写下面的代码
private void Form1_Load(object sender, System.EventArgs e)
{
axvgctrl1.Design( "" );
}
这句程序执行后,将在控件中设计一个新的Visual Graph视图文件,控件支持Design(设计)和Run(运行)两个函数,无论接下来要干什么,一开始必须执行这两个函数其中一个,在绘图版本中,多用Design函数,用户将可以用鼠标在控件窗口上编辑图形;在工业监控等领域一般多用Run函数,用户不能用鼠标直接编辑图形,但用鼠标点击画面上不同的图形时会有各种控制事件发生,而且某些图形还会产生动作。如果要打开一个视图文件,参数是文件名。
第二步:在窗口上放一个按钮button1,双击这个按钮,编写下面的代码
private void button1_Click(object sender, System.EventArgs e)
{
ISheet ASheet;
IText AText;
ASheet = axvgctrl1.ActiveSheet;
AText = (IText)ASheet.AddUnit( "Text", 0, 0, 100, 100 );
AText.Text = "Hello World!";
}
注意,一定要确保前面添加了using vg;否则这里的对象,C#不认识。
ActiveSheet是视图文件的当前页面(页面类),Visual Graph图形系统支持多个页面,当前画图的工作都是在ActiveSheet上实现的,一般应用中只要一个页面就够了,但是如果视图文件是作为图库来用,它里面可能页面就多了。
AddUnit是页面类的函数成员,在ASheet页面上添加一个文字单元,宽度和高度都是100。这句程序执行后,用鼠标点击新生成的图形,可以在上面输入字符,或者用鼠标移动这个图形,改变它的大小等。由于AddUnit返回的类型是通用的IUnit,而我们确切地知道我们会创建一个文字单元出来,所以可以把它强制转换为IText类型(IText是从IUnit继承下来的)。
Text是文字单元类的属性成员,通过它修改图形的文字属性。
第三步:在窗口上再放一个按钮button2,双击这个按钮,编写下面的代码
private void button2_Click(object sender, System.EventArgs e)
{
axvgctrl1.NewUnit( "Line", 0 );
}
NewUnit是视图类的命令函数,执行这句程序后,可以在画面上用鼠标画线。
第四步:下面,我们要给控件加上相应的事件,例如右键事件。
private void axvgctrl1_OnRButtonDown(object sender, Axvg.IvgctrlEvents_OnRButtonDownEvent e)
{
ISheet ASheet;
IUnit AUnit;
ASheet = axvgctrl1.ActiveSheet;
AUnit = ASheet.UnitAtPoint(e.x, e.y, null );
MessageBox.Show( this, "您在图形:" + AUnit.Name + " 上按下了右键!" );
}
UnitAtPoint是页面类的函数成员,返回当前鼠标位置处的图形单元。我们一般在右键事件上挂上菜单,用这种办法我们就能知道当前要对什么图形对象进行操作,然后,根据不同的图形对象,产生不同的菜单内容。此处也可以用下面的写法:
AUnit = ASheet.UnitAtCursor( null ),这样也得到当前鼠标位置所在的图形。
第五步:上面这个程序有个漏洞,如果我们没有首先单击button1按钮创建一个图形,那么这里的AUnit就是空,将使得最后一行程序出错,因此,要修改为:
private void axvgctrl1_OnRButtonDown(object sender, Axvgctrl40.IvgctrlEvents_OnRButtonDownEvent e)
{
ISheet ASheet;
IUnit AUnit;
ASheet = axvgctrl1.ActiveSheet;
AUnit = ASheet.UnitAtPoint(e.x, e.y, null );
if( AUnit != null )
MessageBox.Show( this, "您在图形:" + AUnit.Name + " 上按下了右键!" );
}
第六步:下面我们添加元件。在窗口上再放一个Visual Graph ActiveX控件,把它设法放到看不到的地方(但是Visible属性不能设置成False)。修改Form1_Load代码
private void Form1_Load(object sender, System.EventArgs e)
{
axvgctrl1.Design( "" );
string s = axvgctrl1.Execute( "return SystemParams.DefaultPath" );
axvgctrl2.Run( "controls.tbl" );
axvgctrl2.Library = true;
}
这里所指的controls.tbl在Visual Graph安装目录的dat子目录下,编写时一定要把路径写全。
在窗口上再放一个按钮button3,双击这个按钮,编写下面的代码
private void button3_Click(object sender, System.EventArgs e)
{
axvgctrl1.NewUnit( "button", 0 );
}
NewUnit是视图类的命令函数,执行这句程序后,可以在画面上用鼠标画出按钮的形状来。实际上,这句程序执行后,将首先判断第一个参数是不是保留的图形类名(text,shape,line),如果不是,将从当前指定的元件库(vgctrl2)中寻找相应名字的页面。如果把这句程序改成axvgctrl1.NewUnit( "button", 1 ),也就是第二个参数改为1,移动鼠标到画面,可以看到鼠标上拖着一个元件。可以放置若干个控件,打开多个图库文件,需要切换到某个图库时,就设置这个控件的Library属性为True,当前只能有一个图库,就是最后设置的这一个。如果需要用程序添加“button”这个元件,就执行axvgctrl1.ActiveSheet.AddUnit( "button", 0, 0, 0, 0 )。
第七步:下面我们给上面的按钮增加一个双击事件,为它增加自定义属性MyProp
private void axvgctrl1_OnDblClick(object sender, System.EventArgs e)
{
ISheet ASheet;
IUnit AUnit;
ASheet = axvgctrl1.ActiveSheet;
AUnit = ASheet.UnitAtCursor( null );
if( AUnit != null )
{
if( AUnit.Type == "button" )
AUnit.SetPropertyValue( "MyProp", "1234" );
};
}
不同类型的元件,用Type属性来区分。SetPropertyValue是图形单元类的函数,如果元件已经有了MyProp这个属性,就修改这个属性的值。GetPropertyValue函数可以返回一个属性的值。