博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wpf无边框窗体移动和大小调整
阅读量:7033 次
发布时间:2019-06-28

本文共 4759 字,大约阅读时间需要 15 分钟。

原文:

 

using System;using System.Windows;using System.Windows.Interop;namespace Wpftest{    public partial class MainWindow : Window    {        public MainWindow()        {            this.InitializeComponent();            // 在此点下面插入创建对象所需的代码。        }        protected override void OnSourceInitialized(EventArgs e)        {            base.OnSourceInitialized(e);            HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;            if (hwndSource != null)            {                hwndSource.AddHook(new HwndSourceHook(this.WndProc));            }        }        private const int WM_NCHITTEST = 0x0084;        private readonly int agWidth = 12; //拐角宽度        private readonly int bThickness = 4; // 边框宽度        private Point mousePoint = new Point(); //鼠标坐标        public enum HitTest : int        {            HTERROR = -2,            HTTRANSPARENT = -1,            HTNOWHERE = 0,            HTCLIENT = 1,            HTCAPTION = 2,            HTSYSMENU = 3,            HTGROWBOX = 4,            HTSIZE = HTGROWBOX,            HTMENU = 5,            HTHSCROLL = 6,            HTVSCROLL = 7,            HTMINBUTTON = 8,            HTMAXBUTTON = 9,            HTLEFT = 10,            HTRIGHT = 11,            HTTOP = 12,            HTTOPLEFT = 13,            HTTOPRIGHT = 14,            HTBOTTOM = 15,            HTBOTTOMLEFT = 16,            HTBOTTOMRIGHT = 17,            HTBORDER = 18,            HTREDUCE = HTMINBUTTON,            HTZOOM = HTMAXBUTTON,            HTSIZEFIRST = HTLEFT,            HTSIZELAST = HTBOTTOMRIGHT,            HTOBJECT = 19,            HTCLOSE = 20,            HTHELP = 21,        }        protected virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)        {            switch (msg)            {                case WM_NCHITTEST:                    {                        this.mousePoint.X = (lParam.ToInt32() & 0xFFFF);                        this.mousePoint.Y = (lParam.ToInt32() >> 16);                        //告诉系统你已经处理过该消息,不然设置为false                        handled = true;                        #region 测试鼠标位置                        // 窗口左上角                        if (this.mousePoint.Y - this.Top <= this.agWidth                                         && this.mousePoint.X - this.Left <= this.agWidth)                        {                            return new IntPtr((int)HitTest.HTTOPLEFT);                        }                        // 窗口左下角                          else if (this.ActualHeight + this.Top - this.mousePoint.Y <= this.agWidth                                         && this.mousePoint.X - this.Left <= this.agWidth)                        {                            return new IntPtr((int)HitTest.HTBOTTOMLEFT);                        }                        // 窗口右上角                        else if (this.mousePoint.Y - this.Top <= this.agWidth                         && this.ActualWidth + this.Left - this.mousePoint.X <= this.agWidth)                        {                            return new IntPtr((int)HitTest.HTTOPRIGHT);                        }                        // 窗口右下角                        else if (this.ActualWidth + this.Left - this.mousePoint.X <= this.agWidth                         && this.ActualHeight + this.Top - this.mousePoint.Y <= this.agWidth)                        {                            return new IntPtr((int)HitTest.HTBOTTOMRIGHT);                        }                        // 窗口左侧                        else if (this.mousePoint.X - this.Left <= this.bThickness)                        {                            return new IntPtr((int)HitTest.HTLEFT);                        }                        // 窗口右侧                        else if (this.ActualWidth + this.Left - this.mousePoint.X <= this.bThickness)                        {                            return new IntPtr((int)HitTest.HTRIGHT);                        }                        // 窗口上方                        else if (this.mousePoint.Y - this.Top <= this.bThickness)                        {                            return new IntPtr((int)HitTest.HTTOP);                        }                        // 窗口下方                        else if (this.ActualHeight + this.Top - this.mousePoint.Y <= this.bThickness)                        {                            return new IntPtr((int)HitTest.HTBOTTOM);                        }                        else // 窗口移动(也可在窗体MouseLeftButtonDown事件中调用DragMove()方法),双击最大化,所有剩余鼠标操作映射到标题栏                        {                            return new IntPtr((int)HitTest.HTCAPTION);                        }                        #endregion                    }            }            return IntPtr.Zero;        }    }}

弊端 窗体 中控件 事件 失效

转载地址:http://qiyal.baihongyu.com/

你可能感兴趣的文章
unit 12
查看>>
遮罩和图层
查看>>
数字化华为:助力企业数字化转型
查看>>
tabhost置底
查看>>
shell训练营Day16
查看>>
Lintcode32 Minimum Window Substring solution 题解
查看>>
PAM 认证机制
查看>>
xp分区不见的数据怎样恢复
查看>>
一种简单易懂的 MyBatis 分库分表方案
查看>>
ThinkPHP去除url中的index.php
查看>>
6\MySQL 主从同步 、 MySQL 读写分离 、 MySQL 性能调优
查看>>
Java之品优购课程讲义_day18(2)
查看>>
直播助力广电媒体融合发展
查看>>
using $sp.getForm to get all fields in a form
查看>>
PCB设计时,怎样控制线宽与电流的关系
查看>>
samba服务器
查看>>
面试前必须要知道的Redis面试题
查看>>
消息队列之kafka(基础介绍)
查看>>
老中医化妆品是品牌吗
查看>>
阿里云云数据库RDS核心能力演进
查看>>