SendKey "{Tab}" 会使焦点在窗口中所有控件中转移焦点,如何能让焦点仅在一组控件中转移焦点呢?就像CommandButton或OptionButton一样,如果把这些控件用容器(如PictureBox、Frame)分组,当按下方向键时焦点只在同组的控件内转移。这是如何实现的呢?如能解决,此贴可加到200分,决不食言!
解决方案 »
- 如何打包soap
- VBS提示找不到指定的文件
- 请问可以录制一个将WORD文档转化成rtf格式的宏么,如果可以,怎么录制,谢谢啊
- 请教两个问题?
- SOS!!!如何打印picturebox里的chart图像控件和其它控件(button,label之类)!
- 请问do events是什么技术,怎样使用
- 【CSDN FAQ查询】:http://CoolSlob.fykj.com/
- 100分,只要能解决一定给分,再现等待
- 散分,,大家过年好...........................................
- 关于串行通讯的问题!紧急求救!
- 控件数组,如何判断是否存在某控件?
- 0x004581f1 錯誤指令[無法顯示設計窗體,但是可以顯示代碼窗體]
SendKeys "{tab}"
End SubPrivate Sub Form_Load()
Dim ctl As Control
For Each ctl In Me.Controls
If Not TypeOf ctl Is TextBox Then ctl.TabStop = 0
Next
End Sub
caozhy(cfx) 的办法更是不行,因为我可能并不知道同一个容器内到底有多少控件。或者它们的名字是什么,所以无法使用这个方法。可能是我没说清楚,再具体点:我要做一个自定义控件,要按方向键时转移焦点,但并不是发送{Tab}键,因为它会使焦点在窗体中所有控件间转移。而非在同一容器中的控件中转移焦点。我要达到的是象命令按钮或选项按钮那样,按方向键时只在同一容器中的控件中转移焦点。此贴由原来的50分加到200分,希望我的诚意能打动各路高手来帮我!
当按下方向键时,下一个控件是哪个你应该知道吧,
判断这个控件的TabIndex值超没超过你的设置,
超过了让焦点回到分组的第一个上去因为SendKey "{Tab}"这句是按照控件的TabIndex值,
顺序转移焦点的
此对于控件数组我没有试过。对于非数组检验通过。
Private Sub Form_Load()
Dim ComButton As Control
For Each ComButton In Controls
If TypeOf ComButton Is CommandButton Then
str = ComButton.Container
If InStr(1, str, Frame1.Name) = 0 Then ComButton.TabStop = False
End If
Next
End Sub
其他的控件类似,你自己推敲吧
如果大家对我的问题还不太清楚,那么请建一窗体,在窗体上放一个Picturebox或frame,在这个容器里放两个按钮、两个option、两个checkbox,再在窗体上放两个按钮、两个option、两个checkbox,这时请按方向键,可以看到与按Tab是不同的,它不会在所有控件中转移焦点。但却可以在同一容器内的所有控件中转移焦点。
我就是想知道,当控件接收到方向键时,是不是向容器发送什么消息才由容器处理的?还是控件自己处理的?或者是系统处理的呢?我的控件想要实现此功能该怎么做呢?
知道这里有好多高手、更多很多MVP,敬请赐教!
SendKey "{Right}"
或
SendKey "{Down}"
SendKeys "{tab}"
End SubPrivate Sub Form_Load()
Dim ctl As Control
For Each ctl In Controls
If Not TypeOf ctl Is Frame Then
If Not ctl.Container.Name = "Frame1" Then
ctl.TabStop = False
Else
ctl.TabStop = True
End If
End If
Next
End Sub
SendKeys "{tab}"
End SubPrivate Sub Form_Load()
Dim ctl As Control
For Each ctl In Controls
If Not TypeOf ctl Is Frame Then
If Not ctl.Container.Name = Text1.Container.Name Then
ctl.TabStop = False
Else
ctl.TabStop = True
End If
End If
Next
End Sub
我们知道窗口根据创建的先后都会有自己特有的ZOrder位置,因此按下箭头键沿着在Z轴前后搜寻窗体大概就是你这个问题的解决方法了。这里的一个代码片段,完整的示例代码可以从
http://60.191.21.235/supergreenbean/walk2next.rar
下载Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function SetWindowFocus Lib "user32" Alias "SetFocus" (ByVal hWnd As Long) As LongPrivate Const GW_HWNDFIRST = 0
Private Const GW_HWNDLAST = 1
Private Const GW_HWNDNEXT = 2
Private Const GW_HWNDPREV = 3Public Sub Walk2Next(ByVal hWndMe As Long, ByVal KeyCode As Integer)
Dim hWndFirst As Long, hWndLast As Long, hWndPrev As Long, hWndNext As Long
Dim hWndTarget As Long
'获得最顶层窗口句柄
hWndFirst = GetWindow(hWndMe, GW_HWNDFIRST)
'获得最底层窗口句柄
hWndLast = GetWindow(hWndMe, GW_HWNDLAST)
'获得前1个窗口句柄
hWndPrev = GetWindow(hWndMe, GW_HWNDPREV)
'获得后1个窗口句柄
hWndNext = GetWindow(hWndMe, GW_HWNDNEXT)
Select Case KeyCode
'按了向上或向左的箭头键
Case vbKeyUp, vbKeyLeft
hWndTarget = IIf(hWndNext, hWndNext, hWndFirst)
'按了向下或向右的箭头键
Case vbKeyDown, vbKeyRight
hWndTarget = IIf(hWndPrev, hWndPrev, hWndLast)
End Select
'将下个应该获得焦点的窗口设置焦点
SetWindowFocus hWndTarget
End Sub知道了原理后,就可以为任意的控件(包括自定义控件和TextBox、ComboBox这些原先不支持此功能的控件)添加这个功能了
Command1.TabStop = False
那么Command1将不具有焦点(按下TAB不会落到此处)。如果你要在一组控件中转移焦点,只要将其它控件的.TabStop设置为False即可。.TabIndex是顺序号,你可以分成若干组,比如0~3一组,4~7一组。
当.TabIndex在0~3时,用代码将.TabIndex在4~7的.TabStop设置为False,再sendkeys"{TAB}"
SendKeys "{tab}"
End Sub我修改一下Private Sub Form_Load()
Dim ctl As Control
For Each ctl In Me.Controls
If Not TypeOf ctl.parent.name Is TextBox Then ctl.TabStop = 0
Next
End Sub
to: songyaowu,您说的有道理,我试了,的确,看来绿豆的代码也不能解决问题。我最近发现随想命令按钮可以完全实现我的问题,但不知他的作者是不是从不来CSDN、或者说他没看到这个贴子。难道他是个技术保守的人?不愿告诉我?!但好象他不是这种人啊,各位兄弟姐妹们,以位高手,快来帮我吧,要不然又要看老板脸色了。
再次感谢各位帮助我的朋友:
超级绿豆,尽管你的代码没有帮助我解决问题,但也非常感谢你。
songyaowu,尽管你没有给出任何代码,但我看得出您是非常明确我的意图的,而且你的帮助使我避免使用了错误的代码,我将特别感谢您。
其他兄弟分低些,也就略表心意吧。