Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача фокуса между формами

17K
25 октября 2006 года
Dionis
23 / / 29.08.2006
В общем, такая проблемка при создании многооконного интерфейса:
Родительское окно. Есть дочернее окно, у которого владельцем (owner) является родительское окно, (аналог диалог "Найти и заменить" в Word)

В родительском окне есть строка меню.

Когда активно дочернее окно, то щелчок на родительском меню приводит ТОЛЬКО к переходу фокуса на родительское окно, а чтобы меню прореагировало, то надо щелкнуть еще раз. А в Worde реакция меню немедленная. Как сделать также?
Пробовал искать в MSDN - ответа конкретно на этот вопрос не нашел.

Мне тут уже советовали:
Для решения проблемы можно использовать события форм Activate и Deactivate для контроля перехода фокуса.
Что то никак не получается...
273
26 октября 2006 года
3A3-968M
1.2K / / 22.12.2005
Когда одно окно теряет фокус, генерится событие Deactivate. Соответственно если произошёл клик на другой форме, то должно сработать событие Click этой формы. В обработчике вызываешь метод Show() для этой формы и тут же её перерисовываешь (можно через Update)
17K
26 октября 2006 года
Dionis
23 / / 29.08.2006
Thank's ! Завтра же попробую
17K
27 октября 2006 года
Dionis
23 / / 29.08.2006
Не работает.
Пробовал следующее:
В дочернем окне в обработчике Deactivate ставил
Owner.Activate()
Owner.Focus()
Owner.Refresh()
Owner.Update()

В родительском окне в обработчике Activate ставил
this.Focus()
this.Refresh()
this.Update()

В родительском окне у полоски меню в обработчике события MenuActivate() тоже перепробовал все, плюс menuStrip1.Select()

Не получается..

Когда активно дочернее окно, щелчок на родительском окне вызывает событие Activate() у родительского окна + событие MenuActivate() у строки меню.
Как же заставить сработать событие Click() ?
273
30 октября 2006 года
3A3-968M
1.2K / / 22.12.2005
Ты идёшь в правильном направлении, но рано сдался. Когда срабатывает событие активации меню, тебе нужно вручную в обработчике этого события раскрыть меню, т.е. симитировать клик на нём. Сначала определяешь, над каким меню находится мышь, потом выполняешь следующий код:
 
Код:
[SIZE=2][COLOR=#0000ff][FONT=Courier New]private [/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]void [/COLOR][/SIZE][SIZE=2]button1_Click([/SIZE][SIZE=2][COLOR=#0000ff]object[/COLOR][/SIZE][SIZE=2] sender, [/SIZE][SIZE=2][COLOR=#008080]EventArgs[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] e)[/FONT]
[FONT=Courier New]{[/FONT]
[FONT=Courier New]  mainMenu.Focus();[/FONT]
[FONT=Courier New]  yourMenuItem.Select();[/FONT]
[FONT=Courier New]  yourMenuItem.ShowDropDown();[/FONT]
[FONT=Courier New]}[/FONT]
[/SIZE]

Сначала выполняется передача фокуса меню (если ты это сделал раньше то опусти эту строку). Далее выделяю необходимое меню функцией Select и вызываю ShowDropDown для раскрытия меню. Можно принудительно вызвать события нажатия клавиши, для этого надо использовать защищённые методы OnClick, OnMouseUp и т.д..
17K
31 октября 2006 года
Dionis
23 / / 29.08.2006
ЗАЗ-968М,
Спасибо за полный ответ и наводку!
Все заработало.
Вот мое решение:
У каждого меню, которое я хочу чтобы срабатывало при передаче фокуса от дочернего к родительскому окну, надо в обработчике события MenuActivate прописать
 
Код:
private void menuStrip1_MenuActivate(object sender, EventArgs e)
        {
            menuStrip1.Focus();
            this.OnClick(e);
        }


P.S. Кстати, если при активном дочернем окне нажать на кнопку закрытия родительского окна, оно закрывается сразу, без всяких там передач фокуса....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог