MDI дочерняя форма не активируется при нажатии в клиентской области - PullRequest
1 голос
/ 29 июля 2010

Мое приложение VB.NET поддерживает несколько видов дочерних форм MDI. Некоторые виды, но не другие, являются «неприятными» - они заставляют механизм фокусировки становиться странным. После открытия «проблемной» дочерней формы ни одна из дочерних форм MDI не будет активирована, если я не нажму ни на строку заголовка, ни на границу. Нажатие в области клиента не активирует дочернюю форму - ее заголовок остается серым и не получает событий Activate или GotFocus. Странно, однако, что нажатая форма фактически получает Фокус, потому что ее элементы управления получают события мыши и нажатия клавиш. Только Z-порядок и подсветка не меняются.

Как только эта проблема развивается, она сохраняется даже после закрытия «проблемной» формы и влияет на дочерние формы, которые открываются позже. Однако, если ВСЕ дочерние формы закрыты, проблема решается, и новые дочерние формы ведут себя нормально - пока не появится следующая «проблемная» форма.

Я понятия не имею, почему один вид детской формы неприятен, а другие нет.

Любые предложения будут с благодарностью.

1 Ответ

1 голос
/ 14 апреля 2011

Я немного опаздываю, но у меня были те же симптомы, что описаны выше.У меня тоже было несколько форм, которые вызвали эту проблему, и другие, которые не вызывали.

Я нашел ссылку, которая объясняет проблему и применил концепцию к моим формам.

http://www.pcreview.co.uk/forums/mdi-child-forms-functionality-does-not-work-correctly-windows-f-t2894221.html

В основном это связано с тем, чтобы убедиться, что формы MdiParent установлены перед любым кодом, вызывающим создание окна формы (вызов API CreateWindow () или CreateWindoEX.()).Во всяком случае, я обнаружил, что некоторые из моих окон содержат код в Конструкторах, который вызвал создание окна API.Примером этого была форма с элементом управления WebBrowser.Я передал URL в форму в конструкторе, который, в свою очередь, передал его в метод WebBrowser.Navigate.В этом случае мои окна MdiChild не будут активироваться, как ожидалось.Я изменил конструктор так, чтобы он сохранял URL, а также переопределил метод CreateHandle формы, чтобы фактически установить URL в WebBrowser в кратчайшие возможные сроки.Теперь формы активируются, как и ожидалось.

  private string _URL = "";

  public frmReportServer(String URL, String Title) : this() {
     _URL = URL;
     this.Text = Title;
  }

  protected override void CreateHandle() {
     base.CreateHandle();
     if (_URL != "") wbReports.Navigate(URL, false);
  }

Надеюсь, это поможет ...

...