1

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

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

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

4

3 回答 3

1

MFC Feature Pack 中的新类都将其窗口状态保存在注册表中。

从它的声音来看,我认为你可能需要在你调用CWinAppEx::SetRegistryBase()InitInstance()之后调用SetRegistryKey(). MSDN 在第 4 步中对其进行了描述(几乎没有详细说明原因)。

于 2010-03-09T02:11:37.813 回答
1

我认为 SaveState() 调用应该放在 CMainFrame::DestroyWindow() 方法中,这样在调用 SaveState() 时 Main Frame 的子窗口还没有被破坏。
我尝试在 CMainFrame 的析构函数中使用 SaveState(),由于子窗格已经被破坏,一些断言不会通过。

于 2010-11-18T06:45:07.277 回答
0

我在 InitInstance 中将其更改为:

. . . 如果(!ProcessShellCommand(cmdInfo))返回假;

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

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

. .

并在:

CMainFrame::~CMainFrame() { theApp.SaveState((CMainFrame*)AfxGetMainWnd(),_T("Settings4")); }

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

于 2010-03-09T04:11:33.140 回答