如何在Windows下的Notebook控件中获取用户的新页面选择?

How to get the user's new page selection in a Notebook control under Windows?

在我的应用程序中,当用户对笔记本控件的某一页上的数据进行更改时,我想在他们切换到另一页时提示他们保存或放弃更改。我为此绑定了 EVT_BOOKCTRL_PAGE_CHANGING 事件,并创建了一个处理程序方法。

但是,我无法判断用户正在切换到哪个页面。根据the wxBookCtrlEvent docs,

under Windows, GetSelection() will return the same value as GetOldSelection() when called from the EVT_BOOKCTRL_PAGE_CHANGING handler and not the page which is going to be selected.

有解决办法吗?

我想作为一种解决方法,您可以使用鼠标处理程序来检查何时单击了左键。在该事件的处理程序中,您可以进行点击测试以查看点击的位置并存储被点击的选项卡的值。像这样:

void MyFrame::OnLeftDown( wxMouseEvent& event )
{
    long flags;
    int ht = m_notebook1->HitTest( wxPoint(event.GetX(),event.GetY()), &flags);

    if( (flags & wxBK_HITTEST_NOWHERE) == 0 )
    {
        //store the value of ht somewhere 
    }

    event.Skip();
}

void MyFrame::OnNotebookPageChanging( wxNotebookEvent& event )
{
    //use the stored value of ht here 
}

under Windows, GetSelection() will return the same value as GetOldSelection() when called from the EVT_BOOKCTRL_PAGE_CHANGING handler and not the page which is going to be selected.

因此,从 EVT_BOOKCTRL_PAGE_CHANGED 调用 GetSelection 以获取新页面。

不,没有解决方法(如果有可靠的方法,wxWidgets 早就在做),底层的本机控件根本不提供此信息。

您可以在任何情况下询问您需要向用户询问的任何问题,与他们切换到的页面无关,或者在他们已经切换后询问他们——当然,这将是如果您随后决定切换回来,看起来会很奇怪。

如果您真的非常需要这个功能,您可以使用非本地 wxAuiNotebook