Page 1 of 1

как проигнорировать Enter от wxMessageBo

Posted: Wed Oct 15, 2008 3:11 pm
by bybars
Ситуация такая: лист-контрол хочет обрабатывать выбор элемента по клавише Enter.
Но, если клавиша Enter нажата на недопустимом элементе, то выдается wxMessageBox
с кнопкой OK. Если этот диалог закрыть клавишей Enter, то возникает событие, которое
опять обрабатывается FolderViewListCtrl::OnKeyUp( wxKeyEvent& event ).
Получается зацикливание.

Вопрос: как проигнорировать Enter от wxMessageBox или определить, что событие пришло от wxMessageBox?

Code: Select all

BEGIN_EVENT_TABLE( FolderViewListCtrl, wxListCtrl )
    EVT_KEY_UP( FolderViewListCtrl::OnKeyUp )
END_EVENT_TABLE()



void FolderViewListCtrl::OnKeyUp( wxKeyEvent& event )
{
   ////@begin wxEVT_KEY_UP event handler for ID_LISTCTRL in FolderViewListCtrl.
   event.Skip();
   ////@end wxEVT_KEY_UP event handler for ID_LISTCTRL in FolderViewListCtrl. 

   // Игнорируем события от других дочерних окон
   if( event.GetId() != ID_LISTCTRL ) return;	// ***Здесь мы никогда не получаем неравенства

   int keycode = event.GetKeyCode();
   switch(keycode)
   {
   case WXK_RETURN:
         long item = -1;
         item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
         if(item==2)	// Здесь условие другое (типа допустимо ли для данного элемента WXK_RETURN)
         {
            ////SetEvtHandlerEnabled(false); // ***Не работает
            wxMessageBox(wxT("WXK_RETURN не допустимо"), wxT("Предупреждение"), wxOK,::wxGetTopLevelParent(this));
            ////SetEvtHandlerEnabled(true); // ***Не работает
         }
         event.Skip(false);

         break;
   }
}

Posted: Thu Oct 16, 2008 6:00 am
by tan
Я полагаю, что это проблема из той же оперы http://forums.wxwidgets.org/viewtopic.php?t=2344
Скорее всего на уровне wx она не решается, поскольку wxMessageBox использует системный диалог. Возможный вариант - не использовать wxMessageBox для оповещения юзера об ошибке, а сделать собственный диалог для этого, но не уверен, что это будет работать.

Posted: Thu Oct 16, 2008 8:23 am
by bybars
Да. Проблема из той же оперы.
wxMessageBox был не причем. Я пробовал wxMessageDialog.
Причем в обоих случаях в качестве parent window я указывал как NULL, так и окно фрейма.

Я заменил OnKeyUp на OnChar и всё заработало как хотелось.
События остались wxKeyEvent.

Но осталось непонятно, почему?

Если взять описание событий из книги Cross-Platform GUI Programming with ... by Julian Smart.
(http://wxwidgets.info/wxwidgets_book_chapter_3_ru)
глава 3.
Таблицы и обработчики сообщений
...
Обратите внимание, что только командные сообщения (то есть те сообщения, которые явно или неявно наследуются от wxCommandEvent) рекурсивно передаются по цепочке к родительскому окну. Так как это обстоятельство часто вызывает недоумение для пользователей приведем список системных сообщений, которые не передаются родительским обработчикам сообщений: wxActivateEvent, wxCloseEvent, wxEraseEvent, wxFocusEvent, wxKeyEvent, wxIdleEvent, wxInitDialogEvent, wxJoystickEvent, wxMenuEvent, wxMouseEvent, wxMoveEvent, wxPaintEvent, wxQueryLayoutInfoEvent, wxSizeEvent, wxScrollWinEvent и wxSysColourChangedEvent. Эти сообщения не распространяются, так как эти сообщения имеют значение только для данного конкретного окна.