停靠对话框是指可以停靠在视图上下左右的对话框,创建的MFC对话框,可以调用停靠对话框的接口,直接嵌入到框架之中。

平台停靠对话框相关的类主要在BPNewDockManager和BPNewDockContainer中,BPNewDockContainer是用于承载dock内面板的容器类,BPNewDockManager主要是对dock进行管理,其中管理了4个BPNewDockContainer容器类。BPNewDockManager及BPNewDockContainer方法包括的方法如表8-4所示。

表8-4 停靠对话框接口列表

方法 描述
BPNewDockManager bool setDlg(int,CDialog)
BPNewDockContainer getDock(int)
void showDockContainer(int,bool)
void setDockPosition(int,CString)
BPNewDockContainer setDlg(CDialog )
CDialog getDlg()
showDockContainer(bool)
setDockPosition(CString)

代码片段8-4展示了创建停靠对话框的过程。在示例中,先创建一个MFC对话框,这里需要注意的是创建的MFC对话框,属性中“Border”为none,“style”为child,“center”为false,创建的对话框与dock绑定,通过create函数把dock管理类中的第1个dock与创建的MFC对话框绑定。后续通过获取的BPNewDockContainer或者BPNewDockManager中传入序号来设置dock及停靠属性。属性包括设置停靠对话框的位置,位置的关键参数有5个,分别是“left”“right”“top”“bottom”“bottom-left”“left-DockTab”,代表的是左侧、右侧、上面、下面、左下侧、左侧页签面,最后就是设置创建的停靠框是否显示。至此完成停靠框的创建、嵌入、位置、显隐控制等。

创建dock对话框还有一点需要注意的是,一定要确认资源已经切换到对话框所在的模块,即是否有ExampledllDemo.AttachInstance(hInstance)这样的操作,不然可能会显示不出自己设置的对话框,而随便弹出其他模块的对话框。

BPNewDockContainer* myDock1 = nullptr;
void ToolUIRelevantDemo::initDockDemo()
{
    PBBimModuleResourceOverride resOverride;
    // 停靠窗口
    ExternPaneDlg * dlg1 = new ExternPaneDlg();
    dlg1->Create(IDD_DIALOG_Dock, BPNewDockManager::getInstance().getDock(0));
    myDock1 = BPNewDockManager::getInstance().getDock(0);
    if (myDock1 != NULL)
    {
        myDock1->SetDlg(dlg1);
        myDock1->SetDockPosition(L"right");
        myDock1->ShowDockContainer(true);
        myDock1->SetWindowTextW(L"123");
    }
}

代码8-4:创建停靠对话框