【问题标题】:How to change the CDockablePane caption如何更改 CDockablePane 标题
【发布时间】:2010-02-22 17:43:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 很好的回应谢谢。我对“你为什么要这样做?”的回答......嗯......国际化(抱歉 BCG......不是到处都说英语)。可笑。
    • 哇,这太荒谬了。我一直在寻找我们的窗格被错误翻译了大约一个小时的原因,直到我偶然发现了这个答案。非常感谢。
    • 感谢您的提示。在更改字符串资源并且未更改选项卡标题后,我一直想知道我是否有正确的字符串。奇怪的是,当鼠标放在选项卡上时出现的提示确实使用了新字符串!
    【解决方案2】:

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

    【讨论】:

    • 是的,SetWindowText 有效,但并不像预期的那样。您必须在调用 Create 之后的某个时间调用 SetWindowText,并且它不能是 Create 之后的下一个调用。例如,VS 示例有一个名为 CreateDockingWindows 的函数。在该函数中添加对 SetWindowText 的调用(在适当的创建之后)不起作用。我原来的帖子的重点是 Create 函数需要一个完全被忽略的标题参数。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          将.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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-25
            相关资源
            最近更新 更多