在我的 MFC(功能包)应用程序中,可以动态创建停靠窗格以显示图表/表格等。
但是,我不想让用户两次打开相同的东西。
我创建一个像这样的窗格:
// Create CMyDockablePane pPane
pPane->Create(...);
pPane->EnableDocking(CBRS_ALIGN_ANY);
// Create CRect rcPane
pPane->FloatPane(rcPane);
这似乎工作正常。
这就是我尝试检查窗格是否已存在的方式。窗格由其类型(类)和参数标识。
BOOL CanOpenPane(const type_info & paneType, const CMyParameter & parameter) const
{
CMainFrame* pFrm = GetMainFrame();
CDockingManager* pDockMan = pFrm->GetDockingManager();
// Check if there already is a pane of the same type which also has the same parameter.
bool canOpen = true;
CObList panes;
pDockMan->GetPaneList(panes);
POSITION pos = panes.GetHeadPosition();
while (pos)
{
CMyDockablePane* pPane = dynamic_cast<CMyDockablePane*>(panes.GetNext(pos));
if (NULL == pPane) { continue; }
if (paneType == typeid(*pPane) &&
pPane->GetParameter() == parameter)
{
canOpen = false;
break;
}
}
return canOpen;
}
问题在于,当我关闭窗格时,无法识别。CDockingManager 对象仍返回 GetPanes() 调用中的窗格。
如何告诉经理不要返回已关闭的窗格?
或者
当窗格关闭时,如何从窗格列表中删除窗格?
更新
我更深入地研究并发现,当单击标题栏中的“x”按钮时,CWnd 对象实际上并未关闭,而只是它们的容器。
所以真正的问题似乎是真正关闭窗格。
我还更改了问题以更好地反映问题。