[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]
Передача фокуса между формами
Родительское окно. Есть дочернее окно, у которого владельцем (owner) является родительское окно, (аналог диалог "Найти и заменить" в Word)
В родительском окне есть строка меню.
Когда активно дочернее окно, то щелчок на родительском меню приводит ТОЛЬКО к переходу фокуса на родительское окно, а чтобы меню прореагировало, то надо щелкнуть еще раз. А в Worde реакция меню немедленная. Как сделать также?
Пробовал искать в MSDN - ответа конкретно на этот вопрос не нашел.
Мне тут уже советовали:
Для решения проблемы можно использовать события форм Activate и Deactivate для контроля перехода фокуса.
Что то никак не получается...
Когда одно окно теряет фокус, генерится событие Deactivate. Соответственно если произошёл клик на другой форме, то должно сработать событие Click этой формы. В обработчике вызываешь метод Show() для этой формы и тут же её перерисовываешь (можно через Update)
Thank's ! Завтра же попробую
Пробовал следующее:
В дочернем окне в обработчике Deactivate ставил
Owner.Activate()
Owner.Focus()
Owner.Refresh()
Owner.Update()
В родительском окне в обработчике Activate ставил
this.Focus()
this.Refresh()
this.Update()
В родительском окне у полоски меню в обработчике события MenuActivate() тоже перепробовал все, плюс menuStrip1.Select()
Не получается..
Когда активно дочернее окно, щелчок на родительском окне вызывает событие Activate() у родительского окна + событие MenuActivate() у строки меню.
Как же заставить сработать событие Click() ?
Код:
Сначала выполняется передача фокуса меню (если ты это сделал раньше то опусти эту строку). Далее выделяю необходимое меню функцией Select и вызываю ShowDropDown для раскрытия меню. Можно принудительно вызвать события нажатия клавиши, для этого надо использовать защищённые методы OnClick, OnMouseUp и т.д..
Спасибо за полный ответ и наводку!
Все заработало.
Вот мое решение:
У каждого меню, которое я хочу чтобы срабатывало при передаче фокуса от дочернего к родительскому окну, надо в обработчике события MenuActivate прописать
Код:
private void menuStrip1_MenuActivate(object sender, EventArgs e)
{
menuStrip1.Focus();
this.OnClick(e);
}
{
menuStrip1.Focus();
this.OnClick(e);
}
P.S. Кстати, если при активном дочернем окне нажать на кнопку закрытия родительского окна, оно закрывается сразу, без всяких там передач фокуса....