如何在MFC功能部件包中强制刷新CDockablePane的标题?我正在使用选项卡式visual studio样式示例,我想更改选项卡的标题。
这些似乎在某处缓存,因为当我从默认值更改时,它会使用应用程序在之前运行时使用的内容。我在注册表中找不到与此有关的任何内容。
我正在修改字符串表IDS_FILE_VIEW和IDS_CLASS_VIEW以设置新标题。我已经步入CDockablePane :: CreateEx方法,lpszCaption参数确实包含新标题,但旧标题仍在使用中。
在隐藏窗格并再次显示之前,似乎不会加载新标题。这应该是一个暗示,但我无法弄清楚。
为什么它不会只使用我传递给CreateEx ???的标题
答案 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