发布时间:2013-03-21
我正在制作的一个系统,一个界面上有多个TEXT,而且要在界面上画一个键盘。在不使用鼠标直接点击TEXT设置焦点的情况下,使用键盘上的按钮,如何能在TEXT之间移动焦点?我是说不模拟TAB和BACKSPACE的情况下? 推荐解决方案放一个Text1控件数组 Private Sub Command1_Click() Static aa As Long Text1(aa Mod Text1.Count).SetFocus aa = aa + 1 End Sub 其他解决方案放一个Text1控件数组 Static aa As Long Private Sub CommandLeft_Click() Text1(aa Mod Text1.Count).SetFocus aa = aa - 1 End Sub Private Sub CommandRight_Click() Text1(aa Mod Text1.Count).SetFocus aa = aa + 1 End Sub 先在需要控制的TEXT的tag属性 写上 方位,格式是: x,y x为横的方位,y为竖的方位 譬如 第一个TextBox 的tag为1,1 他右边的为 2,1 他下面的就为 1,2 Option Explicit Private m_col As New Collection Private Const MAX_X As Integer = 3 '横最多3个 这里我测试 横竖都是3个 Private Const MAX_Y As Integer = 3 '竖最多3个 Private m_strCurFocus As String Private Sub cmdDown_Click() '向下 Call GoPos("DOWN") End Sub Private Sub cmdUP_Click() '向上 Call GoPos("UP") End Sub Private Sub cmdLeft_Click() '向左 Call GoPos("Left") End Sub Private Sub cmdRight_Click() '向右 Call GoPos("Right") End Sub Function GoPos(strDirect As String) Dim strTag As String, strPos() As String, x As Integer, y As Integer If m_strCurFocus = "" Then Exit Function strPos = Split(m_strCurFocus, ",") x = CInt(Trim(strPos(0))) y = CInt(Trim(strPos(1))) Select Case UCase(strDirect) Case "LEFT" If (x - 1) < 1 Then '如果是最左边一个的话 '回到最上一行最后一个 '注意下面RIGHT DOWN UP也要这样处理,由于是例子 没做处理了 x = MAX_X If y - 1 > 0 Then y = y - 1 End If Else x = x - 1 End If Case "RIGHT" x = x + 1 Case "DOWN" y = y + 1 Case "UP" y = y - 1 End Select Dim obj As Control On Error Resume Next Set obj = m_col.Item(x & "," & y) '这里要处理一下 是不是没有这个项目 On Error GoTo 0 If Not (obj Is Nothing) Then obj.SetFocus End If End Function Private Sub Form_Load() Dim obj As Control For Each obj In Controls If TypeName(obj) = "TextBox" Then If obj.Tag <> "" Then Debug.Print obj.Tag m_col.Add obj, obj.Tag '把所有的TextBox添加到集合里 End If End If Next End Sub '使用Timer来纪录 当前的焦点, 因为按了控制方向的按钮后 焦点会是那个按钮 而不是刚才的Text Private Sub Timer1_Timer() If Me.ActiveControl.Tag <> "" Then m_strCurFocus = Me.ActiveControl.Tag End If End Sub 其他建议Text1.SetFocus 另外发送键盘消息 使用SendKeys 为什么一定不模拟呢实在不模拟的话你也可以SetFocus设置焦点呀 Private Sub Command1_Click() Text2.SetFocus End Sub 同意楼上 同意楼上楼上的 在界面上画的键盘有上下左右键,需要在按这些键的时候,在TEXT控件间移动焦点。这个是真正的需求,在向前移动的时候,如果使用BACK,会删除已经输入的内容。 这个问题很有意思。可惜我只会用键盘的方向键控制界面上的textbox的顺序。 |
|