Итак, вернемся к началу этой проблемы. Я использую 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 ... Может ли кто-нибудь дать мне небольшое руководство здесь? Я пытаюсь.
См [Документы] (http://msdn.microsoft.com/en-us/library/system.windows.forms.message .getlparam% 28v =% против 100 29.aspx). Параметр 'GetLParam (t)' должен ссылаться на 'struct'. –
На самом деле это не указатель, это целое число, содержащее координаты x и y. http://msdn.microsoft.com/en-us/library/windows/desktop/ms645606%28v=vs.85%29.aspx. –
Вы просто хотите удалить поведение по умолчанию (дважды щелкните по причинам, чтобы выделить текст)? – terrybozzio