winforms 如何为没有文字的Windows Form按钮设定键盘快捷键字符?

w6mmgewl  于 2022-11-16  发布在  Windows
关注(0)|答案(3)|浏览(149)

如何为没有文字的Windows Form按钮设定键盘快捷键字符?
我有一个Windows窗体应用程序,其中一些按钮带有图像但没有文本。通常,对于按钮,快捷方式是用“与”符号(&)指定的。但是,如果没有文本,该怎么办?
我知道有一些小技巧,比如用前导空格将文本向右或向下移动,或者玩弄字体、前景色等,但我不喜欢这些小技巧,因为它们有时会适得其反。
我是否应该考虑通过窗体的Key事件处理所有控件的快捷方式?这将如何区分哪个控件被选中?窗体的Key事件在发送到控件的Key事件之前是否通过窗体进行筛选?如果这样做,我不确定该怎么办。

jslywgbw

jslywgbw1#

  • 是否 应 考虑 通过 窗体 的 Key 事件 处理 所有 控件 的 快捷 方式 ? *

当然 可以 , 在 窗体 中 覆盖 ProcessCmdKey() 。 正如 您 在 文档 中 所 读 到 的 , 它 是 为此 而 设计 的 ( * 提供 对 主 菜单 命令 键 和 MDI 加速 键 的 额外 处理 * )
若 要 将 Button 与 Key 的 比特 组合 ( Windows Form Keys 枚举 值 是 以 [Flags] 属性 装饰 ) 产生 相关 , 您 可以 使用 * map * , 通常 是 将 Key 与 其他 项目 产生 相关 的 Dictionary 。
在 这种 情况 下 , 它 可以 是 Button 控件 或 Action 。 例如 :

private Dictionary<Keys, Button> accelerators = null;   

protected override void OnLoad(EventArgs e) {
    accelerators = new Dictionary<Keys, Button>() {
        [Keys.Alt | Keys.A] = someButton,
        [Keys.Alt | Keys.Control | Keys.B] = otherButton
    };
    base.OnLoad(e);
}

中 的 每 一 个
ProcessCmdKey 覆 写 中 , 测试 map ( Dictionary ) 是否 包含 按 下 的 按钮 组合 , 如果 相符 , 则 引发 相关 Button 的 Click 事件 :

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (accelerators.ContainsKey(keyData)) {
        accelerators[keyData].PerformClick();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

格式
VB.Net 版本 ( 因为 它 已 标记 ) :

Private accelerators As Dictionary(Of Keys, Button) = Nothing

Protected Overrides Sub OnLoad(e As EventArgs)
    accelerators = New Dictionary(Of Keys, Button)() From {
        {Keys.Alt Or Keys.A, someButton},
        {Keys.Alt Or Keys.Control Or Keys.B, otherButton}
    }
    MyBase.OnLoad(e)
End Sub

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
    If accelerators.ContainsKey(keyData) Then
        accelerators(keyData).PerformClick()
        Return True
    End If

    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

格式

ugmeyewa

ugmeyewa2#

我就是这么做的。
将表单的KeyPreview设置为true以捕获密钥。
然后检查表单上KeyDown事件上的键并触发button1.PerformClick();

public Form1()
    {
        InitializeComponent();
        KeyPreview = true;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("you pressed Ctrl + S");
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.S)
        {
            button1.PerformClick();
        }
    }
f2uvfpb9

f2uvfpb93#

希望这能对你有所帮助。
1.将Form KeyPreview属性设置为true。
1.订阅窗体的KeyDown事件,如下所示:
=新建系统.窗体.键事件处理程序(this.Form1_KeyDown);
1.处理Form的KeyDown事件,如下所示:

private void Form1_KeyDown(object sender, KeyEventArgs e)
 {
     if (e.Control  && e.KeyCode == Keys.S)
         MessageBox.Show("Ctrl + S pressed!");
 }

完整代码:

this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
     if (e.Control  &&  e.KeyCode == Keys.S)
       MessageBox.Show("Ctrl + S pressed!");
}

相关问题