前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c# 停靠窗体

c# 停靠窗体

作者头像
冰封一夏
发布于 2019-09-11 07:19:35
发布于 2019-09-11 07:19:35
1.1K00
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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;
        }
    }

效果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(十九)c#Winform自定义控件-停靠窗体
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
8150
(二十二)c#Winform自定义控件-半透明窗体
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
1.6K0
c# 自定义多选下拉列表2
以下为工作中遇到的,备注一下 先需要几个辅助类 1 #region GripBounds 2 3 using System.Drawing; 4 internal struct GripBounds 5 { 6 private const int GripSize = 6; 7 private const int CornerGripSize = GripSize << 1; 8 9 public GripBounds(Rectangle cl
冰封一夏
2019/09/11
3K0
C#截屏及图片处理
码客说
2023/06/04
5560
(四十八)c#Winform自定义控件-下拉按钮
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/09
8460
(四十八)c#Winform自定义控件-下拉按钮
c# 调用win32模拟点击的两种方法
第一种 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsApplication2 { public parti
lpxxn
2018/01/31
1.6K0
c#QQ连连看辅助
游戏辅助有三种方法,一种是读内存,这个不知道怎么分析,还有一种是获取封包,这个分析起来复杂,最后一种是图片识别再分析,这里采用最后一种 图片识别来做。
冰封一夏
2019/09/11
6870
【C#】分享一个弹出容器层,像右键菜单那样召即来挥则去
------------------201508261813更新(源码有更新、Demo未更新)------------------
AhDung
2018/09/13
2.9K0
【C#】分享一个弹出容器层,像右键菜单那样召即来挥则去
c#透明TextBox
在 http://www.codeproject.com/KB/edit/AlphaBlendedTextControls.aspx 的基础上增加了水印文字
冰封一夏
2019/09/10
1.8K0
c#透明TextBox
(四十九)c#Winform自定义控件-下拉框(表格)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/09
1.8K0
(四十九)c#Winform自定义控件-下拉框(表格)
(二十九)c#Winform自定义控件-文本框(二)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
6080
CSharp通过Websocket传输图片在WEB端显示及传递鼠标事件
这个代码示例提供了三个按钮,分别用于模拟鼠标的移动、点击和拖拽操作。在 btnMove_Click 中,我们首先获取当前鼠标光标的位置,并将其向右下角移动 10 个像素,然后等待 500 毫秒,最后将鼠标光标移回原来的位置。在 btnClick_Click 中,我们模拟了鼠标左键按下和抬起的事件。在 btnDrag_Click 中,我们模拟了鼠标的拖拽事件。
码客说
2023/05/31
8140
(七十九)c#Winform自定义控件-导航菜单
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/10/09
1.4K0
(七十九)c#Winform自定义控件-导航菜单
【C#】分享一个可携带附加消息的增强消息框MessageBoxEx
--------------201806111122更新---------------
AhDung
2018/09/13
2.1K0
【C#】分享一个可携带附加消息的增强消息框MessageBoxEx
C#实现QQ(高仿版)聊天窗口
TextBox:允许用户输入文本,并提供多行编辑和密码字符掩码功能; Button:当用户单击它时引发事件; Timer:按用户定义的间隔引发事件的组件
全栈程序员站长
2022/09/15
1.8K0
C#实现QQ(高仿版)聊天窗口
C#自定义控件之-winform美化「建议收藏」
对于系统自带的窗体,博主实在不敢恭维,测试时使用方便快捷,但真正项目中无法使用,只因不美观的外表,每次都很头疼窗体的美化,这里列出一些需要解决的问题和自己收集到的解决方法,如有错误请指出。
全栈程序员站长
2022/08/27
3.2K0
C#自定义控件之-winform美化「建议收藏」
(二十一)c#Winform自定义控件-气泡提示
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
9010
(二十一)c#Winform自定义控件-气泡提示
(三十一)c#Winform自定义控件-文本框(四)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
1.5K0
(三十一)c#Winform自定义控件-文本框(四)
C# 窗体常用API函数 应用程序窗体查找
常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...): 使用C#语言,要引用DllImport,必须要添加using System.Runtime.InteropServices命名空间 (1)获得当前前台窗体句柄 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]public static extern IntPtr GetForegroundWindow(); 返回值类型是IntPtr,即为当前
逸鹏
2018/04/10
4.1K0
(六十九)c#Winform自定义控件-垂直滚动条
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/29
1.9K0
(六十九)c#Winform自定义控件-垂直滚动条
相关推荐
(十九)c#Winform自定义控件-停靠窗体
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验