Иногда вещи не такие как кажутся, про SetFocus()

April 29th, 2009 Begemot Posted in Oбщее

Как оказывается SetFocus(),  не всегда делает то что можно от него ожидать не читая для докумментацию:) Для wxWindow все ок:

This sets the window to receive keyboard input.

А вот для wxPanel ситуация совсем другая:

Overrides wxWindow::SetFocus. This method uses the (undocumented) mix-in class wxControlContainer which manages the focus and TAB logic for controls which usually have child controls. In practice, if you call this method and the control has at least one child window, the focus will be given to the child window.

А то что надо,  делает  SetFocusIgnoringChildren()

Незнание этого простого файла, украло у меня вчера почти полтора часа, когда я пытался сделать нормальное управление с клавиатуры, в весьма сложной и запутанной системе. Вернеее украло не у меня, а у работадателя, но тоже нехорошо. Так что читайте доки 🙂


Если пост полезен для вас вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.

Related:

4 Responses to “Иногда вещи не такие как кажутся, про SetFocus()”

  1. Ужос. Эти виджеты своим неочевидным поведением иногда просто убивают :). Два дня возился с wxTreeListCtrl чтобы заставить его использовать drag-n-drop. Под виндой заработало почти сразу, под линуксом таскало, но не хотело изменять вид курсора. Еле поборол. А программу все таки доделал…

  2. О, поделись с народом знанием, а то мне тоже это в ближайщем будущем делать предстоит 🙂

  3. Ну, началось с того, что wxTreeListCtrl не менял курсор при начале перетаскивания. Поэтому в обработчике EVT_TREE_BEGIN_DRAG вставил SetCursor( dragCursor ), а в EVT_TREE_END_DRAG добавил SetCursor( wxNullCursor ).
    Под виндой все работало.
    Собрал проект в Ubuntu – фиг вам! курсор не меняется. Путем длительных экспериментов узнал, что SetCursor в EVT_TREE_BEGIN_DRAG почему то не оказывает вообще никакого эффекта. Не менее странно вел себя wxSetCursor – менял курсор не в начале перетаскивания, а в конце! Было такое ощущение, что контрол полностью блокировал очередь событий и освобождал его только после отпускания кнопки мыши.
    Поэтому перед wxSetCursor добавил ReleaseMouse() и все заработало.

  4. Спасибо, буду знать где смотреть если чо:)