在CChildFrame中创建的可停靠窗格在第二次应用时不可见。启动

时间:2010-03-09 00:58:54

标签: mfc mfc-feature-pack

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

http://www.4shared.com/file/237193472/c384f0f6/GUI60.html

有人可以告诉我如何在应用程序第二次启动时在我的CChildFrame类中显示那些可停靠的窗口吗?

3 个答案:

答案 0 :(得分:1)

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

从它的声音来看,我认为您可能需要在致电InitInstance()后致电SetRegistryKey() {{1}}。 MSDN在步骤#4中描述了它(在为什么CWinAppEx::SetRegistryBase()几乎没有细节。

答案 1 :(得分:1)

我认为SaveState()调用应放在CMainFrame :: DestroyWindow()方法中,以便在调用SaveState()时主框架的子窗口尚未销毁。
我试图在CMainFrame的析构函数中使用SaveState(),因为子窗格已经被破坏,所以一些断言不会通过。

答案 2 :(得分:0)

我在InitInstance中将它改为:

。 。 。 if(!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();

AND in:

的CMainFrame ::〜CMainFrame中() {     theApp.SaveState((CMainFrame中*)AfxGetMainWnd(),_ T( “Settings4”)); }

我不知道这是否是这样做的方法,但它现在正在运作。 对此的任何评论都非常受欢迎。