【问题标题】:How to handle Form caption right click如何处理表单标题右键单击
【发布时间】:2009-12-22 17:42:16
【问题描述】:

我想要右键单击标题栏上的上下文菜单

c# 中的任何提示/示例首选项?

更新 - 由于各种原因,右键单击表单将不起作用,因为表单不是空的并且表单是动态合成的,所以......

【问题讨论】:

  • 右击表格或表格标题??
  • 点击标题时没有鼠标点击,据我所知,你必须连接到 win32 来处理我多年来没有做过的非客户区事件......

标签: c# windows winforms winapi


【解决方案1】:

您可以通过捕获当用户右键单击标题栏时 Windows 发送的 WM_NCRBUTTONDOWN 通知来做到这一点。控件类没有事件,您需要重写 WndProc()。这是一个示例表单,您需要添加一个 ContextMenuStrip:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    protected void OnTitlebarClick(Point pos) {
        contextMenuStrip1.Show(pos);
    }

    protected override void WndProc(ref Message m) {
        const int WM_NCRBUTTONDOWN = 0xa4;
        if (m.Msg == WM_NCRBUTTONDOWN) { 
            var pos = new Point(m.LParam.ToInt32());
            OnTitlebarClick(pos);
            return;
        }                                           
        base.WndProc(ref m);
    }
}

【讨论】:

    【解决方案2】:

    MSDN explains 如何处理 Windows 窗体控件上的右键单击。控件(包括窗体)继承 MouseClick 事件。

    MouseEventArgs 将通过Button 属性告诉您单击了哪个按钮。看看MouseButtons 枚举。

    【讨论】:

    • 我明白了。不幸的是,没有 MousePreview,就像 KeyPreview 一样,所以我不确定如何解决这个问题。
    【解决方案3】:

    如果您处理表单鼠标单击,则可以使用以下代码:

      private void Dialog_MouseClick(object sender, MouseEventArgs e)
      {
          if (e.Button == MouseButtons.Right)
          {                                
              this.Text = "new caption text";
          }
      }  
    

    但您必须确保为窗体上的顶级控件生成此事件。例如,如果您在表单上有一个组合框,它将接收鼠标单击事件,而不是表单本身,用于组合框下方的表单区域。

    【讨论】:

      【解决方案4】:

      当您右键单击标题栏时,已经有一个由 Windows 管理的菜单。

      要完全替换吗?

      如果你想添加它,你将不得不使用 Win32 API 和互操作,你将不得不子类化表单。

      参见 AppendMenu() 函数。

      【讨论】:

        【解决方案5】:

        基本上您需要使用 p-invoke 来执行此操作。 Here 有一个很好的例子 从示例中可以看出,您需要手动模拟事件处理程序,但这非常简单。

        【讨论】:

          【解决方案6】:

          您可以覆盖表单的 WndProc 并捕获 WM_NCRBUTTONDOWN 消息:

             protected override void WndProc(ref Message m)
             {
                 const int WM_NCRBUTTONDOWN = 0xA4;
          
                 if (m.Msg == WM_NCRBUTTONDOWN)
                 {
                     MessageBox.Show("Caption right clicked!");
                 }
                 else
                 {
                     base.WndProc(ref m);
                 }
             }
          

          但是,此代码将抑制窗口的上下文菜单。你可能不希望这样。如果您也右键单击窗口边框,也会发送 WM_NCRBUTTONDOWN 消息。你可能也不希望这样。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多