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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
bybars
In need of some credit
In need of some credit
Posts: 3
Joined: Tue Sep 16, 2008 11:00 am

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

Post by bybars » Wed Oct 15, 2008 3:11 pm

Ситуация такая: лист-контрол хочет обрабатывать выбор элемента по клавише 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;
   }
}

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan » Thu Oct 16, 2008 6:00 am

Я полагаю, что это проблема из той же оперы http://forums.wxwidgets.org/viewtopic.php?t=2344
Скорее всего на уровне wx она не решается, поскольку wxMessageBox использует системный диалог. Возможный вариант - не использовать wxMessageBox для оповещения юзера об ошибке, а сделать собственный диалог для этого, но не уверен, что это будет работать.
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

bybars
In need of some credit
In need of some credit
Posts: 3
Joined: Tue Sep 16, 2008 11:00 am

Post by bybars » Thu Oct 16, 2008 8:23 am

Да. Проблема из той же оперы.
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. Эти сообщения не распространяются, так как эти сообщения имеют значение только для данного конкретного окна.

Post Reply