2013-10-03 5 views
1

Итак, вернемся к началу этой проблемы. Я использую System.Windows.Forms для создания текстового редактора. Элемент управления текстовым полем по умолчанию принимает событие, когда его содержащий текст дважды щелкнул и выделяет всю строку текста. Я хотел переопределить это поведение чем-то другим. Оказывается, для этого требуется перехват сообщения Windows, которое запускает это событие и предотвращает его запуск. Вот ссылка, которую я нашел в Stackoverflow, которая объясняет почти дословно то, что я делаю: Is it possible to disable textbox from selecting part of text through double-clickПерехват сообщений и выигрышей Windows

Но это объяснение неполно! Обратите внимание, что DoubleClickEvent наследует от EventArgs. Он должен наследоваться от MouseEventArgs. Это связано с тем, что PreviewDoubleClick будет нуждаться в информации из окна сообщения о том, где был нажат экран. Итак, это задача, которую я поставил перед собой: переопределить событие doubleclick, но все же отправить все данные щелчка из окна.

Если я установил контрольные точки в коде, я начну видеть, где хранится моя информация. Сообщение m содержит пару свойств, один из которых называется LParam. Насколько я понимаю, это указатель на информацию о клике, которую я хочу получить. Но это не C++ ... Я не могу просто разыменовать указатель. .NET удобно предоставляет метод Message.GetLParam, чтобы помочь мне. У меня возникли проблемы с тем, чтобы этот метод работал.

Вот мой код:

public class DoubleClickEventArgs : MouseEventArgs 
{ 
    public DoubleClickEventArgs(MouseButtons Button, int clicks, int x, int y, int delta) : base (Button, clicks, x, y, delta) { } 


    public bool Handled 
    { 
     get; 
     set; 
    } 
} 

public class NewTextBox : System.Windows.Forms.TextBox 
{ 
    public event EventHandler<DoubleClickEventArgs> NewDoubleClick; 
    private const int WM_DBLCLICK = 0xA3; 
    private const int WM_LBUTTONDBLCLK = 0x203; 

    protected override void WndProc(ref Message m) 
    { 
     if ((m.Msg == WM_DBLCLICK) || (m.Msg == WM_LBUTTONDBLCLK)) 
     { 
      DoubleClickEventArgs e = (DoubleClickEventArgs) m.GetLParam(typeof(MouseEventArgs)); 

      if (NewDoubleClick != null) 
      { 
       NewDoubleClick(this, e); 
      } 

      if (e.Handled) 
      { 
       return; 
      } 
     } 

     base.WndProc(ref m); 
    } 
} 

Как вы можете видеть, выглядит как образец. Сумасшедшее литье, которое я сделал, чтобы заставить его скомпилировать в этой строке DoubleClickEventArgs e = (DoubleClickEventArgs) m.GetLParam (typeof (MouseEventArgs)); очевидно, вызывает крах. Мы получаем ошибку: для этого объекта не задан конструктор без параметров.

Это имеет смысл. Для DoubleClickEventArgs требуются параметры, которые необходимо создать. Но параметры определяются указателем lParam ... Может ли кто-нибудь дать мне небольшое руководство здесь? Я пытаюсь.

+0

См [Документы] (http://msdn.microsoft.com/en-us/library/system.windows.forms.message .getlparam% 28v =% против 100 29.aspx). Параметр 'GetLParam (t)' должен ссылаться на 'struct'. –

+0

На самом деле это не указатель, это целое число, содержащее координаты x и y. http://msdn.microsoft.com/en-us/library/windows/desktop/ms645606%28v=vs.85%29.aspx. –

+0

Вы просто хотите удалить поведение по умолчанию (дважды щелкните по причинам, чтобы выделить текст)? – terrybozzio

ответ

1

Для удаления выделения текста поведения и предоставить собственный:

private const int WM_DBLCLICK = 0xA3; 
private const int WM_LBUTTONDBLCLK = 0x203; 

protected override void WndProc(ref Message m) 
{ 
    if ((m.Msg == WM_DBLCLICK) || (m.Msg == WM_LBUTTONDBLCLK)) 
    { 
     //your behavior here like for example 
     //this.ForeColor = Color.Red; 
     return; 
    } 
    base.WndProc(ref m); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^