Как обработать заголовок формы правой кнопкой мыши - PullRequest
1 голос
/ 22 декабря 2009

Я бы хотел, чтобы контекстное меню на панели заголовков щелкнуло правой кнопкой мыши

Любые советы / образцы pref в c #?

ОБНОВЛЕНИЕ - по разным причинам щелчок правой кнопкой мыши по форме не будет работать, потому что форма не пуста, а форма составлена ​​динамически, поэтому ....

Ответы [ 6 ]

9 голосов
/ 22 декабря 2009

Это можно сделать, перехватив уведомление WM_NCRBUTTONDOWN, которое отправляет Windows, когда пользователь щелкает правой кнопкой мыши строку заголовка. Класс управления не имеет события для него, вам нужно переопределить 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);
    }
}
0 голосов
/ 22 декабря 2009

Вы можете переопределить 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 также будет отправлено, если вы также щелкните правой кнопкой мыши границы окна. Вы тоже можете этого не желать.

0 голосов
/ 22 декабря 2009

В основном вам нужно использовать p-invoke для этого. Вот действительно хороший пример на Здесь Из примера видно, что вам нужно вручную имитировать обработчики событий, но это довольно просто.

0 голосов
/ 22 декабря 2009

Уже существует меню, управляемое Windows, когда вы щелкаете правой кнопкой мыши заголовок заголовка.

Хотите заменить его полностью?

Если вы хотите добавить к нему, вам придется использовать Win32 API и взаимодействовать, и вам придется подкласс формы.

См. Функцию AppendMenu ().

0 голосов
/ 22 декабря 2009

если вы обрабатываете форму щелчком мыши, вы можете использовать следующий код:

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

Но вам нужно убедиться, что вы сгенерировали это событие для элемента управления верхнего уровня в форме. Например, если в форме есть групповое поле, оно будет получать события щелчка мышью, а не саму форму, для областей формы, которые находятся под групповым блоком.

0 голосов
/ 22 декабря 2009

MSDN объясняет , как обрабатывать щелчки правой кнопкой мыши на элементах управления Windows Forms. Элементы управления, включая формы, наследуют событие MouseClick.

MouseEventArgs сообщит вам, какая кнопка была нажата с помощью свойства Button . Взгляните на перечисление MouseButtons .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...