MDI 选项卡名称改回.../任务栏预览未选择

MDI Tab names changing back... / Taskbar Preview not selecting

我正在创建一个没有 Document/View 的 MDI 应用程序。 我也在使用 MDITabbedGroups。

我遇到了问题,因为我必须动态命名可能的选项卡(名称在数据库中并且由用户创建),这意味着我无法为名称使用资源。 我将所有选项卡创建为 'Program name',然后在创建后调用以下命令重命名它们:

BEGIN_MESSAGE_MAP(CChildView, CWnd)
    ON_COMMAND(ID_SET_COLOR, CCOnSetColor)
END_MESSAGE_MAP()

PostMessage(WM_COMMAND, (WPARAM)ID_SET_COLOR);

void CChildView::CCOnSetColor()
{
    CMDIChildWndEx* pFrame = (CMDIChildWndEx*)GetParent();
    CMFCTabCtrl* pTabCtrl = pFrame->GetRelatedTabGroup();
    if (pTabCtrl != NULL)
    {
        pTabCtrl->SetTabBkColor(pTabCtrl->GetActiveTab(), GetTabCol());
        pTabCtrl->SetTabLabel(pTabCtrl->GetActiveTab(), GetTabName());
        pTabCtrl->RedrawWindow();
    }
}

但问题是,当我切换标签时,名称会变回 'Program Name'。

我通过跳过 OnMDIActivate 调用中的 CMDIChildWndEx 设法避免了这种情况:

void CChildFrame::OnMDIActivate(BOOL bActivate, CWnd* activated, CWnd* disbled)
{
    CWnd::OnMDIActivate(bActivate, activated, disbled);
}

我知道,我知道,不好。然而:

这工作正常,所有其他功能似乎都在工作,选项卡正在切换,活动 window 是正确的等等...

直到我注意到当鼠标悬停在任务栏上时,我可以预览所有打开的选项卡,如果我点击其中一个不活动的选项卡,就会出错。 现在活动框架/视图(MainFrame 中的 GetActiveFrame() / GetActiveView())是我点击的那个,但它没有被绘制,标签也没有切换到。

所以我尝试了:

void CChildFrame::OnMDIActivate(BOOL bActivate, CWnd* activated, CWnd* disbled)
{
    CMDIChildWndEx::OnMDIActivate(bActivate, activated, disbled);
    CMFCTabCtrl* pTabCtrl = GetRelatedTabGroup();
    if (pTabCtrl != NULL)
    {
        pTabCtrl->SetTabBkColor(pTabCtrl->GetActiveTab(), m_wndView.GetTabCol());
        pTabCtrl->SetTabLabel(pTabCtrl->GetActiveTab(), m_wndView.GetTabName());
        //  pTabCtrl->SetTabIcon(pTabCtrl->GetActiveTab(), 2);
        pTabCtrl->RedrawWindow();
    }
}

&&&

void CChildFrame::OnMDIActivate(BOOL bActivate, CWnd* activated, CWnd* disbled)
{
    CMDIChildWndEx::OnMDIActivate(bActivate, activated, disbled);
    m_wndView.PostMessage(WM_COMMAND, (WPARAM)ID_SET_COLOR);
    if(disbled) ((CChildFrame*)disbled)->m_wndView.PostMessage(WM_COMMAND, (WPARAM)ID_SET_COLOR);
}

现在选项卡切换正确,但只有被激活的选项卡获得正确的名称,所有非活动选项卡返回 'Program Name' 有趣的是,颜色保持正确。

所以问题: 我可以以某种方式/在哪里永久更改名称吗? 我在 MS 文档中看到它可以在 CDocument 中设置,但我没有文档... 或者我每次需要接听什么电话来设置我的名字?

还有红利问题: 我可以让预览只显示 'Active' 选项卡,而不显示其他选项卡吗?

在 AFX 源文件中进行了大量搜索后,我发现了这个:

CString CMDIChildWndEx::GetFrameText() const
{
    ASSERT_VALID(this);

    CString strText;
    GetWindowText(strText);

    return strText;
}

&这个

void CMDIFrameWnd::OnUpdateFrameTitle(BOOL bAddToTitle)
{
    if ((GetStyle() & FWS_ADDTOTITLE) == 0)
        return;     // leave it alone!
    ... // rest of func
}

所以它就像删除 MS 在函数 BOOL PreCreateWindow(CREATESTRUCT& cs) 上自动放置的样式标志一样简单(通过向导创建项目)。 然后通过 SetWindowText(title);

设置框架的标题