none
CMFCBaseCtrl在只有一个Tab的情况下,在OnMouseMove之后,不在响应OnLButtonUp,是怎么回事? RRS feed

  • 问题

  • 用CDockablePane,当两个Dock窗口叠在一起时,会出一个TabCtrl,出现两个Tab。用鼠标拖拽一个,会把它拖成浮动状态。

    看了一下消息序列,会响应CMFCBaseTabCtrl的OnLButtonDown  => OnMouseMove => OnLButtonUp => CDockablePane::OnLButtonUp。

    现在重写了CDockablePane::CreateTabbedPane,设置HideSingleTab(FALSE),使只有一个Tab标签时也显示。

    当有2个tab时没有问题,但是当只有一个标签的Tab上用鼠标拖拽,还是想拖拽成浮动窗口。

    跟踪消息,CMFCBaseTabCtrl::OnLButtonDown => OnMouseMove,然后就不再响应OnLButtonUp了。导致窗口拖不出来。

    看来一下OnMouseMove函数里面,拖拽一个Tab的路径和2Tab的几乎相同。不知道为什么会不在继续相应OnLButtonUp了

    请问OnLButtonUp怎么会丢失?

    2019年3月24日 11:06

全部回复

  • 跟踪调试,发现在一个标签拖拽的OnMouseMove以后,进入到了CMFCTabCtrl ::OnCancelMode, CMFCBaseTabCtrl::OnCancelMode。

    什么原因会进入到OnCancelMode?

    2019年3月24日 11:14
  • 你好,

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

    >>CMFCBaseCtrl在只有一个Tab的情况下,在OnMouseMove之后,不在响应OnLButtonUp,是怎么回事

    框架调用OnCancelMode函数以通知CWnd取消内部模式。如果CWnd拥有焦点,则当对话框或消息框被显示时,它的OnCancelMode成员函数将被调用。这使CWnd拥有一个取消模式的机会,如鼠标捕获等。

    根据你的问题描述,我建议你可以参考以下CDockablePane的实现,来实现当只有一个Tab标签时,可以将它拖曳成一个浮动窗口。

    >>跟踪调试,发现在一个标签拖拽的OnMouseMove以后,进入到了CMFCTabCtrl ::OnCancelMode, CMFCBaseTabCtrl::OnCancelMode。
    什么原因会进入到OnCancelMode?

    请问您能否为我们提供简单的代码小样,让我们重现你的问题,这样我们才能为您提供更有效的帮助。

    Best Regards,

    Jeanine Zhang
    2019年3月25日 8:43
    版主