Ejemplo n.º 1
0
        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);
        }