显示并关注菜单

时间:2013-02-14 15:39:36

标签: .net winforms c#-4.0 contextmenustrip

我在表单上有button,我想使用 Alt + M 来显示ContextMenuStrip (cmsJournal) ),不幸的是,当我使用 快捷方式 时,该按钮得到了集中,但没有触发KeyPress event

当我按 Alt + M

时,我想使用以下方法
    private void PopJournalMenu() {
        cmsJournal.Show(btnJournal, new System.Drawing.Point(0, 0 - cmsJournal.Height));
        tsmiAPPayment.Select();
    }

1 个答案:

答案 0 :(得分:1)

首先要做的事情 - 我不建议使用 Alt 创建快捷方式。在Windows应用程序中, Alt 键是为键盘加速器保留的。它们是您在控件标题中看到某些字母下划线的原因。例如,如果您使用标题为“& Journal”的Button控件,它将显示为日记,您可以按 Alt + J 来“点击” “键盘上的那个按钮没有触摸鼠标,这对于可访问性原因非常重要。

如果您希望与此行为保持一致,并且您的按钮更像是一个下拉按钮(即,在用鼠标单击时显示菜单的按钮),那么您的任务非常简单。如上所示标记按钮(使用字符串中的&字符表示所需的加速器,在您的情况下为M),然后连接代码以显示下拉菜单正如您在Click事件处理程序中通常所做的那样。

如果您想让您的应用程序混乱且难以使用,并且您没有下拉按钮,那么您将需要手动拦截键盘事件并欺骗窗口管理器。不言而喻,这将更加困难。

您需要克服的主要问题是重点。只有聚焦控件才能接收键盘事件,并且一次只能聚焦一个控件。因此,如果您的表单除了按钮之外还包含多个控件(例如文本框),那么任何其他控件都可能具有焦点而不是按钮。这意味着他们将收到键盘事件,并可能以他们自己的方式对他们做出反应。这就是KeyPress事件没有按照您的意愿执行的原因(KeyDownKeyUp事件会出现同样的问题)。这些事件与特定控件相关联,只有当它们所连接的控件聚焦时才会触发。

如果要转义此操作,则需要处理“更高”级别的键盘事件。在WinForms中执行此操作的标准方法是在表单级别通过覆盖ProcessCmdKey method。在重写的方法中,您将测试所需的键盘组合,并在适当的情况下显示弹出菜单。例如:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
   if (keyData == (Keys.Alt | Keys.M))
   {
      cmsJournal.Show(btnJournal, new Point(0, 0 - cmsJournal.Height));
      return true; // indicate that you handled the key event
   }
   return base.ProcessCmdKey(ref msg, keyData);
}

或者,您可以调用PopJournalMenu方法。我不确定tsmiAPPayment是什么或者为什么需要调用它的Select方法。在your previous question中,我得到了您尝试使用Select以确保上下文菜单重点突出的印象。你不需要这样做; Show方法已经为您处理了这个问题。

相关问题