使用事件一般需要两个步骤,首先,需要声明一个类继承对应事件,实现父类的虚接口函数,这个就是事件函数的定义。其次,需要调用父类对应的管理类去注册和注销事件的监听。例如,对于工程事件,首先要声明一个类继承BPProjectEventListener,实现该类的工程打开,关闭前和关闭后事件的接口函数。调用该事件对应的管理类BPProjectEventListenerCenter去管理事件的注册和注销。事件的注册通常在addListener函数中执行,事件的注销通常在dropListener函数中执行。

下面以工程事件为例,示例代码6-1介绍如何注册事件,示例代码6-2、6-3介绍事件如何接收消息并进行响应和处理。

PBBIM_IMPLEMENT_EXTENSION_MODULE(ExampledllDemo)
static ProjectEventDemo s_projectEventDemo;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{    
// 如果使用 lpReserved,请将此移除    
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{        
    TRACE0("ExampledllDemo.DLL 正在初始化!\n");        
    BPProjectEventListenerCenter::getInstance().addListener (&s_projectEventDemo);                
    if (!ExampledllDemo.AttachInstance(hInstance))
        return 0;    
}    
    else if (dwReason == DLL_PROCESS_DETACH)    
    {        
        TRACE0("ExampledllDemo.DLL 正在终止!\n");
        // 在调用析构函数之前终止该库    
        ExampledllTest.DetachInstance();    
    }    
    return 1;   
}

代码6-1:工程事件注册示例代码

class ProjectEventTest : public BPProjectEventListener
{
protected:    
    virtual bool    _onPreOpen(const ProjectPreOpenArg& arg);    
    virtual bool    _onPostOpen(::BIMBase::Core::BPProjectR project);    
    virtual bool    _onPreClose(::BIMBase::Core::BPProjectR project);    
    virtual bool    _onPostClose(::BIMBase::Core::BPProjectR project);
};

代码6-2:工程事件消息响应和处理示例代码

bool ProjectEventDemo::_onPreOpen(const ProjectPreOpenArg& arg)
{    
    return false;
}

bool ProjectEventDemo::_onPostOpen(BIMBase::Core::BPProjectR project)
{
    //do something
    return false;
}
bool ProjectEventDemo::_onPreClose(BIMBase::Core::BPProjectR project)
{    
    return false;
}
bool ProjectEventDemo::_onPostClose(BIMBase::Core::BPProjectR project)
{    
    return false;
}

代码6-3:工程事件消息响应和处理示例代码