在 CChildFrame 中创建的可停靠窗格在第二次应用时不可见。开始
Posted
技术标签:
【中文标题】在 CChildFrame 中创建的可停靠窗格在第二次应用时不可见。开始【英文标题】:Dockable panes created in CChildFrame not visible the second time the app. starts 【发布时间】:2010-03-09 00:58:53 【问题描述】:我在 CChildFrame::OnCreate() 中创建了一些可停靠窗格 我第一次启动应用程序时,它们会显示出来。 我第二次启动它们创建的应用程序时,但 splitterwindows 完全靠在客户端区域的两侧(底部和右侧),因此不可见。所以我必须使用鼠标将拆分器拉到客户区域,以便可停靠窗口再次可见。 如果我在我的应用程序中执行 File->New,则会创建一个新的客户端窗口并按应有的方式显示可停靠窗口。我认为这与在注册表中保存 Windows 布局有关,因为如果我更改 SetRegistryKey(_T("61sakjgsajkdg"));在我的应用程序的 CWinApp 派生类中。并重新运行它们第一次再次显示。 (但不是我第二次重新启动应用程序)。 我怎样才能保存那些可停靠窗口的布局,所以如果我重新启动我的应用程序。他们是可见的?否则我如何阻止我的应用程序。用以前保存的覆盖窗口布局。与 LoadCustomState() 和 SaveCustomState() 有什么关系?我找不到有关如何实现这些方法的任何信息。我在这里有一个演示项目的链接来说明我的意思:
http://www.4shared.com/file/237193472/c384f0f6/GUI60.html
有人能告诉我如何在应用第二次启动时在我的 CChildFrame 类中显示这些可停靠窗口吗?
【问题讨论】:
【参考方案1】:MFC Feature Pack 中的新类都将其窗口状态保存在注册表中。
从它的声音来看,我认为您可能需要在调用SetRegistryKey()
之后在InitInstance()
中调用CWinAppEx::SetRegistryBase()。 MSDN 在步骤 #4 中描述了它(几乎没有关于为什么的详细信息)here。
【讨论】:
我尝试并添加了 SetRegistryBase(_T("Settings"));在 MSDN 文档中描述的 SetRegistryKey() 之后。还是没有变化。您是否使用我的演示项目链接尝试过? 哇,我现在改变了一些东西,我在创建 CChildFrame 之后调用 SetRegistryBase()(听起来合乎逻辑),就在 InitInstance() 的末尾,它现在可以工作了!伟大的 !非常感谢亚当。 现在唯一的问题是如果您用鼠标更改窗口的布局并关闭应用程序。并重新启动,它们的窗口不会恢复到以前的位置。【参考方案2】:我认为 SaveState() 调用应该放在 CMainFrame::DestroyWindow() 方法中,这样在调用 SaveState() 时 Main Frame 的子窗口还没有被销毁。 我尝试在 CMainFrame 的析构函数中使用 SaveState(),由于子窗格已被销毁,某些断言不会通过。
【讨论】:
【参考方案3】:我在 InitInstance 中将其更改为:
。 . . if (!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"));
我不知道这是否是这样做的方法,但它现在正在工作。 任何关于此的 cmet 都非常受欢迎。
【讨论】:
当然:CMainFrame::~CMainFrame() theApp.SaveState((CMainFrame*)AfxGetMainWnd(),_T("Settings4")); 应该是: CMainFrame::~CMainFrame() theApp.SaveState(this,_T("Settings4"));以上是关于在 CChildFrame 中创建的可停靠窗格在第二次应用时不可见。开始的主要内容,如果未能解决你的问题,请参考以下文章
使用 MFC Feature Pack 1 在 VS2008 中停靠选项卡式窗格位置