Exemplo n.º 1
0
        internal static void KeepInsideNearestMonitor(this ILayoutElementForFloatingWindow paneInsideFloatingWindow)
        {
            RECT normalPosition = new RECT();

            normalPosition.Left   = (int)paneInsideFloatingWindow.FloatingLeft;
            normalPosition.Top    = (int)paneInsideFloatingWindow.FloatingTop;
            normalPosition.Bottom = normalPosition.Top + (int)paneInsideFloatingWindow.FloatingHeight;
            normalPosition.Right  = normalPosition.Left + (int)paneInsideFloatingWindow.FloatingWidth;

            // Are we using only one monitor?
            if (SystemParameters.PrimaryScreenWidth == SystemParameters.VirtualScreenWidth &&
                SystemParameters.PrimaryScreenHeight == SystemParameters.VirtualScreenHeight)
            {
                RECT primaryscreen = new RECT((int)SystemParameters.VirtualScreenLeft, (int)SystemParameters.VirtualScreenTop,
                                              (int)SystemParameters.PrimaryScreenWidth, (int)SystemParameters.PrimaryScreenHeight);

                if (!RectanglesIntersect(normalPosition, primaryscreen))
                {
                    normalPosition = PlaceOnScreen(primaryscreen, normalPosition);

                    paneInsideFloatingWindow.FloatingLeft   = normalPosition.Left;
                    paneInsideFloatingWindow.FloatingTop    = normalPosition.Top;
                    paneInsideFloatingWindow.FloatingHeight = normalPosition.Bottom - normalPosition.Top;
                    paneInsideFloatingWindow.FloatingWidth  = normalPosition.Right - normalPosition.Left;

                    paneInsideFloatingWindow.RaiseFloatingPropertiesUpdated();
                }

                return;
            }
            else
            {
                RECT primaryscreen = new RECT((int)SystemParameters.VirtualScreenLeft, (int)SystemParameters.VirtualScreenTop,
                                              (int)SystemParameters.VirtualScreenWidth, (int)SystemParameters.VirtualScreenHeight);

                if (!RectanglesIntersect(normalPosition, primaryscreen))
                {
                    normalPosition = PlaceOnScreen(primaryscreen, normalPosition);

                    paneInsideFloatingWindow.FloatingLeft   = normalPosition.Left;
                    paneInsideFloatingWindow.FloatingTop    = normalPosition.Top;
                    paneInsideFloatingWindow.FloatingHeight = normalPosition.Bottom - normalPosition.Top;
                    paneInsideFloatingWindow.FloatingWidth  = normalPosition.Right - normalPosition.Left;

                    paneInsideFloatingWindow.RaiseFloatingPropertiesUpdated();
                }

                return;
            }
        }
Exemplo n.º 2
0
        internal static void KeepInsideNearestMonitor(this ILayoutElementForFloatingWindow paneInsideFloatingWindow)
        {
            var r = new RECT
            {
                Left = (int)paneInsideFloatingWindow.FloatingLeft,
                Top  = (int)paneInsideFloatingWindow.FloatingTop
            };

            r.Bottom = r.Top + (int)paneInsideFloatingWindow.FloatingHeight;
            r.Right  = r.Left + (int)paneInsideFloatingWindow.FloatingWidth;

            const uint monitorDefaulttonearest = 0x00000002;
            const uint monitorDefaulttonull    = 0x00000000;

            System.IntPtr monitor = User32.MonitorFromRect(ref r, monitorDefaulttonull);
            if (monitor == System.IntPtr.Zero)
            {
                System.IntPtr nearestmonitor = User32.MonitorFromRect(ref r, monitorDefaulttonearest);
                if (nearestmonitor != System.IntPtr.Zero)
                {
                    MonitorInfo monitorInfo = new MonitorInfo();
                    monitorInfo.cbSize = Marshal.SizeOf(monitorInfo);
                    User32.GetMonitorInfo(nearestmonitor, monitorInfo);

                    if (paneInsideFloatingWindow.FloatingLeft < monitorInfo.rcWork.Left)
                    {
                        paneInsideFloatingWindow.FloatingLeft = monitorInfo.rcWork.Left + 10;
                    }

                    if (paneInsideFloatingWindow.FloatingLeft + paneInsideFloatingWindow.FloatingWidth >
                        monitorInfo.rcWork.Right)
                    {
                        paneInsideFloatingWindow.FloatingLeft = monitorInfo.rcWork.Right -
                                                                (paneInsideFloatingWindow.FloatingWidth + 10);
                    }

                    if (paneInsideFloatingWindow.FloatingTop < monitorInfo.rcWork.Top)
                    {
                        paneInsideFloatingWindow.FloatingTop = monitorInfo.rcWork.Top + 10;
                    }

                    if (paneInsideFloatingWindow.FloatingTop + paneInsideFloatingWindow.FloatingHeight >
                        monitorInfo.rcWork.Bottom)
                    {
                        paneInsideFloatingWindow.FloatingTop = monitorInfo.rcWork.Bottom -
                                                               (paneInsideFloatingWindow.FloatingHeight + 10);
                    }
                }
            }
        }
