【问题标题】:Dockable panes created in CChildFrame not visible the second time the app. starts在 CChildFrame 中创建的可停靠窗格在第二次应用时不可见。开始
【发布时间】: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 类中显示这些可停靠窗口吗?

【问题讨论】:

    标签: mfc mfc-feature-pack


    【解决方案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")); }
      猜你喜欢
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2013-03-14
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多