gpt4 book ai didi

c# - 我怎么知道用户何时可以使用强制滚动条滚动 RichTextBox

转载 作者:行者123 更新时间:2023-12-05 03:17:43 32 4
gpt4 key购买 nike

我需要将 ScrollBars 设置为 ForcedBoth 但我还想知道 ScrollBars 的句柄何时可见并且用户可以滚动。

两个滚动条的 bool 值都可以

这里用户不能滚动:
Here the user cant scroll

在这里他们可以:
And here they can

我正在尝试创建一个派生自 RichTextBox 的自定义滚动条。
为此,我将面板覆盖在原始滚动条上并禁用它们(以便您可以使用原始滚动条),同时获得不同的视觉效果(覆盖面板)。
我让一切正常,除了当 RichTextBox 的滚动条被禁用时我需要禁用其中一个面板( handle 面板)。

我尝试了 Win32 API 中的 GetScrollInfo,但是当放大到 RichTextBox 或一次删除一堆行时,它会导致不一致的结果。

最佳答案

如果这实际上是您需要了解的有关 RichTextBox 的滚动条状态的信息,请使用 GetScrollBarInfo()要获取此信息,然后测试存储在返回的 SCROLLBARINFOrgstate 组件中的值结构。

  • 当 ScrollBar 被禁用时,rgstate[0] 设置为 STATE_SYSTEM_UNAVAILABLE;在这种情况下,索引 2(页面元素)处的值应设置为 STATE_SYSTEM_INVISIBLE
  • 当 ScrollBar 不存在时,相同的值为 STATE_SYSTEM_INVISIBLE
  • 否则为0(此处设置为SBIdObj.STATE_SYSTEM_AVAILABLE = 0x00000000)

可用于测试滚动条的示例方法。称它为,例如,

var result = GetScrollBarsState(myRichTextBox.Handle);  

它返回一个命名元组,其中两个 ScrollBar 的状态都设置为当前 SBIdObj

public (SBRgState Vertical, SBRgState Horizontal) GetScrollBarsState(IntPtr controlHandle)
{
var sbi = new SCROLLBARINFO() { cbSize = Marshal.SizeOf<SCROLLBARINFO>() };

bool result = GetScrollBarInfo(controlHandle, SBIdObj.OBJID_VSCROLL, ref sbi);
if (!result) throw new Exception("Failed to retrieve vertical ScrollBar info");
var vert = (SBRgState)sbi.rgstate[0];

result = GetScrollBarInfo(controlHandle, SBIdObj.OBJID_HSCROLL, ref sbi);
if (!result) throw new Exception("Failed to retrieve horizontal ScrollBar info");
var horz = (SBRgState)sbi.rgstate[0];
return (vert, horz);
}

声明:

[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool GetScrollBarInfo(IntPtr hWnd, SBIdObj idObject, ref SCROLLBARINFO psbi);

[StructLayout(LayoutKind.Sequential)]
public struct SCROLLBARINFO {
public int cbSize;
public Rectangle rcScrollBar;
public int dxyLineButton;
public int xyThumbTop;
public int xyThumbBottom;
public int reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public int[] rgstate;
}

// GetScrollBarInfo idObject
public enum SBIdObj : uint {
OBJID_HSCROLL = 0xFFFFFFFA,
OBJID_VSCROLL = 0xFFFFFFFB,
OBJID_CLIENT = 0xFFFFFFFC
}

// SCROLLBARINFO rgstate flags
[Flags]
public enum SBRgState {
STATE_SYSTEM_AVAILABLE = 0x00000000,
STATE_SYSTEM_UNAVAILABLE = 0x00000001,
STATE_SYSTEM_PRESSED = 0x00000008,
STATE_SYSTEM_INVISIBLE = 0x00008000,
STATE_SYSTEM_OFFSCREEN = 0x00010000,
}

关于c# - 我怎么知道用户何时可以使用强制滚动条滚动 RichTextBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74011830/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com