hostwnd对象可以创建一次,同时指定一个全局唯一的id;也可以delete一次,就是从hostwndmanager里面移除掉,。
创建hostwnd对象代码如下:
// 先获取templateManager
local templateMananger = XLGetObject("Xunlei.UIEngine.TemplateManager")
// 获取要创建的hostwnd的模板
local tm = templateMananger:GetTemplate("bolt.newtaskdlg","HostWndTemplate")
// 创建hostwnd,并指定一个全局唯一的id,如果该id的hostwnd已经存在,则会创// 建失败。
local modalHostWnd = tm:CreateInstance("NewTaskDlg.Dialog")
移除hostwnd对象的代码如下:
local hostwndManager = XLGetObject("Xunlei.UIEngine.HostWndManager")
// conghostwnd移除指定id的hostwnd,并销毁。假如此时的窗口并没有销毁(也就是没有调用hostwnd.Destroy或者hostwnd.EndDialog),那么会先调用相应的销毁函数,销毁窗口,再删除窗口对象。
hostwndManager:RemoveHostWnd("NewTaskDlg.Dialog")
hostwnd创建窗口和销毁窗口的方法如下
对于模态对话框,调用DoModal和EndDialog
对于非模态对话框,调用Create和Destroy
注意:假如hostwnd的窗口已经创建了,在没有销毁窗口之前,不可以再次创建,好比在MFC或者ATL里面,一个wnd不可以连续DoModal两次而不销毁。
一个hostwnd对象在创建之后,从hostwndmanager移除之前,可以多次调用Create或者DoModal来创建窗口并销毁,不一定每次都要从hostwndmanager里面移除对象!这样可以加速窗口创建过程,不用每次都从模板创建一个新的hostwnd的对象,新建面板就是一个典型的例子:
在创建hostwnd对象之前,可以先判断一下指定id的hostwnd对象是否已经存在了:
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立面移除!所以下次再创建相同id的hostwnd对象会失败,如果的确需要从hostwndmanager里面移除,需要显示调用:
hostwndManager:RemoveHostWnd("NewTaskDlg.Dialog")
二、 objtree对象的创建、销毁以及和hostwnd的绑定和解绑定
objtree对象的创建:
local objtreeManager = XLGetObject("Xunlei.UIEngine.TreeManager")
local template = templateMananger:GetTemplate("ObjectTreeTemplate1","ObjectTreeTemplate")
// 创建指定id的objtree,注意该id是全局唯一的,如果该id已经存在,则会创建失败
local uiObjectTree2 = objectTreeTemplate2:CreateInstance("NewTaskDlg.ObjectTree")
objtree对象的销毁:
调用objtreemanager的DestroyTree来显示销毁,需要注意,objtree所绑定的hostwnd,在hostwnd的UnBindObjTree时候,不会移除(销毁)objtree对象。Hostwnd在Destroy或者EndDialog时候,会调用UnbindObjTree解除绑定。
// 从hostwnd解绑,也可以根据id从objtreeManager里面获取
local objtree = hostwnd:UnbindUIObjectTree()
local objtreeManager = XLGetObject("Xunlei.UIEngine.TreeManager")
//销毁objtree对象。
objtreeManager:DestroyTree(objtree)
需要注意的是,窗口销毁之后,上面绑定的objtree对象不会被销毁,只是会被解除绑定,所以如果真的需要销毁objtree对象,那么需要显示销毁;否则在下次创建相同的id的objtree时候会失败,因为该id的objtree已经存在了。
下面是一个彻底的销毁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")