2012-02-10 57 views
5

我有一个奇怪的问题(可能只是为了理解)为什么在测试应用程序中,直到我按Tab键才显示焦点矩形。为什么焦点矩形不显示,直到按Tab键?

我想用两个射频盒和两个按钮来显示对话框。当我显示对话框时,我想看看我的第一个单选按钮的重点。 (以便用户可以看到重点在哪里。)我订购了控件并将tabindex属性从0设置为4,以便它们按正确的顺序排列。 (radiobox 1有tabindex 0,...)

当我显示对话框时,第一个radioobox有焦点,但它没有焦点rect在它周围。 (直到我按Tab键。)

我创建了一个完全空的winforms项目(Visual Studio 2010),添加了控件并启动它。所以没有什么特别的。

有人可以给我一个提示,我做错了什么?

对不起,这里是我的示例代码:

Public Class Form1 

Private Sub Button1_Click(sender As System.Object, _ 
    e As System.EventArgs) _ 
    Handles Button1.Click 

    Me.Close() 
End Sub 

Private Sub Button2_Click(sender As System.Object, _ 
    e As System.EventArgs) _ 
    Handles Button2.Click 

    Me.Close() 
End Sub 

Private Sub Form1_Shown(sender As Object, _ 
    e As System.EventArgs) _ 
    Handles Me.Shown 

    RadioButton1.Focus() 
    RadioButton1.Select() 
    SendKeys.SendWait("{TAB}") 
    SendKeys.SendWait("+{TAB}") 

End Sub 

End Class 
+0

恩...我忘了说,说我使用的是Windows 7(64位) – AlexS 2012-02-10 12:14:51

+0

坚韧错误修复,没有我尝试工作。 – 2012-02-10 13:56:22

+0

我做了一些(很多)更多的研究,发现向表单发送一个“Tab”键调用Control.ChangeUICues事件,其中标志UICuesEventArgs.ShowFocus设置为true。 (http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.changeuicues.aspx) 处理完此事件后,焦点矩形可见。有谁知道,我怎么能直接触发/调用这个事件?我没有找到任何属性,我可以将其设置为true ... – AlexS 2012-02-10 14:51:25

回答

5

正如我所评论的,这实际上是一个用户偏好设置。

但是否显示矩形,尝试继承自己的单选按钮并覆盖ShowFocusCues功能:

Public Class RadioWithFocus 
    Inherits RadioButton 

    Protected Overrides ReadOnly Property ShowFocusCues() As Boolean 
    Get 
     Return True 
    End Get 
    End Property 

End Class 
1

在窗体的初始化方法,或(如适用)使用继承Control.Focus()。例如:

public Form1() { 
    //Other stuff here 
    radiobox1.Focus();// If this is the name of your control 
} 

另一种需要看的方法是Form.Activate。这可能更适合在这方面使用

另外,ActiveControl可能会有所帮助。

+0

我知道.Focus方法,并将其作为第一个尝试。你的.Activate方法是个好主意,但也没有办法。 : -/ – AlexS 2012-02-10 11:06:14

+0

看到我的编辑.... – annonymously 2012-02-10 11:33:12

0

正如LarsTech说,这是一个用户设置。对于Windows 7,您可以在此处找到此设置: 打开控制面板/轻松访问中心/使键盘更易于使用。

查找带有文本“下划线键盘快捷键和访问键”的复选框并检查它。

重新运行您的应用程序,您将看到当您的表单第一次加载时,焦点问题将显示出来。

享受

0

对于Win32/C++,发送WM_CHANGEUISTATE消息到父窗口:

// Enable focus rect and accelerator underline in all controls. 
    ::SendMessage(WM_CHANGEUISTATE, MAKELONG(UIS_CLEAR, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0);