欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

QT GUI界面中集成VISIO绘图区详细说明

发布时间:2023/12/10 c/c++ 60 豆豆
生活随笔 收集整理的这篇文章主要介绍了 QT GUI界面中集成VISIO绘图区详细说明 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1.背景

项目需要在界面中集成VISIO的工作区,就开始研究这个问题,本以为是一个非常简单的问题,找到工作区窗口,调用SetParent接口就好了。但是实际操作中发现这个思路是行不通的。

这种方法,在WIN7操作系统中,32为VISIO可以集成,正常操作也没有问题。但是在其他配置的情况下就不行了,比如WIN10。

用QT的QWidget的接口函数也是同样的情况。

昨天,偶然间在微软官网发现VISIO的工作区实际是一个ActiveX控件,那就简单了。需要Qt中的axcontainer模块就能搞定。

2.过程

首先用Creator新建一个GUI的工程。

修改pro文件,添加

QT += axcontainer,引入这个模块。

在UI文件中添加一个QAxWidget控件。

在控件中右键点击,选择【设置控件】会出现如下界面

在这个界面中能找到 VISIO绘图控件。

再在这个控件中添加槽函数,右键单击控件,选择【转到槽】。就出现下面的界面。Creator会自动生成槽函数的。

 3、控件的接口函数调用方法。

这个是我想说的最重要的部分,照我的理解大致是有三种方法。

第一种方法,也是QT帮助文件中的方法。

QAxWidget::dynamicCall("SetSrc (QString Src)",params)//接口函数调用 QAxWidget::setProperty("Src",params)//设置属性的值 QAxWidget::property("Src")//得到属性的值

这种方法对于一些不支持的数据类型是不支持的。也就是可能某一些方法会调用失败。

第二种方法,也是QT帮助中的办法,利用bumpcpp生成.h和.cpp文件。直接在工程中引用。但是我在试验的时候发现,生成的类型是QAxObject,我理解应该是QAxWidget所以这种办法没有试成功。

第三种办法,应该是最理想的办法,但是过程稍微有点麻烦。

首先,用VS生成一个空的win32控制台程序,然后添加一个cpp文件,在文件中加上如下代码。

#import "C:\\visio\\Office14\\VISLIB.DLL"#import "C:\\visio\\Office14\\VISOCX.DLL"void main() {}

然后直接编译就可以了。

编译完成后,在debug文件夹中会出现如下4个文件

这4个文件中tlh实际是头文件,tli应该就是cpp文件。

把这4个文件加入到我们的工程中,我们就可以使用全部的接口了。

ui->axWidget->setControl("{E4615FA3-23B0-4976-BD3E-D611DDBE330E}");VisOcx::IDrawingControl* drawing;QUuid id = QUuid::fromString(QLatin1String("{9BF6FD73-F05B-406E-B938-09E2B413528E}"));ui->axWidget->queryInterface(id,(void**)&drawing);//得到控件提供的接口_bstr_t host = drawing->GetHostID();drawing->put_Src(_bstr_t("d:\\draw.vsd"));Visio::IVWindowPtr window = drawing->Window;COLORREF color = RGB(255, 0, 0);window->PutBackgroundColor((OLE_COLOR)color);window->PutViewFit(2);

上面是我做的测试的代码。

connect(ui->axWidget, SIGNAL(DocumentChanged(Visio::IVDocument *)), this, SLOT(onDocumentChanged(Visio::IVDocument *)));QObject::connect(ui->axWidget, SIGNAL(MouseMove(int, int, double, double, bool &)), this, SLOT(onMouseMove(int, int, double, double, bool &)));connect(ui->axWidget, SIGNAL(ShapeAdded(struct Visio::IVShape *)), this, SLOT(onShapeAdded(struct Visio::IVShape *)));

这是连接槽函数的代码。

第一次调用ActiveX,第一次做QTGUI程序,成就感满满,希望对后来的诸位能有帮助,也希望我将来还能用到。

总结

以上是生活随笔为你收集整理的QT GUI界面中集成VISIO绘图区详细说明的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。