2014-12-11 3 views
-1

У меня есть пользовательский элемент управления, который наследуется от базового пользовательского класса управления. В пользовательском элементе управления, который наследует это, я помещаю ряд текстовых полей. Во время выполнения я должен знать, когда каждый элемент управления получает фокус и теряет фокус. Для этого я перепробовал WndProc в базовом классе и пытаюсь захватить там сообщения. Проблема, с которой я сталкиваюсь, заключается в том, что я никогда не получаю WM_SETFOCUS или WM_KILLFOCUS в цикле сообщений.Trapping WM_SETFOCUS в WindProc VB.NET

Это WndProc:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
    Select Case m.Msg 
    Case WM_SETFOCUS 
     Debug.WriteLine(m.ToString()) 
    Case WM_KILLFOCUS 
     Debug.WriteLine(m.ToString()) 
    Case Else 
     Debug.Print("OTHER: " + m.ToString()) 
    End Select 

    MyBase.WndProc(m) 
End Sub 

Я получаю целую кучу сообщений для получения текста и некоторые другие вещи, так что я знаю, что я получаю там. Он просто никогда не останавливается на WM_SETFOCUS или WM_KILLFOCUS.

Что я делаю неправильно.

+0

как использует стандартный Enter и Leave события не хватает? – Plutonix

+0

Я пытаюсь найти общий способ сделать это. У меня есть много элементов управления текстовыми полями на одном из этих элементов управления пользователя. Мне нужно сосредоточиться на каждом из текстовых полей. –

+0

Я полагаю, что я мог бы добавить некоторый контроль над загрузкой моего базового класса и добавить обработчики событий для каждого из текстовых полей. Это даст мне необходимую мне функциональность. –

ответ

0

Быстрый пример разводке все TextBoxes в UserControl:

Public Class UserControl1 

    Private Sub UserControl1_Load(sender As Object, e As EventArgs) Handles Me.Load 
     WireTBs(Me) 
    End Sub 

    Private Sub WireTBs(ByVal cont As Control) 
     For Each ctl As Control In cont.Controls 
      If TypeOf ctl Is TextBox Then 
       Dim TB As TextBox = DirectCast(ctl, TextBox) 
       AddHandler TB.GotFocus, AddressOf TB_GotFocus 
       AddHandler TB.LostFocus, AddressOf TB_LostFocus 
      ElseIf ctl.HasChildren Then 
       WireTBs(ctl) 
      End If 
     Next 
    End Sub 

    Private Sub TB_GotFocus(sender As Object, e As EventArgs) 
     Dim TB As TextBox = DirectCast(sender, TextBox) 
     ' ... do something with "TB" ... 
     Debug.Print("GotFocus: " & TB.Name) 
    End Sub 

    Private Sub TB_LostFocus(sender As Object, e As EventArgs) 
     Dim TB As TextBox = DirectCast(sender, TextBox) 
     ' ... do something with "TB" ... 
     Debug.Print("LostFocus: " & TB.Name) 
    End Sub 

End Class 
Смежные вопросы