Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,7 @@ internal void SetDisplayFromScrollProps(int x, int y)
Rectangle display = GetDisplayRectInternal();
ApplyScrollbarChanges(display);
SetDisplayRectLocation(x, y);
SyncScrollbars(true);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2547,6 +2547,73 @@ public void ScrollableControl_ScrollControlIntoView_Invoke_Success(bool autoScro
control.Controls.Clear();
}

[WinFormsFact]
public unsafe void ScrollableControl_SetDisplayFromScrollProps_InvokeHorizontalOffset_SyncsManagedAndNativeScrollPositions()
{
using SubScrollableControl control = CreateScrollableControlWithHorizontalOverflow();

Assert.True(control.IsHandleCreated);
Assert.True(control.HorizontalScroll.Visible);
Assert.Equal(0, control.DisplayRectangle.X);
Assert.Equal(0, control.HorizontalScroll.Value);
Assert.Equal(0, GetNativeHorizontalScrollPosition(control));

control.SetDisplayFromScrollPropsPublic(-120, 0);

Assert.Equal(-120, control.DisplayRectangle.X);
Assert.Equal(120, control.HorizontalScroll.Value);
Assert.Equal(120, GetNativeHorizontalScrollPosition(control));
}

[WinFormsFact]
public unsafe void ScrollableControl_SetDisplayFromScrollProps_InvokeRepeatedHorizontalOffsets_SyncsOnEachUpdate()
{
using SubScrollableControl control = CreateScrollableControlWithHorizontalOverflow();

control.SetDisplayFromScrollPropsPublic(-160, 0);

Assert.Equal(-160, control.DisplayRectangle.X);
Assert.Equal(160, control.HorizontalScroll.Value);
Assert.Equal(160, GetNativeHorizontalScrollPosition(control));

control.SetDisplayFromScrollPropsPublic(-40, 0);

Assert.Equal(-40, control.DisplayRectangle.X);
Assert.Equal(40, control.HorizontalScroll.Value);
Assert.Equal(40, GetNativeHorizontalScrollPosition(control));
}

private static unsafe int GetNativeHorizontalScrollPosition(ScrollableControl control)
{
SCROLLINFO info = new()
{
cbSize = (uint)sizeof(SCROLLINFO),
fMask = SCROLLINFO_MASK.SIF_POS
};

PInvoke.GetScrollInfo(control, SCROLLBAR_CONSTANTS.SB_HORZ, ref info);
return info.nPos;
}

private static SubScrollableControl CreateScrollableControlWithHorizontalOverflow()
{
SubScrollableControl control = new()
{
AutoScroll = true,
Size = new Size(200, 200)
};

control.Controls.Add(new Button
{
Bounds = new Rectangle(900, 0, 100, 30)
});

control.CreateControl();
control.PerformLayout();

return control;
}

private class LargeControl : Control
{
protected override Size DefaultSize => new(100, 150);
Expand Down Expand Up @@ -2662,5 +2729,7 @@ public class SubScrollableControl : ScrollableControl
public new void SetScrollState(int bit, bool value) => base.SetScrollState(bit, value);

public new void SetStyle(ControlStyles flag, bool value) => base.SetStyle(flag, value);

public void SetDisplayFromScrollPropsPublic(int x, int y) => SetDisplayFromScrollProps(x, y);
}
}
Loading