您的位置:首页 > 其它

swing嵌入ocx或dll影像控件

2015-12-30 14:25 344 查看
关于swing嵌入ocx或dll影像控件的问题,自己研究了一下,今天发出来给大家共享一下

swing调用OCX或dll的方法有很多,其中包括:jcob、comfyj、jawin、jni、jna等等很多方式,但是如果要显示dll或ocx的控件在swing界面上,就有点麻烦了,就像ocx在IE中显示的<object...>对象一样。

这几种我都实验过,最好用的还是comfyj,但是这个东东最后发现是收费的,而且还不菲~~,如果给客户使用可能存在风险,所以就抛弃了。

然后实验jcob,jcob大家应该都非常熟悉,其实只调用ocx的方法的话,就他就能够满足了,但是如果是ocx或dll视频控件在你的swing程序上显示出来,就非常麻烦了,网上找了很久,也没找到可供参考的资料。最后作罢。

再然后又测试的jawin,最终jawin可以正确展示我的ocx/dll控件视频框,但是好像仅仅支持加载32位动态库,如果是64位的,百度和谷歌了很久也没找到,最后在csdn一个论坛里找了一个加载不报错的,但是不能用~~,郁闷了。

再最后,看到一篇文章,SWT中可以显示word文档,然后心想应该有门,所以又做了测试,并且最终测试成功,现在能在swing上显示32位和64位的动态库或ocx的影像控件了~~~~~~

原理: 用SWT显示控件的视频框,然后将SWT放在swing界面上,然后通过SWT调用封装的dll方法实现交互调用

前提: 用到的OCX或dll必须在系统注册表中已经注册,通过regsvr32 xxxx.dll命令

/**
* 人脸采集控件的SWT图形控件
*/
private static Canvas swtCanvas = new Canvas() {
private static final long serialVersionUID = 1L;
@Override
public void addNotify() {
super.addNotify();
synchronized (getTreeLock()) {
// 另起线程,以免阻塞
new Thread() {
public void run() {

......

// swt的初始化
Display display = new Display();
Shell _shell = SWT_AWT.new_Shell(display, swtCanvas);
_shell.setLayout(new org.eclipse.swt.layout.RowLayout());
// 加载第一个ocx窗口
OleFrame _frameL = new OleFrame(_shell, SWT.NONE);
// tesoClsid : 注册表中已注册的控件PROGID,也就是name
OleControlSite _siteL = new OleControlSite(_frameL, SWT.NONE, tesoClsid);
_siteL.doVerb(OLE.OLEIVERB_SHOW);
_siteL.setSize(400, 300);

......

_shell.pack();
while (!_shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}.start();
}
}
};

......

//然后在swing的jPanel中放入swtCanvas
jPanelCapture.add(swtCanvas);


具体的代码实现,请到我在CSDN上传的资料中下载 http://download.csdn.net/detail/yangyanhe/9383932
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: