その場でテキストエディターを立ち上げて、文字列を編集するときなど、部品全てについてイベント処理しなければなりません。
テキストエディターで編集して、コンポーネントからフォーカスが外れたとき、イベントを管理する必要があります。
これが意外な難関で、WinProcをオーバーライドしても、このメソッドではイベントが処理されません。個々のコンポーネントで処理しなければなりません。
そこで用意されているのが、ApplicationクラスにあるAddMessageFilter()メソッドです。
Application.AddMessageFilter(new MyMessageFilter())
このような形で、MessageFilter派生クラスを指定してやります。
イベント処理は、MessageFilterクラスのPreFilterMessage()メソッドで行います。
ここで、WM_NCLBUTTONDBLCLK 、WM_NCLBUTTONDOWN はタイトルバーでのイベントで、WM_LBUTTONDOWNはクライアントエリアで発生するイベントを指します。
こんな感じです。
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_NCLBUTTONDBLCLK = 0x00A3;
private const int WM_NCLBUTTONDOWN = 0x00A1;
public bool PreFilterMessage(ref Message msg)
{
switch (msg.Msg)
{
case WM_NCLBUTTONDBLCLK:
case WM_NCLBUTTONDOWN:
case WM_LBUTTONDOWN:
{
int lparam = (int)msg.LParam;
int x = lparam & 0xffff;
int y = lparam >> 16;
Simulator simulator = (Simulator)sender;
Point pos = simulator.RichTextBox1.PointToClient(new Point(x, y));
Rectangle rect = new Rectangle(0, 0, simulator.RichTextBox1.Bounds.Width
, simulator.RichTextBox1.Bounds.Height + SystemInformation.HorizontalScrollBarThumbWidth);
if (!rect.Contains(pos))
{
simulator.focusOff();
}
}
break;
}
return false;
}