Windows调整大小跳跃而不是顺利进行

时间:2014-10-28 09:27:06

标签: c# wpf

尝试为窗口大小调整实现自定义按钮时遇到问题。此视频展示了http://screencast.com/t/Dtl5PyLcN3TE

发生了什么

我使用thumb元素为窗口实现自定义大小调整按钮。

  <Thumb Style="{StaticResource ThumbStyle}" DragStarted="Thumb_OnDragStarted" DragDelta="Thumb_OnDragDeltanDragDelta"/>

它背后的代码

 private void Thumb_OnDragDeltanDragDelta(object sender, DragDeltaEventArgs e)
    {
        LogWindow.Height = m_BaseSize.Y + e.VerticalChange;
        LogWindow.Width = m_BaseSize.X + e.HorizontalChange;
    }

    private void Thumb_OnDragStarted(object sender, DragStartedEventArgs e)
    {
        m_BaseSize.X = LogWindow.Width;
        m_BaseSize.Y = LogWindow.Height;
    }

如何使自定义调整大小更接近本机实现?

修改 看起来我明白了什么问题。 Thumb_OnDragDeltanDragDelta有时会得到无效的垂直变化

1 个答案:

答案 0 :(得分:1)

我不再依赖此事件的数据,而是使用鼠标坐标。现在看起来都很好。

 private void Thumb_OnDragDeltanDragDelta(object sender, DragDeltaEventArgs e)
    {
        var source = PresentationSource.FromVisual(this);
        Point position = Mouse.GetPosition(this);
        var hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        Matrix transformToDevice = source.CompositionTarget.TransformToDevice;
        Point[] p = { new Point(Left, Top), new Point(position.X, position.Y) };
        transformToDevice.Transform(p);
        SetWindowPos(hwndSource.Handle, IntPtr.Zero, Convert.ToInt32(p[0].X), Convert.ToInt32(p[0].Y), Convert.ToInt32(p[1].X), Convert.ToInt32(p[1].Y), SetWindowPosFlags.SWP_SHOWWINDOW);
    }

并使用winApi resize

 [DllImport("user32.dll", CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);

    [Flags]
    public enum SetWindowPosFlags : uint
    {
        SWP_ASYNCWINDOWPOS = 0x4000,

        SWP_DEFERERASE = 0x2000,

        SWP_DRAWFRAME = 0x0020,

        SWP_FRAMECHANGED = 0x0020,

        SWP_HIDEWINDOW = 0x0080,

        SWP_NOACTIVATE = 0x0010,

        SWP_NOCOPYBITS = 0x0100,

        SWP_NOMOVE = 0x0002,

        SWP_NOOWNERZORDER = 0x0200,

        SWP_NOREDRAW = 0x0008,

        SWP_NOREPOSITION = 0x0200,

        SWP_NOSENDCHANGING = 0x0400,

        SWP_NOSIZE = 0x0001,

        SWP_NOZORDER = 0x0004,

        SWP_SHOWWINDOW = 0x0040,
    }