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);
设置框架的标题
我正在创建一个没有 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);