wxAuiNotebook的wxAUI_NB_TAB_EXTERNAL_MOVE样式用法

来源:互联网 发布:旺点软件怎么恢复数据 编辑:程序博客网 时间:2024/06/11 06:41

     wxAuiNotebook是wxWidgets库中用于实现同一窗口显示多页的页面tab,这是一种很流行的页面布局方式。在wxWidgets中,可以将从wxWindow继承的页面添加到notebook中,页面上可以再放多个控件。另外,因为控件本身也从wxWindow继承,所以也可以将单个的一个控件添加到notebook中。

 

    notebook的分页可以支持页面拖放,即拖动页面的位置。但要支持拖动需要在创建notebook时指定style。有两个支持拖动的style:

    wxAUI_NB_TAB_MOVE:支持将页面在同一个notebook从一个位置拖动到另一个位置。

    wxAUI_NB_TAB_EXTERNAL_MOVE:支持将页面从一个notebook拖动到另一个notebook。

 

    下面的代码片断创建了两个notebook,每个notebook上添加两个text控件,即每个notebook有两个分页。

 

 

     创建完后,试了一下拖动功能。在同一个notebook拖动页面是没问题了。但是当将页面拖动到另一个notebook上时却发现不行。原本以为是个bug,后来看了下wxWidgets源代码关于wxAUI_NB_TAB_EXTERNAL_MOVE样式的控制,才发现另有玄机。

        看看wxWidgets处理拖动的代码:

    

        原来wxWidgets对于拖动到另一个notebook的情况并不直接放进去,而是先发一个wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND事件给目标notebook,问一下是否允许放进去,

                if (!e.IsAllowed()) //wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND是否被allowed
                {
                    // no answer or negative answer
                    m_mgr.HideHint();
                    return;        //不allowed,直接return,当然就没法拖放了。
                }

       

        看了这个之后就明白了,那我们只要处理目标notebook的wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND事件就可以了。下面就添加notebook的事件处理:

        编译完,再跑一下,果然可以拖动到外部了。

        wxWidgets确实是个挺好用的界面库,类体系和MFC差不多,但却封装了很多MFC没有的控件,省去自己再扩展MFC的麻烦。只是文档还是不够全面。像这个wxAUI_NB_TAB_EXTERNAL_MOVE样式支持外部拖放需要自己再处理事件的都没写清楚。看来要推广开来还需要努力啊。

原创粉丝点击