WPF中将Window Show到桌面的指定位置

现在有这样一个需求,拖拽UserControl中的一个Rectangle做的标题栏,然后新建一个Window把UserControl中的内容填充到新的窗口中去。Window.Show()不会把窗口创建的理想的位置。就需要将Window Show到桌面的指定位置。

首先获取鼠标相对于Rectangle的位置。

        private Rectangle _rectTitle;
        private Point _pointInRectangle;
        private void RectTitle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            _pointInRectangle = e.GetPosition(_rectTitle);
        }

然后获取鼠标相对于桌面的绝对位置。

        public struct POINT
        {
            public int X;
            public int Y;
            public POINT(int x, int y)
            {
                this.X = x;
                this.Y = y;
            }
        }
        //Copy from http://blog.csdn.net/withdreams/article/details/7497583
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool GetCursorPos(out POINT pt);


计算的时候需要用到英寸跟像素的单位转换。

            using (Drawing.Graphics g = Drawing.Graphics.FromHdc(dc))
            {
                xDpi = g.DpiX;
                yDpi = g.DpiY;
            }
        //Copy from http://codego.net/28224/
        [DllImport("user32.dll")]
        private static extern IntPtr GetDC(IntPtr hwnd);

        Single xDpi, yDpi;
        IntPtr dc = GetDC(IntPtr.Zero);


最后计算新窗口需要Show的相对于桌面的绝对位置。

            POINT p = new POINT();
            if (GetCursorPos(out p))//API方法
            {
                _winFloat.Top = (p.Y - 10) / yDpi * 96 - _pointInRectangle.Y;//window有边框,需要往上偏移10像素。
                _winFloat.Left = (p.X - 10) / xDpi * 96 - _pointInRectangle.X;//window有边框,需要往左偏移10像素。
            }

注意Window.Top和Window.Left的单位是1/96英寸。而GetCursorPos获取的单位是像素,需要根据屏幕的DPI转换为英寸;貌似System.Windows.Point的单位也是1/96英寸。

上边的方法是可以实现将Window显示到桌面的指定位置的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值