Windows Forms: невозможно щелкнуть, чтобы сфокусировать MaskedTextBox в форме не верхнего уровня - PullRequest
2 голосов
/ 20 мая 2010

Как видно из заголовка, у меня отображается дочерняя форма со свойством TopLevel, установленным в False, и я не могу щелкнуть элемент управления MaskedTextBox, который в нем содержится (чтобы привлечь к нему внимание). Я могу сосредоточиться на этом, используя TAB на клавиатуре.

Дочерняя форма содержит другие обычные элементы управления TextBox, и я могу щелкнуть их, чтобы сфокусироваться без проблем, хотя они также демонстрируют некоторое странное поведение: например, если у меня есть значение в текстовом поле, и я пытаюсь щелкнуть с конец строки к началу ничего не происходит. На самом деле я вообще не могу использовать мышь для перемещения курсора внутри текста TextBox (хотя они работают с клавишами со стрелками на клавиатуре).

Меня не слишком беспокоит странное поведение TextBox, но почему я не могу активировать свой MaskedTextBox, нажав на него?

Ниже приведен код, который показывает форму:

Dim newReportForm As New Form
Dim formName As String
Dim FullTypeName As String
Dim FormInstanceType As Type

formName = TreeView1.SelectedNode.Name

FullTypeName = Application.ProductName & "." & formName

FormInstanceType = Type.GetType(FullTypeName, True, True)

newReportForm = CType(Activator.CreateInstance(FormInstanceType), Form)
Try
   newReportForm.Top = CType(SplitContainer1.Panel2.Controls(0), Form).Top + 25
   newReportForm.Left = CType(SplitContainer1.Panel2.Controls(0), Form).Left + 25
Catch
End Try
newReportForm.TopLevel = False
newReportForm.Parent = SplitContainer1.Panel2
newReportForm.BringToFront()                
newReportForm.Show()

Ответы [ 3 ]

6 голосов
/ 19 июня 2010

Я попробовал ваш код и на этот раз получил хорошее повторение. Как я уже упоминал в своем первоначальном посте, это действительно проблема активации окна. Вы можете увидеть это в Spy ++, обратите внимание на сообщения WM_MOUSEACTIVATE.

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

Вам придется удалить строку заголовка с формы. Это лучше всего сделать, добавив эту строку в ваш код:

    newReportForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None

Что превратит форму в элемент управления, который в противном случае неотличим от UserControl. Вы все еще можете сделать его отличительным, используя этот код:

    newReportForm.ControlBox = False
    newReportForm.Text = ""

Любое исправление решает проблему щелчка мыши.

2 голосов
/ 23 июня 2010

Это жалкая ошибка, и мне понадобилось много времени, чтобы найти этот вопрос.Мы делаем то же самое, что и OP, отображая форму внутри разделенного контейнера.Мой обходной путь - добавить обработчик события в событие Click MaskedTextBox:

    private void MaskedTextBoxSetFocus(object sender, EventArgs e)
    {
        var mtb = (MaskedTextBox)sender;
        mtb.Focus();
    }

Это работает для MaskedTextBox, но меня беспокоит другое странное поведение из-за этой ошибки, поэтому я, вероятно, установлю стиль границы какв принятом ответе.

1 голос
/ 20 мая 2010

Поведение текстового поля является признаком той же проблемы. Что-то проглатывает уведомления мыши. Это не объясняется вашим фрагментом кода. Формы действительно поглощают щелчок мыши, который их активирует, но это одноразовое поведение, которое отключается, если для свойства TopLevel установлено значение False.

Не так много осталось. Одним из кандидатов является свойство Control.Capture, включаемое в событии MouseDown для кнопки, чтобы кнопка могла видеть событие MouseUp независимо от того, куда была перемещена мышь. Это также разовый эффект. Не упустите элементы управления, которые устанавливают Фокус в событии MouseDown.

Другой - это какой-то код IMessageFilter в ваших формах, который ест сообщения WM_LBUTTONDOWN.

...