none
MDI程序,如何再自绘的Ribbon中重载ChildFrame的最大话、恢复按钮 RRS feed

  • 问题

  • 程序是MFC的MDI程序,之前用的自带的Ribbon。在MDI的子窗口ChildFrame最大化时,Ribbon的右上角会出现一个复原窗口的图标,点一下,刚刚最大化的ChildFrame会还原为原来的大小。如果不用Ribbon,用工具条的化,在右上角也有类似功能的图标。

    现在工程中,自己实现了一个Ribbon,现在要完成如上所述的子窗口最大化、恢复功能。不知道应该响应哪个消息?

    点ChildFrame时,ChildFrame的OnSysCommand会被触发,但是这个是单个ChildFrame上的。ChildFrame是如何通知MainFrame或者Ribbon/工具条,自己已经被最大化的状态?鼠标点到右上角的复原按钮,又如何通知Mainframe把刚刚的子窗口还原?

    2019年3月11日 14:15

答案

  • MFC是在OnWindowPosChanged消息中处理的MDI子窗口的最大化最小化工作,调用了SetMaximizeMode。

    Menu和Ribbon都重载了SetMaximizeMode。

    2019年3月14日 3:27

全部回复

  • 或者如何获取正在已经最大化的ChildFrame?
    2019年3月11日 14:26
  • 你好,

    感谢在MSDN论坛发帖提问。

    >> 子窗口最大化。

    根据MSDN官方文档来看,可能和WM_MDIMAXIMIZE消息有关,这个消息主要用来最大化MDI子窗口的。其定义可以在这个链接中看到。

    >> 或者如何获取正在已经最大化的ChildFrame?

    WM_MDIGETACTIVE消息可以用来检索当前活动子窗口句柄。

    Best Wishes,

    Jack


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年3月12日 9:43
    版主
  • MDIChildFrame,最大化时,应该是没有调MDIMaximize这条路,这条路径会向父窗口发送一个WM_MDIMAXIMIZE消息。

    但是现在的MFC子窗口最大化没有走这个路径。WM_MDIMAXIMIZE也用spy捕获不到

    2019年3月13日 6:30
  • 现在恢复最大化的子窗口已经搞定。

    剩下的问题是,子窗口最大化时候,MainFrame截获这个消息,显示出来窗户还原按钮就可以了。但是用SPY或者用代码,一直截获不了WM_MDIMAXIMIZE消息

    2019年3月13日 6:49
  • 你好,

    有人试过说在BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)中禁掉最大,最小化按钮
    子窗口的最大化按钮被禁掉,MDI就不会响应WM_MDIMAXIMIZE消息。

    发送 WM_MDIMAXIMIZE来最大化MDI子窗口和WM_MDIRESTORE来将它恢复成以前的状态. 对于这些操作总是使用这些消息. 假如你使用参数为SW_MAXIMIZE来调用ShowWindow时,MDI子窗口最大化并没有问题, 但是当你试图将它恢复成以前的状态时,问题就来了. 但是你可以用调用ShowWindow来最小化MDI子窗口.

    我会尝试一下, 这里有几个链接,你也可以看一看。
    https://bbs.csdn.net/topics/340091707
    https://bbs.csdn.net/topics/340026188
    https://bbs.csdn.net/topics/90238043

    Best Wishes,

    Jack


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年3月13日 8:42
    版主
  • MFC是在OnWindowPosChanged消息中处理的MDI子窗口的最大化最小化工作,调用了SetMaximizeMode。

    Menu和Ribbon都重载了SetMaximizeMode。

    2019年3月14日 3:27
  • ChildFrame没有禁掉最大化最小化按钮,否则没办法最大化。

    感觉MFC的新版里面,已经不再用WM_MDIMAXIMIZE消息了

    2019年3月14日 3:28