7

如何强制刷新 MFC 功能包中 CDockablePane 的标题?我正在使用选项卡式视觉工作室样式示例,并且我想更改选项卡的标题。

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

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

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

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

4

6 回答 6

6

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

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

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

使用 AppWizard 创建的设置,注册表设置位于:

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

存储在此键中的值基本上是一个二进制文件,它在对接管理器启动时被序列化到窗格中。内容没有记录,但您可以在 afxdockablepane.cpp 中看到代码在做什么。

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

于 2010-02-23T21:58:31.350 回答
2

嗯,也许我误解了,但我只是在 CDockablePane 的一个实例上调用了“SetWindowText”。它的标题更改为我传递给“SetWindowText”的内容......

于 2010-03-09T13:17:14.223 回答
1

我有类似的问题,在第一次关闭应用程序后,两个窗格的名称相同。我删除了注册表项,第一次启动时一切正常,第二次我又遇到了同样的错误。SetWindowText("MyPane"); 在覆盖的窗格的OnSize中完成了肮脏的工作。它不是设置 windows 标题的最佳位置,但正如 Colerman 上面所说的,SetWindowsText 并不总是正常工作。

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

于 2013-12-11T22:14:49.770 回答
0

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

于 2010-11-19T00:12:02.270 回答
0

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

于 2013-06-06T15:23:16.783 回答
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,因为我希望恢复其他设置。

高温高压

于 2013-12-09T06:12:00.680 回答