【问题标题】:Disable RichTextBox zooming while scrolling with ctrl key使用 ctrl 键滚动时禁用 RichTextBox 缩放
【发布时间】:2020-12-31 20:46:54
【问题描述】:

我在我的 c# 应用程序中使用 RichTextBox,我想在使用 ctrl 键滚动光标时禁用 RichTextBox 缩放,如何禁用它?请帮忙。

【问题讨论】:

  • 请提供您目前的研究

标签: c# winforms richtextbox


【解决方案1】:

您可以覆盖自定义RichTextBox 控件的WndProc 并过滤WM_MOUSEWHEEL 消息。然后重新定义wParam内容值(该值报告当时按下了哪个鼠标按钮组合),将其设置为0IntPtr.Zero)。

然后,让您知道您已处理此消息,返回 m.Result0 (IntPtr.Zero)。
(有关此问题,请参阅 WM_MOUSEWHEEL 消息中的文档)。

要对其进行测试,请创建一个新类并用此代码替换其内容(Namespace 除外)。构建解决方案/项目。在您的 ToolBox 中找到 RTBNoZoom 控件并将其拖放到表单上。

using System;
using System.Windows.Forms;

public class RTBNoZoom : RichTextBox
{
    private const int MK_CONTROL = 0x0008;
    private const int WM_MOUSEWHEEL = 0x020A;

    public RTBNoZoom() { }

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_MOUSEWHEEL:
                if (((int)m.WParam & MK_CONTROL) == MK_CONTROL)
                {
                    m.WParam = IntPtr.Zero;
                    m.Result = IntPtr.Zero;
                }
                break;
            default:
                break;
        }
        base.WndProc(ref m);
    }
}

或者,如果您尚未覆盖 WndProc,则可以覆盖 OnMouseWheel,然后将其 MouseEventArgs 参数转换为 HandledMouseEventArgs,将其 Handled 属性设置为 true .

protected override void OnMouseWheel(MouseEventArgs e)
{
    if ((ModifierKeys & Keys.Control) != 0) {
        ((HandledMouseEventArgs)e).Handled = true;
    }
    else {
        base.OnMouseWheel(e);
    }
}

【讨论】:

  • 如果可行,您可以将原始 RTB 保留在表单上,​​从 NativeWindow 派生,然后使用 AssignHandle()similar example here 将 RTB 中的句柄分配给 NativeWindow。跨度>
【解决方案2】:

为richtextbox ContentsResized 事件创建一个事件处理程序。其中,输入

private void richTextBox1_ContentsResized(object sender, ContentsResizedEventArgs e)
    {
        richTextBox1.ZoomFactor = 1.0f;
    }

【讨论】:

    【解决方案3】:

    您可以使用 MOUSEWHEEL 命令和 control.modifiers 属性来控制应用程序的缩放。

    protected override void DefWndProc(ref Message m)
    {
        if (m.Msg == WM_MOUSEWHEEL && Control.ModifierKeys == Keys.Control)
        {               
        // Do what you want here            
        }
        else
        {
        base.DefWndProc(ref m);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2010-10-07
      • 2011-05-31
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2012-02-24
      相关资源
      最近更新 更多