c# 停靠窗体

 public partial class FrmAnchor : Form, IMessageFilter
    {
        public FrmAnchor(Control parentControlc, Control keyControl)
        {
            InitializeComponent();
            this.Size = keyControl.Size;
            this.HandleCreated += FrmDownBoard_HandleCreated;
            this.HandleDestroyed += FrmDownBoard_HandleDestroyed;
            this.Controls.Add(keyControl);
            keyControl.Dock = DockStyle.Fill;
            Point p = parentControlc.Parent.PointToScreen(parentControlc.Location);
            int intX = 0;
            int intY = 0;
            if (p.Y + parentControlc.Height + keyControl.Height > Screen.PrimaryScreen.Bounds.Height)
            {
                intY = p.Y - keyControl.Height-1;
            }
            else
            {
                intY = p.Y + parentControlc.Height+1;
            }

            if (p.X + keyControl.Width > Screen.PrimaryScreen.Bounds.Width)
            {
                intX = Screen.PrimaryScreen.Bounds.Width - keyControl.Width;

            }
            else
            {
                intX = p.X;
            }
            this.Location = new Point(intX, intY);

        }

        public FrmAnchor(Size size,Point location, Control keyControl)
        {
            InitializeComponent();
            this.Size = keyControl.Size;
            this.HandleCreated += FrmDownBoard_HandleCreated;
            this.HandleDestroyed += FrmDownBoard_HandleDestroyed;
            this.Controls.Add(keyControl);
            keyControl.Dock = DockStyle.Fill;
            Point p = location;
            int intX = 0;
            int intY = 0;
            if (p.Y + size.Height + size.Height > Screen.PrimaryScreen.Bounds.Height)
            {
                intY = p.Y - keyControl.Height - 1;
            }
            else
            {
                intY = p.Y + size.Height + 1;
            }

            if (p.X + keyControl.Width > Screen.PrimaryScreen.Bounds.Width)
            {
                intX = Screen.PrimaryScreen.Bounds.Width - keyControl.Width;

            }
            else
            {
                intX = p.X;
            }
            this.Location = new Point(intX, intY);

        }

        private void FrmDownBoard_HandleDestroyed(object sender, EventArgs e)
        {
            Application.RemoveMessageFilter(this);
        }

        private void FrmDownBoard_HandleCreated(object sender, EventArgs e)
        {
            Application.AddMessageFilter(this);
        }

        #region 无焦点窗体

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private extern static IntPtr SetActiveWindow(IntPtr handle);
        private const int WM_ACTIVATE = 0x006;
        private const int WM_ACTIVATEAPP = 0x01C;
        private const int WM_NCACTIVATE = 0x086;
        private const int WA_INACTIVE = 0;
        private const int WM_MOUSEACTIVATE = 0x21;
        private const int MA_NOACTIVATE = 3;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_MOUSEACTIVATE)
            {
                m.Result = new IntPtr(MA_NOACTIVATE);
                return;
            }
            else if (m.Msg == WM_NCACTIVATE)
            {
                if (((int)m.WParam & 0xFFFF) != WA_INACTIVE)
                {
                    if (m.LParam != IntPtr.Zero)
                    {
                        SetActiveWindow(m.LParam);
                    }
                    else
                    {
                        SetActiveWindow(IntPtr.Zero);
                    }
                }
            }
            base.WndProc(ref m);
        }

        #endregion

        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg != 0x0201 || this.Visible == false) return false;
            var pt = this.PointToClient(MousePosition);
            this.Visible = this.ClientRectangle.Contains(pt);
            return false;
        }
    }

效果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • (四十)c#Winform自定义控件-开关

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    冰封一夏
  • (十四)c#Winform自定义控件-键盘(一)

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    冰封一夏
  • (二十八)c#Winform自定义控件-文本框(一)

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    冰封一夏
  • JS实现简易的计算器

    自认脑袋不够大,就实现一个普通版本的吧(支持正负数加减乘除等基本连续的运算,未提供括号功能)

    书童小二
  • 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实例一个模块(商品字典)

            本文是一步一步教你使用AgileEAS.NET基础进行应用开发系统的WinForm应用篇的开篇,从本文起开始大家将看到一个距离真实应用非常接的开...

    魏琼东
  • 记一个复杂组件(Filter)的从设计到开发

    貌似在面试中,你如何设计一个 react/vue 组件,貌似已经是司空见惯的问题了。本文不是理论片,更多的是自己的一步步思考和实践。文中会有很多笔者的思考过程,...

    Nealyang
  • 课外阅读之ASP+access

    1、准备知识: 了解VBScript或者JavaScript(下面多介绍VB系列的ASP),两者只是在语法有稍微的差别 2、输出 使用:response.w...

    苦咖啡
  • SAS-编程中的小技巧(八)

    很久没写公众号了...也积累很多想要分享的小技巧,奈何一直苦于工作繁忙,诸事繁多无暇分身...在即将要忘掉所有想分享的小技巧的前一秒想起了公众号还没写呢...最...

    Setup
  • 《Java从入门到放弃》JavaSE入门篇(十六):多线程

    出处:https://blog.csdn.net/u010255818/article/details/50864566

    良月柒
  • 将Chrome设置为Jupyter_notebook的默认浏览器

    我们知道jupyter_notebook是在浏览器中打开的,这里建议大家都使用Chrome浏览器打开,因为其他浏览器可能会出现一些不兼容的问题。如果你电脑上有C...

    张俊红

扫码关注云+社区

领取腾讯云代金券