winforms 为什么焦点矩形在按下Tab键后才显示?

4ngedf3f  于 2022-11-17  发布在  其他
关注(0)|答案(5)|浏览(147)

我有一个奇怪的问题(可能只是为了理解)为什么在一个测试应用程序中,直到我按下Tab键才显示焦点矩形。
我想显示一个有两个单选框和两个按钮的对话框。当我显示对话框时,我想在第一个单选按钮周围看到一个焦点矩形。(这样用户就可以看到焦点在哪里。)我对控件进行了排序,并将tabindex属性设置为从0到4,这样它们的顺序就正确了。(单选框1的tabindex为0,...)
当我显示对话框的第一个单选框有焦点,但它周围没有焦点矩形。(直到我按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
x759pob2

x759pob21#

正如我所评论的,这实际上是一个用户首选项设置。
但要显示矩形,请尝试继承您自己的RadioButton并覆盖ShowFocusCues函数:

Public Class RadioWithFocus
  Inherits RadioButton

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

End Class
oxf4rvwz

oxf4rvwz2#

在窗体的初始化方法中或任何适用的地方使用继承的Control.Focus()

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

另一种方法是Form.Activate
此外,ActiveControl可能会有所帮助。

avwztpqn

avwztpqn3#

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

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

lo8azlld4#

马丁·康内尔:你的解决方案对我很有效!谢谢。
在C#中也是如此:

using System.Runtime.InteropServices;
  ...
  [DllImport("USER32")]
  private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wp, int lp);
  private const int WM_CHANGEUISTATE = 0x0127; // from WinUser.h
  private const int UIS_CLEAR = 2;
  private const int UISF_HIDEFOCUS = 0x1;
  private const int UISF_HIDEACCEL = 0x2;

  ...

  SendMessage(Handle, WM_CHANGEUISTATE, UIS_CLEAR | ((UISF_HIDEACCEL | UISF_HIDEFOCUS) << 16), 0);
nzrxty8p

nzrxty8p5#

正如LarsTech所说,这是一个用户设置。对于Windows 7,你可以在这里找到这个设置:打开控制面板/轻松访问中心/使键盘更易于使用。
查找带有文本“给键盘快捷键和访问键加下划线”的复选框并选中它。
重新运行你的应用程序,你会看到焦点问题现在会出现在你的表单第一次加载。
尽情享受

相关问题