我们在工具组toolgroup的保存和加载(利用xml load/save)一篇中,实现相应功能,他是在工具图像处理动态链接库dll中的,而若我们自己创建了一个项目程序,若要实现相应功能,该怎么办?我是这样考虑的,首先,这是一种主动行为,即由自己创建的程序发动的,而且是在编程时,非运行时,若有这样一个toolgroup.loadxml()函数可以调用该多好?我们来设计一个这样的函数,如下:toolgroup.loadxml(){//主动行为,程序中调用
1,发消息给工具图像处理动态链接库dll,
2,由dll完成loadxml()动作。//这样我们不用再去点击按钮了
}
那么,相仿,toolgroup.savexml()也可以这样实现。
以上的好处是,我们不仅在动态库中可以完成操作,在应用程序中也可以完成相应操作。
这只是这篇的一个引子,接下来,我们就会想到toolgroup.run(),是的,在cognex的visionpro中,象这样的操作太多了,而有一天,你就会按捺不住,想要知道这到底是怎么一回事?我们来揭示他(这只是我的方法,或许是一厢情愿的搭不上边,原创嘛!实现就好),没有上面的引子,我还真揭(解)不开这个锅(笑!)。如下:
toolgroup.run(){//主动行为,供程序中调用
1,发消息给相机取像动态链接库dll,
2,相机取像后,发出WM_COPYDATA(grab),你可以看到,这个最终到达了工具图像处理动态链接库,
3,toolgroup中相关工具运行后,返回结果,仍然以消息方式,
4,在自己创建的项目程序中截获,并给相机取像动态链接库dll一份。
}
我们原来的泵源WM_COPYDATA(grab,若井中取水)以手动方式在相机取像动态链接库中操作,现在不必了,我们以toolgroup.run()的调用实现了掌控主动(注,发起一次WM_COPYDATA(grab),toolgroup工具组就会运行一次)。
若我们还想知道的更详细结果是工具组toolgroup谁返回的?我们还可以设计一个返回类CResult(这是后话),我想这个创意不仅仅是visionpro独有。
我们来实现一下toolgroup.run(),看代码:
private void toolgroup主动运行_Click(object sender, EventArgs e)
{
mybytes.command = "取像并泵出";//井中水多,我们只取一桶所用之水,即grab
mybytes.comeFromWindow = "TestMegaugingLib";
//basler200wcamuc1//定义了一个工具组运行的消息
SendMsg(basler200wcamuc1.Handle, WM_TGRUN, 0, ref mybytes);//WM_TGRUN
}
有一个问题要解释一下,相机和工具组两个动态链接库dll写死后,并不知道我们创建的项目程序的窗口是"TestMegaugingLib",这样,他回传消息时,就会有障碍,我们处理的的办法是,你也看到了,我们发消息时,把窗口名也一并带上,dll接受后就会解析出来,他就知道返回哪里了,程序就会变得灵动起来。
只要肯用心,以上的解析一定会变成toolgroup.run()这样的格式,而实质就是这样。
待续(慢慢来!...........)每天一点小改变☺
我的邮箱liuganggang_1978@163.com;734523623@qq.com