如何更改CDockablePane标题

时间:2010-02-22 17:43:54

标签: visual-studio-2008 visual-c++ mfc-feature-pack

如何在MFC功能部件包中强制刷新CDockablePane的标题?我正在使用选项卡式visual studio样式示例,我想更改选项卡的标题。

这些似乎在某处缓存,因为当我从默认值更改时,它会使用应用程序在之前运行时使用的内容。我在注册表中找不到与此有关的任何内容。

我正在修改字符串表IDS_FILE_VIEW和IDS_CLASS_VIEW以设置新标题。我已经步入CDockablePane :: CreateEx方法,lpszCaption参数确实包含新标题,但旧标题仍在使用中。

在隐藏窗格并再次显示之前,似乎不会加载新标题。这应该是一个暗示,但我无法弄清楚。

为什么它不会只使用我传递给CreateEx ???的标题

6 个答案:

答案 0 :(得分:6)

简而言之,这是MFC功能包中的一个错误 - 实际上是在BCG软件库中。错误是您无法动态更改这些标题。他们的答案是“你为什么要这样做?”

可停靠窗格中选项卡式窗格的标题存储在注册表中。如果已在注册表中存在标题,则不会使用创建时使用的标题。

因此,第一次运行应用程序时,它将使用字符串表中的标题。之后,它使用注册表中的标题。

使用应用程序向导创建的设置,注册表设置位于:

HKEY_CURRENT_USER\Software\Local AppWizard-Generated Applications\MyApp\Workspace\DockingManager-128\DockingPaneAndPaneDividers

此密钥中存储的值基本上是一个二进制文件,在对接管理器启动时会被序列化到窗格中。内容未记录,但您可以在afxdockablepane.cpp中查看代码正在执行的操作。

我希望这可以帮助遇到此问题的其他人。

答案 1 :(得分:2)

嗯,我猜错了,但我只是在CDockablePane的一个实例上调用'SetWindowText'。 它的标题改为我传递给'SetWindowText'......

答案 2 :(得分:1)

我有类似的问题,在第一次关闭申请后,两个窗格同名。我删除了注册表项,在第一次启动时一切正常,第二次我又得到了相同的bug。 SetWindowText函数( “MyPane”);在窗格的重写 OnSize 中做了脏工作。它不是设置窗口标题的最佳位置,但正如Colerman所述,SetWindowsText始终不能正常工作。

无论如何,当应用程序启动时,窗格定位过程总是在创建窗格完成后调用 OnSize ,所以对我来说这个肮脏的黑客做了伎俩。

答案 3 :(得分:0)

窗口名称在LoadState()时序列化。删除与应用中窗口位置相关的所有注册表信息。就我而言,它是在HKCU \ Software \ My App Name。

答案 4 :(得分:0)

我遇到了同样的问题,但由于我不喜欢这里提供的任何解决方案,我进一步发现你可以通过引用CDockingManager并调用它来轻松地从注册表中禁用状态加载方法DisableRestoreDockState

答案 5 :(得分:0)

由于选项卡的文本存储在注册表中,并且执行该操作的代码很好地隐藏和未记录,我发现了一种令人讨厌的方式来执行您想要的操作。

将.rc文件中的字符串表更改为您想要的,例如我在此处将ClassView更改为LayerView:

STRINGTABLE
BEGIN
    IDS_CLASS_VIEW          "Layer View"
    ...
END

在您的大型机类中添加此调用:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    BOOL bNameValid;

    // set the visual manager and style based on persisted value
    OnApplicationLook(theApp.m_nAppLook);

    GetDockingManager()->DisableRestoreDockState(TRUE); // <-- THIS CALL

这将存储意味着当您关闭然后打开您的应用程序时,存储在注册表中的名称将是您放在.rc文件中的名称。

现在您可以注释掉对DisableRestoreDockState的调用,因为正确的调用存储在注册表中。用户计算机中的新安装也可以正常运行。

我没有在最终版本中保留DisableRestoreDockState,因为我希望恢复其他设置。

HTH