Как получить выбор новой страницы пользователя в элементе управления Notebook под Windows? - PullRequest
0 голосов
/ 24 августа 2018

В моем приложении, когда пользователь внес изменения в данные на одной странице элемента управления моего ноутбука, я хочу предложить им сохранить или отменить изменения, когда они переключаются на другую страницу.Для этого я связал событие EVT_BOOKCTRL_PAGE_CHANGING и создал метод-обработчик.

Однако я не могу сказать, на какую страницу переключается пользователь.Согласно wxBookCtrlEvent docs ,

под Windows, GetSelection () будет возвращать то же значение, что и GetOldSelection () при вызовеиз обработчика EVT_BOOKCTRL_PAGE_CHANGING, а не страницы, которая будет выбрана.

Есть ли обходной путь?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

под Windows, GetSelection () вернет то же значение, что и GetOldSelection () при вызове из EVT_BOOKCTRL_PAGE_CHANGING обработчик, а не страница, которая будет выделена.

Итак, вызовите GetSelection из EVT_BOOKCTRL_PAGE_CHANGED, чтобы получить новую страницу.

0 голосов
/ 25 августа 2018

Нет, обходного пути нет (если бы существовал надежный способ сделать это, wxWidgets уже делал бы это), базовый нативный элемент управления просто не предоставляет эту информацию.

Вы можете либо спросить все, что вам нужно, чтобы спросить пользователя в любом случае, независимо от страницы, на которую он переключается, или спросить его после того, как он уже переключился - что, конечно, будет выглядеть странно если вы решите вернуться обратно.

Если вам действительно нужна эта функция, вы можете использовать не нативный wxAuiNotebook.

0 голосов
/ 24 августа 2018

Я думаю, что в качестве обходного пути вы могли бы использовать обработчик мыши, проверяющий, когда нажата левая кнопка.В обработчике для этого события вы можете выполнить проверку попадания, чтобы увидеть, где был сделан щелчок, и сохранить значение вкладки, по которой был выполнен щелчок.Как то так:

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 
}
...