2010-02-22 69 views
6

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

虽然这些似乎被缓存在某处,但当我从默认值更改时,它会使用上次运行时使用的应用程序。我无法在注册表中找到与此相关的内容。

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

直到窗格隐藏并再次显示后,新的标题才会加载。这应该是一个暗示,但我无法弄清楚。

为什么不只是使用我作为CreateEx标题传递的内容?

回答

6

简而言之,这是MFC功能包中的一个错误 - 实际上在BCG软件库中。错误是你不能动态改变这些字幕。他们的回答是“你为什么要这么做?”

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

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

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

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

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

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

+0

很好的回应thx。我的答案是'你为什么要这么做?'......嗯......国际化(对不起BCG ......英语不是处处可见)。荒谬。 – 2015-11-04 20:28:37

+0

哇这太绝对了。我一直在寻找我们的窗格不正确的翻译了一个小时的原因,直到我偶然发现了这个答案。非常感谢你。 – TorbenJ 2017-11-10 08:13:29

2

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

+0

是的,SetWindowText起作用,但并不像预期的那样。您必须在调用Create之后的某个时间调用SetWindowText,并且它不能是Create之后的下一个调用。例如,VS示例有一个名为CreateDockingWindows的函数。在该函数中添加对SetWindowText的调用(在适当的Create之后)不起作用。 我原来的帖子的一点是,创建函数需要一个完全忽略的标题参数。 – cigarman 2010-03-15 15:41:12

0

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

0

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

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

1

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

无论如何,当应用程序被启动,:放置窗格进程随时拨打筛上部分创建窗格的完成,所以对我来说这个肮脏的黑客的伎俩。