在 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 功能包 - 关闭后无法显示可停靠窗格

将控制栏/窗格停靠到 CMDIFrameWndEx?

使用 MFC Feature Pack 1 在 VS2008 中停靠选项卡式窗格位置

如何在颤动的另一个有状态小部件中访问在一个有状态小部件中创建的对象

光标检索在 plpgsql 函数中创建的表中已删除的行

闪亮的应用程序模块:使用传单提取在服务器函数中创建的输入