Mfc 在CChildFrame中创建的可停靠窗格在应用程序第二次运行时不可见。开始

Mfc 在CChildFrame中创建的可停靠窗格在应用程序第二次运行时不可见。开始,mfc,mfc-feature-pack,Mfc,Mfc Feature Pack,我已经在CChildFrame::OnCreate()中创建了一些可固定的窗格 第一次启动应用程序时,它们会显示出来。 第二次启动应用程序时,它们已创建,但拆分窗口完全靠在客户端区域的两侧(底部和右侧),因此不可见。所以我必须用鼠标将拆分器拉入客户区,这样可固定窗口才能再次可见。 如果我在我的应用程序中执行文件->新建,将创建一个新的客户端窗口,并按原样显示可固定窗口。我认为这与在注册表中保存windows布局有关,因为如果我更改SetRegistryKey(_T(“61sakjgsajkdg”

我已经在CChildFrame::OnCreate()中创建了一些可固定的窗格 第一次启动应用程序时,它们会显示出来。 第二次启动应用程序时,它们已创建,但拆分窗口完全靠在客户端区域的两侧(底部和右侧),因此不可见。所以我必须用鼠标将拆分器拉入客户区,这样可固定窗口才能再次可见。 如果我在我的应用程序中执行文件->新建,将创建一个新的客户端窗口,并按原样显示可固定窗口。我认为这与在注册表中保存windows布局有关,因为如果我更改SetRegistryKey(_T(“61sakjgsajkdg”);在我的应用程序的CWinApp派生类中。并在第一次重新运行时再次显示它们。(但不是我第二次重启应用程序)。 我如何保存这些可固定窗口的布局,以便重新启动应用程序。它们是可见的吗?或者我如何阻止我的应用程序。使用以前保存的窗口布局覆盖窗口布局的方法。与LoadCustomState()和SaveCustomState()有关,我找不到关于如何实现这些方法的任何信息。我这里有一个到演示项目的链接来演示我的意思:


有人能告诉我如何在应用程序第二次启动时在我的CChildFrame类中显示这些可固定窗口吗?

MFC功能包中的新类都将其窗口状态保存在注册表中


听上去,我认为在调用
SetRegistryKey()
之后,可能需要调用
InitInstance()
。MSDN在步骤#4中对其进行了描述(几乎没有详细说明原因)。

我在InitInstance中将其更改为:

。 . . 如果(!ProcessShellCommand(cmdInfo)) 返回FALSE

LoadState((CMainFrame*)AfxGetMainWnd(),_T("Settings4"));

// The main window has been initialized, so show and update it
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();

以及:

CMainFrame::~CMainFrame() { app.SaveState((CMainFrame*)AfxGetMainWnd(),_T(“设置4”); }

我不知道这是否是一种方法,但它目前正在发挥作用。 对此的任何评论都是非常受欢迎的。

我认为SaveState()调用应该放在cmInframe::DestroyWindow()方法中,这样在调用SaveState()时主框架的子窗口就不会被破坏。

我尝试在CMainFrame的析构函数中使用SaveState(),一些断言无法通过,因为子窗格已被销毁。

我尝试并添加了SetRegistryBase(_t(“设置”);在MSDN文档中描述的SetRegistryKey()之后。还是没有变化。你试过使用我的演示项目链接吗?哇,我现在改变了一些东西,在CChildFrame创建之后调用SetRegistryBase()(听起来很合乎逻辑),就在InitInstance()的末尾,它现在可以工作了!伟大的非常感谢adam。现在唯一的问题是如果你用鼠标改变窗口的布局并关闭应用程序。然后重新启动,windows不会恢复到以前的位置。当然:CMainFrame::~CMainFrame(){theApp.SaveState((CMainFrame*)afxgetmainnd(),_T(“setings4”);}应该是:CMainFrame::~CMainFrame(){theApp.SaveState(this,_T(“setings4”);}