none
启动时从注册表恢复布局问题 RRS feed

  • 问题

  • MFC的MDI程序,里面有多个CDockablePane。程序退出时,在注册表中记录了退出时的窗口大小和布局。现在想要重新启动时恢复到这个大小和布局。用LoadState函数可以读到注册表中保存的大小。

    现在碰到的问题是,启动时调用ShowWindow(nCmd)函数,它会重新计算窗口大小,导致保存的窗口大小被改动了。

    我写了一个LoadRegState函数,从注册表中用LoadState恢复窗口布局。

    如果下面的调用次序,就可以恢复布局,但是问题时启动时界面会闪缩。

    ShowWindow(nCmd);

    LoadRegState();

    如果反过来调用,LoadRegState获取的窗口大小,会在ShowWindow中被调整。在调用ShowWindow过程中,OnSize会触发一两次,后面的cx,cy不是注册表中保存的值了。

    LoadRegState();

    ShowWindow(nCmd);

    请问如何避免ShowWindow窗口改变窗口大小?只要他显示,不要它调整大小。

    2020年2月3日 5:10

全部回复

  • 如果时非最大化状态,各个窗口的大小恢复原状没问题。

    但是如果是启动时最大化状态,ShowWindow会调整窗口大小。恢复不了注册表中退出时保存的最大化窗口大小,尽管保存的信息就是最大化的状态。

    应该时Showwindow在处理最大化窗口时,多发送了一次消息。如何在最大化时,还能恢复保存的窗口大小?

    2020年2月3日 5:33
  • 你好,

    感谢您在MSDN论坛发帖提问。

    >>应该时Showwindow在处理最大化窗口时,多发送了一次消息。如何在最大化时,还能恢复保存的窗口大小?

    ShowWindow函数中第二个参数nCmdShow是用来控制窗口的显示方式的。如果启动应用程序的程序提供了STARTUPINFO结构,则在应用程序首次调用ShowWindow时将忽略此参数。否则,第一次调用ShowWindow时,该值应为WinMain函数在其nCmdShow参数中获得的值。

    更多详细资料我建议你可以参考以下链接:https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-showwindow

    如果应用程序是由用户启动的,则没有STARTUPINFO,并且应该使用nCmdShowfrom WinMain()来确定主UI的显示方式。

    如果该应用程序是由系统或另一个应用程序启动的,则可能是STARTUPINFO,因此您应该忽略nCmdShowfrom,WinMain()而使用nCmdShowfrom STARTUPINFO。

    调用ShowWindow()可以为您处理这两种情况。但是,如果您使用强制显示窗口VS_VISIBLE,则不会影响调用者希望您的应用在启动时显示(或不显示)的方式。

    Best Regards,

    Jeanine Zhang

    2020年2月3日 8:10
    版主