gpt4 book ai didi

c# - 在 Richtextbox 上禁用平滑滚动

转载 作者:太空狗 更新时间:2023-10-30 01:07:55 27 4
gpt4 key购买 nike

我有一个标签,它根据 RichTextBox 上的文本来标记行号。我 Hook 了 Vscroll 的事件来处理标签。

private void rtbLogicCode_VScroll(object sender, EventArgs e)
{
Point pt = new Point(0, 1);
int firstIndex = rtbLogicCode.GetCharIndexFromPosition(pt);
int firstLine = rtbLogicCode.GetLineFromCharIndex(firstIndex);

pt.X = ClientRectangle.Width;
pt.Y = ClientRectangle.Height;
int lastIndex = rtbLogicCode.GetCharIndexFromPosition(pt);
int lastLine = rtbLogicCode.GetLineFromCharIndex(lastIndex);

// Small correction
if (rtbLogicCode.Text.EndsWith("\n"))
lastLine++;

labelLogicCode.ResetText();
LabelLineNum(firstLine+1,lastLine);
}
#endregion

private void LabelLineNum(int startNum, int lastNum)
{
labelLogicCode.Font = UIConstant.DDCLogicCodeFont;
for (int i = startNum; i < lastNum; i++)
{
labelLogicCode.Text += i + Environment.NewLine;
}
}

除了 RichTextBox 使用平滑滚动功能外,一切似乎都正常工作,在许多情况下,用户没有一直滚动到下一行,这会搞乱我的行号。这会导致行号与 RichTextBox 上显示的实际文本不同步。

最后,我需要禁用平滑滚动功能来完成此操作。有人告诉我,您可以覆盖 RichTextBox 的 postMessage API 以禁用上述功能,但在搜索了许多文档后,我找不到任何好的文档。

如果解决方案尽可能详细地说明如何禁用平滑滚动功能,我将不胜感激。谢谢。

最佳答案

这是一个 VB example来自 Microsoft,建议您需要拦截 WM_MOUSEWHEEL 消息。

这是一个用 C# 编写的快速原型(prototype):

class MyRichTextBox : RichTextBox {

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(
IntPtr hWnd, // handle to destination window
uint Msg, // message
IntPtr wParam, // first message parameter
IntPtr lParam // second message parameter
);

const uint WM_MOUSEWHEEL = 0x20A;
const uint WM_VSCROLL = 0x115;
const uint SB_LINEUP = 0;
const uint SB_LINEDOWN = 1;
const uint SB_THUMBTRACK = 5;

private void Intercept(ref Message m) {
int delta = (int)m.WParam >> 16 & 0xFF;
if((delta >> 7) == 1) {
SendMessage(m.HWnd, WM_VSCROLL, (IntPtr)SB_LINEDOWN, (IntPtr)0);
} else {
SendMessage(m.HWnd, WM_VSCROLL, (IntPtr)SB_LINEUP, (IntPtr)0);
}
}

protected override void WndProc(ref Message m) {
switch((uint)m.Msg) {
case WM_MOUSEWHEEL:
Intercept(ref m);
break;
case WM_VSCROLL:
if(((uint)m.WParam & 0xFF) == SB_THUMBTRACK) {
Intercept(ref m);
} else {
base.WndProc(ref m);
}
break;
default:
base.WndProc(ref m);
break;
}
}
}

关于c# - 在 Richtextbox 上禁用平滑滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11100569/

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