Archicad插件开发-模态窗口使用教程

首先我们定义窗口类,代码如下:

#pragma once
#include "DGModule.hpp"

class CTestDlg: public DG::ModalDialog
    , public DG::CompoundItemObserver
    , public DG::PanelObserver
{
public:
    CTestDlg(GSResModule dialModule, short resId, GSResModule dialIconModule);
    ~CTestDlg();
};

模态窗口需要继承DG::ModalDialog,另外如果需要在该类中响应窗口消息,则需要继承Observer相关类

#include "CTestDlg.h"
#include "API_Guid.hpp"
#include "ACAPinc.h"

CTestDlg::CTestDlg(GSResModule dialModule, short resId, GSResModule dialIconModule)
    :DG::ModalDialog(dialModule, resId, dialIconModule)
{
}
CTestDlg::~CTestDlg()
{
    //
}

然后在grc文件中定义窗口资源

//Modal为窗口类型,如果是模态窗口则规定窗口类型为Modal、非模态窗口的窗口类型必须为Palette 
//另外窗口的id也有区别非模态的窗口id值为32400 - 32499之间、模态窗口的id值为32500 - 32767之间
'GDLG' 32503  Modal 40 0 504 200 "Modal Test" {
}
'DLGH'  32503  DLG_32503_ModalTest {
}

GDLG为窗口描述,里边定义窗口的id、类型、位置信息、title以及窗口所包含控件的位置信息等数据
DLGH为窗口帮助,为窗口上的每个控件定义提示文本
窗口展示:

CTestDlg modelessdlg(ACAPI_GetOwnResModule(), 32503, ACAPI_GetOwnResModule());
modelessdlg.Invoke();

这样我们的窗口就展示出来了。

下边我们再介绍介绍如何在窗口上添加控件,以及控件事件的响应。
首先我们在grc文件中的我们定义的窗口中添加两个按钮“OK”、“Cancel”。grc文件定义如下:

'GDLG' 32503  Modal             0       0  504  200        "Modal Test" {
/* [  1] */ Button            412  168   70   24        LargePlain    "OK"
/* [  2] */ Button            332  168   70   24        LargePlain    "Cancel"
}
'DLGH'  32503  DLG_32503_ModalTest {
1    "ok"                            Button_0
2    "cancel"                            Button_1
}

运行程序我们会看到我们的窗口上会出现两个按钮,但是点击按钮没有任何反应,这是因为我们没为按钮添加响应。下边我们再去看看如何给按钮添加响应事件。
首先我们让我们的事件处理类继承按钮事件类,我这里是将事件处理跟窗口类放在一起了所以我们的窗口类继承按钮事件处理类。并且重写ButtonClicked函数。另外在类中也定义了按钮相关变量。代码如下:

class CTestDlg: public DG::ModalDialog
    , public DG::CompoundItemObserver
    , public DG::PanelObserver
    , public DG::ButtonItemObserver
{
    DG::Button                    okButton;
    DG::Button                    cancelButton;
    enum {
        OkButtonId = 1,
        CancelButtonId = 2
    };
public:
    virtual void    ButtonClicked(const DG::ButtonClickEvent& ev) override;

public:
    CTestDlg(GSResModule dialModule, short resId, GSResModule dialIconModule);
    ~CTestDlg();
};

然后在构造函数中根据按钮id对按钮进行初始化

CTestDlg::CTestDlg(GSResModule dialModule, short resId, GSResModule dialIconModule)
    :DG::ModalDialog(dialModule, resId, dialIconModule),
    okButton(GetReference(), OkButtonId),
    cancelButton(GetReference(), CancelButtonId)
{
    //需要调用该函数,不然事件无法触发
    AttachToAllItems(*this);
    this->Attach(*this);
}

然后我们重写按钮点击事件ButtonClicked函数

void CTestDlg::ButtonClicked(const DG::ButtonClickEvent& ev)
{
    if (ev.GetSource() == &okButton) 
    {
     PostCloseRequest(DG::ModalDialog::Accept);
    }
    else if (ev.GetSource() == &cancelButton) 
    {
     PostCloseRequest(DG::ModalDialog::Cancel);
    }
}

这样窗口中的OK跟Cancel按钮的事件将会被触发。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值