Bolt界面引擎 HostWnd的生存周期以及相应的objtree的绑定问题

卢作人
2023-12-01

一、             hostwnd 对象的createdelete

hostwnd对象可以创建一次,同时指定一个全局唯一的id;也可以delete一次,就是从hostwndmanager里面移除掉,。

创建hostwnd对象代码如下:

// 先获取templateManager

local  templateMananger = XLGetObject("Xunlei.UIEngine.TemplateManager")

// 获取要创建的hostwnd的模板

local  tm = templateMananger:GetTemplate("bolt.newtaskdlg","HostWndTemplate")

// 创建hostwnd,并指定一个全局唯一的id如果该idhostwnd已经存在,则会创// 建失败。                                                                                  

local modalHostWnd = tm:CreateInstance("NewTaskDlg.Dialog")


移除hostwnd对象的代码如下:

local hostwndManager = XLGetObject("Xunlei.UIEngine.HostWndManager")

 

// conghostwnd移除指定idhostwnd,并销毁。假如此时的窗口并没有销毁(也就是没有调用hostwnd.Destroy或者hostwnd.EndDialog),那么会先调用相应的销毁函数,销毁窗口,再删除窗口对象。

hostwndManager:RemoveHostWnd("NewTaskDlg.Dialog")

 

hostwnd创建窗口和销毁窗口的方法如下


对于模态对话框,调用DoModalEndDialog

对于非模态对话框,调用CreateDestroy

 

注意:假如hostwnd的窗口已经创建了,在没有销毁窗口之前,不可以再次创建,好比在MFC或者ATL里面,一个wnd不可以连续DoModal两次而不销毁。

 

一个hostwnd对象在创建之后,从hostwndmanager移除之前,可以多次调用Create或者DoModal来创建窗口并销毁,不一定每次都要从hostwndmanager里面移除对象!这样可以加速窗口创建过程,不用每次都从模板创建一个新的hostwnd的对象,新建面板就是一个典型的例子:

 

在创建hostwnd对象之前,可以先判断一下指定idhostwnd对象是否已经存在了:

local hostwndManager = XLGetObject("Xunlei.UIEngine.HostWndManager")

local modalHostWnd = hostwndManager:GetHostWnd("NewTaskDlg.Dialog")

if not modalHostWnd then

local  template = templateMananger:GetTemplate("bolt.newtaskdlg","HostWndTemplate")

if template then

modalHostWnd = modalHostWndTemplate:CreateInstance("NewTaskDlg.Dialog")

end

end

需要特别注意的是:窗口在Destroy或者EndDialog销毁了之后,对应的hostwnd对象并没有从hostwndmananger立面移除!所以下次再创建相同idhostwnd对象会失败,如果的确需要从hostwndmanager里面移除,需要显示调用:

hostwndManager:RemoveHostWnd("NewTaskDlg.Dialog")

二、             objtree对象的创建、销毁以及和hostwnd的绑定和解绑定

objtree对象的创建:

local objtreeManager = XLGetObject("Xunlei.UIEngine.TreeManager")                          

local template = templateMananger:GetTemplate("ObjectTreeTemplate1","ObjectTreeTemplate")

// 创建指定idobjtree,注意该id是全局唯一的,如果该id已经存在,则会创建失败

local uiObjectTree2 = objectTreeTemplate2:CreateInstance("NewTaskDlg.ObjectTree")

 

  objtree对象的销毁:

调用objtreemanagerDestroyTree来显示销毁,需要注意,objtree所绑定的hostwnd,在hostwndUnBindObjTree时候,不会移除(销毁)objtree对象。HostwndDestroy或者EndDialog时候,会调用UnbindObjTree解除绑定。

 

// hostwnd解绑,也可以根据idobjtreeManager里面获取

local objtree = hostwnd:UnbindUIObjectTree()      

                                                                

local objtreeManager = XLGetObject("Xunlei.UIEngine.TreeManager")

 

//销毁objtree对象。

objtreeManager:DestroyTree(objtree)

需要注意的是,窗口销毁之后,上面绑定的objtree对象不会被销毁,只是会被解除绑定,所以如果真的需要销毁objtree对象,那么需要显示销毁;否则在下次创建相同的idobjtree时候会失败,因为该idobjtree已经存在了。

下面是一个彻底的销毁hostwnd以及上面的objtree对象的一个方法:

local hostwndManager = XLGetObject("Xunlei.UIEngine.HostWndManager")

local hostwnd = hostwndManager:GetHostWnd("NewTaskDlg.Dialog")

// 解除绑定,并显示销毁                                                                    

local objtree = hostwnd:UnbindUIObjectTree()                                                                       

local objtreeManager = XLGetObject("Xunlei.UIEngine.TreeManager")

objtreeManager:DestroyTree(objtree)

// 销毁窗口                                                                    

hostwnd:EndDialog(0)

// hostwndmanager里面移除窗口对象并销毁                                 

hostwndManager:RemoveHostWnd("NewTaskDlg.Dialog")                                                                                             

 类似资料: