当前页面访问量: 24

Qt动态控制多窗口DLL

Posted by

系列索引:VAPS XT4.2.1入门系列索引

VAPS XT实现大小窗口拖拽和显示内容交换(基于鼠标操作)中介绍了基于鼠标操作的多窗口拖拽显示,其中多窗口显示是通过多个窗口一次显示一个实现的。在Qt动态加载VAPS XT编译生成的DLL文件中介绍了使用Qt的QOpenGL加载VAPS XT生成的DLL。

本文实现通过Qt和DrawingIntergration框架向DLL传递参数已实现动态控制DLL,对于本文的实例就是通过Qt控制DLL显示不同的窗口。

基本界面

先创建一个VAPS XT根工程,然后添加一个子文件夹为Modules用于存放四个子界面窗口。

在Modules四个子文件夹中添加四个图像对象(Graphical Object)分别命名为SmallModule/StdModule/MaxModule/ExtendModule。

每个图像对象都有一个属性IsVisible,bool类型,用于控制此图像对象是否显示。

property

在每个图像对象中添加一个SimpleGroup,Group里面在添加一个RectWidthHeight用于显示边框,WideText用于显示文字。

content

  • 1是界面显示内容
  • 2是界面显示隐藏设置,图像对象的属性设置给SimpleGroup
  • 3是界面实际效果

就这样设置四个,尺寸和字体大小随意设置。

project

至少每个不同界面能看出差别。

外部数据接口(修改自DrawingIntegrationExample)

创建一个MultiWindowData.vtyp文件,在里面添加

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE type_decl PUBLIC "-//PresagisCanada//DTD VapsXT 19.0" "file:///C:/VAPSXTDTD/VapsXT_19.dtd">

<type_decl name="MultiWindowData" cpp_class="vxtTypMultiWindowData" c_struct="vxtCTypMultiWindowData" build_output_location="VAPSXT_Install">
  <struct_type>
    <sfield name="Mode"         type="Int"/>
  </struct_type>
</type_decl>

交互接口只有一个数据,Mode,取整型,实际取值为1/2/3/4,分别对应小中大扩四个界面。

然后将其添加到根工程里面。

vtyp

创建一个新Data I/O Buffer

buffer

I/O Buffer名为MultiWindowBuffer(这个名称很重要,后面要用),Type为MultiWindowData(就是之前的vtyp文件名)。

点击确定后会自动生成两个文件,我们只保留其中的一个。

buffer

DLL部分

在根目录下生成一个Format用于显示、生成可执行文件、生成DLL。

将上面添加的rcvMultiWindowBuffer添加到Format里面,同时按照VAPS XT实现大小窗口拖拽和显示内容交换(基于鼠标操作)将四个界面添加到Format下的SimpleGroup里面,并将四个界面都设置为隐藏(显示由外部接口控制)。

format

  • 1为format内容
  • 2将接口和本界面需要显示的内容绑定,值为几就显示那个窗口
  • 3为默认显示界面,毕竟所有东西都隐藏了

Qt调用接口

以下内容是在myopengl类中修改。

先按Qt动态加载VAPS XT编译生成的DLL文件配置Qt工程。

添加一些接口:

const vxtChar g_BufferNameMultiWindow[]   = "MultiWindowBuffer";
const vxtChar g_BufferNameFloat50[] = "Float50";

struct MultiWindowStruct{
    vxtInt mode;
};

struct Float50
{
   vxtFloat float_array[50];
};

这里的MultiWindowBuffer就是Data I/O Buffer的名称(删除rcv之后)。

在类中添加一个对象:

Float50*                   m_pFloat50 = NULL;
MultiWindowStruct*         m_pMultiWindowStruct = NULL;

在加载DLL时进行值绑定

                if(VXT_TRUE == m_pDrawingIntegration->vInit(size, (char **)argv, VXT_FALSE)){
                    unsigned int Size = 0;

                    m_pMultiWindowStruct = static_cast<MultiWindowStruct*>(m_pDrawingIntegration->pGetBuffer(g_BufferNameMultiWindow, Size));
                    m_pFloat50   = static_cast<Float50*>(m_pDrawingIntegration->pGetBuffer(g_BufferNameFloat50, Size));

                    // The following line sets the VAPS XT drawing area to have the full extent of the MFC Window.
                    m_pDrawingIntegration->vSetSize(0, this->width(), this->height());     
                }else{
                    unsigned int Size = 0;
                    m_pMultiWindowStruct = static_cast<MultiWindowStruct*>(m_pDrawingIntegration->pGetBuffer(g_BufferNameMultiWindow, Size));
                    m_pFloat50   = static_cast<Float50*>(m_pDrawingIntegration->pGetBuffer(g_BufferNameFloat50, Size));

                    // The following line sets the VAPS XT drawing area to have the full extent of the MFC Window.
                    m_pDrawingIntegration->vSetSize(0, this->width(), this->height());
                    qDebug() << "Cannot initialize the vxtRTDrawingIntegrationI";
                }

刷新OpenGL界面时更新接口值

    if (NULL != m_pDrawingIntegration){
        if (VXT_NULL != m_pMultiWindowStruct){
            m_pMultiWindowStruct->mode = m_mode;

           m_pDrawingIntegration->vUpdateBuffer(g_BufferNameMultiWindow);
        }

        m_pDrawingIntegration->vExecuteIteration();
    }

同时提供一个接口用于修改m_mode值。

void myopenGL::setMode(int mode)
{
    if(mode != m_mode){
        m_mode=mode;
        resizeGL(this->width(),this->height());
    }
}

切换模式后必须调整一下软件窗口尺寸才能更新,所以在接口中直接调用修改尺寸的函数。

在界面中添加四个按钮用于调用这个接口切换四个子界面。

ui

结果

生成DLL、加载DLL、动态控制界面视频效果-B站

完整工程地址:VAPS_XT

赞赏

微信赞赏支付宝赞赏

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用*标注