private bool WndProc(Message m) { var message = (Utils.ControlExtensions.WindowsMessage)m.Msg; var control = Control.FromHandle(m.HWnd); if (control != null && Glyphs.Keys.Any(c => c == control)) { Point point; LowHiWordSigned lowHighWord; Rectangle rect; var glyphs = this.Glyphs[control].ToList(); switch (message) { case ControlExtensions.WindowsMessage.LBUTTONDOWN: lowHighWord = m.LParam.ToLowHiWordSigned(); point = new Point(lowHighWord.Low, lowHighWord.High); foreach (var glyph in glyphs) { var location = glyph.Location; location.Offset(glyph.Offset); rect = new Rectangle(location, glyph.Size); if (rect.Contains(point)) { glyph.Clicked = true; control.Invalidate(rect); control.Update(); } else { glyph.Clicked = false; } } break; case ControlExtensions.WindowsMessage.LBUTTONUP: lowHighWord = m.LParam.ToLowHiWordSigned(); point = new Point(lowHighWord.Low, lowHighWord.High); foreach (var glyph in glyphs.Where(g => g.Clicked)) { var location = glyph.Location; location.Offset(glyph.Offset); rect = new Rectangle(location, glyph.Size); if (rect.Contains(point)) { glyph.PerformClick(); glyph.Clicked = false; control.Invalidate(rect); control.Update(); } } break; case ControlExtensions.WindowsMessage.NCHITTEST: lowHighWord = m.LParam.ToLowHiWordSigned(); point = new Point(lowHighWord.Low, lowHighWord.High); foreach (var glyph in glyphs) { var location = glyph.Location; location.Offset(glyph.Offset); point = control.PointToClient(point); rect = new Rectangle(location, glyph.Size); if (rect.Contains(point)) { if (!glyph.Hovered) { glyph.Hovered = true; control.Invalidate(rect); control.Update(); } } else if (glyph.Hovered) { glyph.Hovered = false; glyph.Clicked = false; control.Invalidate(rect); control.Update(); } } break; case ControlExtensions.WindowsMessage.NCMOUSELEAVE: foreach (var glyph in glyphs.Where(g => g.Hovered)) { var location = glyph.Location; location.Offset(glyph.Offset); rect = new Rectangle(location, glyph.Size); glyph.Hovered = false; glyph.Clicked = false; control.Invalidate(rect); control.Update(); } break; case ControlExtensions.WindowsMessage.MOUSEMOVE: lowHighWord = m.LParam.ToLowHiWordSigned(); point = new Point(lowHighWord.Low, lowHighWord.High); foreach (var glyph in glyphs) { var location = glyph.Location; location.Offset(glyph.Offset); rect = new Rectangle(location, glyph.Size); if (rect.Contains(point)) { if (!glyph.Hovered) { glyph.Hovered = true; control.Invalidate(rect); control.Update(); } } else if (glyph.Hovered) { glyph.Hovered = false; control.Invalidate(rect); control.Update(); } } if (Keys.LButton.IsPressed()) { if (!mouseDownControls.Contains(control)) { control.SetCapture(); control.SendMessage(ControlExtensions.WindowsMessage.NCLBUTTONDOWN, m.WParam, m.LParam); mouseDownControls.Add(control); } } else { if (mouseDownControls.Contains(control)) { control.ReleaseCapture(); control.SendMessage(ControlExtensions.WindowsMessage.NCLBUTTONUP, m.WParam, m.LParam); mouseDownControls.Remove(control); } } break; case ControlExtensions.WindowsMessage.MOUSELEAVE: foreach (var glyph in glyphs.Where(g => g.Hovered)) { var location = glyph.Location; location.Offset(glyph.Offset); rect = new Rectangle(location, glyph.Size); glyph.Hovered = false; glyph.Clicked = false; control.Invalidate(rect); control.Update(); } break; } } else if (control != null && Glyphs.Keys.Any(c => c.GetParentForm() == control)) { switch (message) { case ControlExtensions.WindowsMessage.LBUTTONDOWN: case ControlExtensions.WindowsMessage.LBUTTONUP: foreach (var childControl in Glyphs.Keys.Where(c => c.GetParentForm() == control)) { var lowHighWord = m.LParam.ToLowHiWordSigned(); var point = new Point(lowHighWord.Low, lowHighWord.High); IntPtr lParam; point = childControl.TranslatePoint(point, control); lParam = ControlExtensions.MakeLParam(point.X, point.Y); m.HWnd = childControl.Handle; m.LParam = lParam; WndProc(m); } break; } } return(true); }