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;
        }
    }

效果如下:

原文地址:https://www.cnblogs.com/bfyx/p/9540711.html

时间: 2024-12-15 07:07:04

c# 停靠窗体的相关文章

Pyqt QDockWidget 停靠窗体

网上的一个关于QDockWidget 停靠窗体的教程 代码: 1 # -*- coding: utf-8 -*- 2 from PyQt4.QtGui import * 3 from PyQt4.QtCore import * 4 import sys 5 6 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) 7 8 class MainWidget(QMainWindow): 9 def __init__(self,p

向停靠窗体内增加自定义控件

如果已创建好了自定义控件ucToolbox, 首先要在调用的窗体中定义这个控件 private ucToolbox ucToolbox1; this.ucToolbox1 = new Endv.WinForm.Docking.ucToolbox(); 设置控件的一些属性 1 // 2 // ucToolbox1 3 // 4 this.ucToolbox1.Dock = System.Windows.Forms.DockStyle.Fill; 5 this.ucToolbox1.Location

高级停靠(Dock)技术的实现

所谓停靠就是可以用鼠标拖动窗体或者控件,并将其从一个父窗体移出或者移动到另一个父窗体上,可以按水平,垂直方向整齐排列, 并且可以停靠在分页控制组件上.下面的示意图是一个Delphi IDE的窗口停靠示意图: 考察一些常用的软件如Office等大型软件,会发现大多提供窗体停靠的功能.微软的MFC很早就引入了工具条的拖放功能,可以将工具条上窗口上边拖放到窗口下边.而Borland则最早在Delphi 4中开始引入停靠功能支持,它实际上就是基于前面我们讲到的VCL拖放技术基础之上的,后面我们会看到两者

C#中使用WeiFenLuo.WinFormsUI.Docking.dll实现窗口停靠效果

很酷的效果,很值得好好去学习的哈. 重置工具箱: 新建一个WinForm程序,项目名称为TestDockPanelControl.选中Form1窗体后选择工具箱--->>新建个添加选项卡命名为WeiFenLuo--->>右键--->>选择项--->>浏览--- >>weiFenLuo.winFormsUI.Docking.dll--->>确定.此时工具箱出现DockPanel控件.这以上步骤仅是把DockPanel控件添加到工具箱中.

WeiFenLuo.winFormsUI.Docking.dll的使用(停靠效果)

1.  重置工具箱: 新建一个WinForm程序,项目名称为TestDockPanelControl.选中Form1窗体后选择工具箱--->>新建个添加选项卡命名为WeiFenLuo--->>右键--->>选择项--->>浏览--- >>weiFenLuo.winFormsUI.Docking.dll--->>确定.此时工具箱出现DockPanel控件.这以上步骤仅是把DockPanel控件添加到工具箱中. 1.建立一个WinForm

停靠窗口

代码: 1 #coding: utf-8 2 from PyQt4.QtCore import * 3 from PyQt4.QtGui import * 4 import sys 5 6 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) 7 8 class MainWidget(QMainWindow): 9 def __init__(self, parent=None): 10 super(MainWidget, s

CDockablePane 关闭的问题

显示或者隐藏 当点击CDockablePane上的关闭按钮时,并不能将其关闭,知识将其隐藏了起来,如果需要重新显示或隐藏,则相关命令的响应函数如下: if(m_Panes.GetSafeHwnd()) { BOOL flag = !m_Panes.IsVisible(); m_Panes.ShowPane(flag,FALSE,flag); } 关闭按钮的响应函数 当点击CDockablePane上的关闭按钮时,主框架会进行响应 //关闭停靠窗口事件,事实上是隐藏窗体,还是占用资源的 BOOL

C#源码大汇总

C#高仿QQ2013可在广域网部署聊天系统GG叽叽 动态显示硬盘分区容量饼图 自定义ProgressBar控件高仿Win8进度条 多皮肤精美在线QQ悬浮客服插件 jQuery仿天猫首页多格焦点图片轮播 jQuery时间轴特效 自动完成菜单.代码提示.输入纠错控件 仿Google浏览器进度条 仿苹果Safari浏览器选项卡自定义TabControl控件 蜂窝大战游戏 C#开源内容管理系统DTcms v3.0正式版源码 ScreenToGif录制屏幕到gif动画 CSS3仿Google Play的垂

weiFenLuo.winFormsUI.Docking.dll学习

引用方法: 1.建立一个WinForm工程,默认生成了一个WinForm窗体. 2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll. 3.窗体属性IsMdiContainer:True. 4.工具箱—>右键—>选择项—>.net组件—>浏览—>weiFenLuo.winFormsUI.Docking.dll—>在工具箱出现dockPanel. 5.将dockPanel拖到窗体上,设置Dock属性,我设置的是