Exemplo n.º 3
0
        internal static void KeepInsideNearestMonitor(this ILayoutElementForFloatingWindow paneInsideFloatingWindow)
        {
            var r = new Win32Helper.RECT();

            r.Left   = (int)paneInsideFloatingWindow.FloatingLeft;
            r.Top    = (int)paneInsideFloatingWindow.FloatingTop;
            r.Bottom = r.Top + (int)paneInsideFloatingWindow.FloatingHeight;
            r.Right  = r.Left + (int)paneInsideFloatingWindow.FloatingWidth;

            uint MONITOR_DEFAULTTONEAREST = 0x00000002;
            uint MONITOR_DEFAULTTONULL    = 0x00000000;

            var monitor = Win32Helper.MonitorFromRect(ref r, MONITOR_DEFAULTTONULL);

            if (monitor == IntPtr.Zero)
            {
                var nearestmonitor = Win32Helper.MonitorFromRect(ref r, MONITOR_DEFAULTTONEAREST);
                if (nearestmonitor != IntPtr.Zero)
                {
                    var monitorInfo = new Win32Helper.MonitorInfo();
                    monitorInfo.Size = Marshal.SizeOf(monitorInfo);
                    Win32Helper.GetMonitorInfo(nearestmonitor, monitorInfo);

                    if (paneInsideFloatingWindow.FloatingLeft < monitorInfo.Work.Left)
                    {
                        paneInsideFloatingWindow.FloatingLeft = monitorInfo.Work.Left + 10;
                    }

                    if (paneInsideFloatingWindow.FloatingLeft + paneInsideFloatingWindow.FloatingWidth >
                        monitorInfo.Work.Right)
                    {
                        paneInsideFloatingWindow.FloatingLeft =
                            monitorInfo.Work.Right - (paneInsideFloatingWindow.FloatingWidth + 10);
                    }

                    if (paneInsideFloatingWindow.FloatingTop < monitorInfo.Work.Top)
                    {
                        paneInsideFloatingWindow.FloatingTop = monitorInfo.Work.Top + 10;
                    }

                    if (paneInsideFloatingWindow.FloatingTop + paneInsideFloatingWindow.FloatingHeight >
                        monitorInfo.Work.Bottom)
                    {
                        paneInsideFloatingWindow.FloatingTop =
                            monitorInfo.Work.Bottom - (paneInsideFloatingWindow.FloatingHeight + 10);
                    }
                }
            }
        }
Exemplo n.º 4
0
        internal static void KeepInsideNearestMonitor(this ILayoutElementForFloatingWindow paneInsideFloatingWindow)
        {
            Win32Helper.RECT rECT = new Win32Helper.RECT()
            {
                Left   = (int)paneInsideFloatingWindow.FloatingLeft,
                Top    = (int)paneInsideFloatingWindow.FloatingTop,
                Bottom = rECT.Top + (int)paneInsideFloatingWindow.FloatingHeight,
                Right  = rECT.Left + (int)paneInsideFloatingWindow.FloatingWidth
            };
            uint num = 2;

            if (Win32Helper.MonitorFromRect(ref rECT, 0) == IntPtr.Zero)
            {
                IntPtr intPtr = Win32Helper.MonitorFromRect(ref rECT, num);
                if (intPtr != IntPtr.Zero)
                {
                    Win32Helper.MonitorInfo monitorInfo = new Win32Helper.MonitorInfo()
                    {
                        Size = Marshal.SizeOf(monitorInfo)
                    };
                    Win32Helper.GetMonitorInfo(intPtr, monitorInfo);
                    if (paneInsideFloatingWindow.FloatingLeft < (double)monitorInfo.Work.Left)
                    {
                        paneInsideFloatingWindow.FloatingLeft = (double)(monitorInfo.Work.Left + 10);
                    }
                    if (paneInsideFloatingWindow.FloatingLeft + paneInsideFloatingWindow.FloatingWidth > (double)monitorInfo.Work.Right)
                    {
                        paneInsideFloatingWindow.FloatingLeft = (double)monitorInfo.Work.Right - (paneInsideFloatingWindow.FloatingWidth + 10);
                    }
                    if (paneInsideFloatingWindow.FloatingTop < (double)monitorInfo.Work.Top)
                    {
                        paneInsideFloatingWindow.FloatingTop = (double)(monitorInfo.Work.Top + 10);
                    }
                    if (paneInsideFloatingWindow.FloatingTop + paneInsideFloatingWindow.FloatingHeight > (double)monitorInfo.Work.Bottom)
                    {
                        paneInsideFloatingWindow.FloatingTop = (double)monitorInfo.Work.Bottom - (paneInsideFloatingWindow.FloatingHeight + 10);
                    }
                }
            }
        }