使用事件一般需要两个步骤,首先,需要声明一个类继承对应事件,实现父类的虚接口函数,这个就是事件函数的定义。其次,需要调用父类对应的管理类去注册和注销事件的监听。例如,对于工程事件,首先要声明一个类继承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:工程事件消息响应和处理示例代码