示例#1
0
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WinAPI.WM_NCHITTEST)
            {
                Point mouse = this.PointToClient(Cursor.Position);

                //System.Diagnostics.Debug.WriteLine(mouse.X + ":" + mouse.Y);

                UpdateCaptionControl(0, (btnClose.Contains(mouse) ? 1 : 0));
                UpdateCaptionControl(1, (btnMaximize.Contains(mouse) ? 1 : 0));
                UpdateCaptionControl(2, (btnMinimize.Contains(mouse) ? 1 : 0));

                foreach (int b in capcontrols)
                {
                    if (b != 0)
                    {
                        m.Result = (IntPtr)WinAPI.HTBORDER;
                        return;
                    }
                }

                bool
                    left   = false,
                    right  = false,
                    top    = false,
                    bottom = false;

                if (mouse.X <= bordersize)
                {
                    left = true;
                }
                else if (mouse.X >= this.Width - bordersize)
                {
                    right = true;
                }
                if (mouse.Y <= bordersize)
                {
                    top = true;
                }
                else if (mouse.Y >= this.Height - bordersize)
                {
                    bottom = true;
                }

                if (top && left)
                {
                    m.Result = (IntPtr)WinAPI.HTTOPLEFT;
                }
                else if (top && right)
                {
                    m.Result = (IntPtr)WinAPI.HTTOPRIGHT;
                }
                else if (bottom && left)
                {
                    m.Result = (IntPtr)WinAPI.HTBOTTOMLEFT;
                }
                else if (bottom && right)
                {
                    m.Result = (IntPtr)WinAPI.HTBOTTOMRIGHT;
                }
                else if (top)
                {
                    m.Result = (IntPtr)WinAPI.HTTOP;
                }
                else if (bottom)
                {
                    m.Result = (IntPtr)WinAPI.HTBOTTOM;
                }
                else if (left)
                {
                    m.Result = (IntPtr)WinAPI.HTLEFT;
                }
                else if (right)
                {
                    m.Result = (IntPtr)WinAPI.HTRIGHT;
                }
                else if (CaptionDragBounds.Contains(mouse))
                {
                    m.Result = (IntPtr)WinAPI.HTCAPTION;
                }
                else if (CaptionBounds.Contains(mouse))
                {
                    m.Result = (IntPtr)WinAPI.HTBORDER;
                }
                else
                {
                    m.Result = (IntPtr)WinAPI.HTCLIENT;
                }
                return;
            }
            else if (m.Msg == WinAPI.WM_NCMOUSELEAVE)
            {
                for (int i = 0; i < capcontrols.Length; i++)
                {
                    capcontrols[i] = 0;
                }
                this.Invalidate();
            }
            else if (m.Msg == WinAPI.WM_NCLBUTTONUP)
            {
                Point mouse = this.PointToClient(Cursor.Position);
                if (btnClose.Contains(mouse) && capcontrols[0] == 2)
                {
                    this.Close(); return;
                }
                else if (btnMaximize.Contains(mouse) && capcontrols[1] == 2)
                {
                    this.WindowState = (this.WindowState == FormWindowState.Maximized ? FormWindowState.Normal : FormWindowState.Maximized);
                    if (this.WindowState == FormWindowState.Maximized)
                    {
                        glow.Hide();
                    }
                    else
                    {
                        glow.Show();
                    }

                    return;
                }
                else if (btnMinimize.Contains(mouse) && capcontrols[2] == 2)
                {
                    this.WindowState = FormWindowState.Minimized; return;
                }

                for (int i = 0; i < capcontrols.Length; i++)
                {
                    if (capcontrols[i] == 2)
                    {
                        capcontrols[i] = 1;
                    }
                }
                this.Invalidate();
            }
            else if (m.Msg == WinAPI.WM_NCLBUTTONDOWN)
            {
                Point mouse = this.PointToClient(Cursor.Position);
                UpdateCaptionControl(0, (btnClose.Contains(mouse) ? 2 : 0));
                UpdateCaptionControl(1, (btnMaximize.Contains(mouse) ? 2 : 0));
                UpdateCaptionControl(2, (btnMinimize.Contains(mouse) ? 2 : 0));
            }
            else if (m.Msg == WinAPI.WM_NCCALCSIZE && m.WParam.ToInt32() == 1)
            {
                m.Result = new IntPtr(0x00);
                return;
            }
            else if (m.Msg == WinAPI.WM_SYSCOMMAND)
            {
                int command = m.WParam.ToInt32() & 0xFFF0;
                if (command == WinAPI.SC_MINIMIZE)
                {
                    glow.WindowState = FormWindowState.Minimized;
                }
                else if (command == WinAPI.SC_RESTORE)
                {
                    glow.WindowState = FormWindowState.Normal;
                }
            }
            else if (m.Msg == WinAPI.WM_ACTIVATE)
            {
                if (m.WParam.ToInt32() == 0)
                {
                    glow.Hide();
                }
                else
                {
                    if (this.WindowState != FormWindowState.Maximized)
                    {
                        glow.Show();
                        glow.Render();

                        //glow.BringToFront();
                        this.BringToFront();
                    }
                }
            }

            base.WndProc(ref m);
        }