当前位置: 首页 > 编程语言 > C#

同步两个RichTextBox的滚动位置?分享

时间:2023-04-11 00:11:45 C#

C#:同步两个RichTextBox的滚动位置?在我的应用程序表单中,我有两个RichTextBox对象。它们将始终具有相同数量的文本行。我想“同步”这两个之间的垂直滚动,这样当用户改变其中一个的垂直滚动位置时,另一个滚动相同的量。我应该怎么办?我不久前为一个小项目做了这个,这是我找到的简单解决方案。创建一个继承RichTextBox的新控件:publicclassSynchronizedScrollRichTextBox:System.Windows.Forms.RichTextBox{publiceventvScrollEventHandlervScroll;publicdelegatevoidvScrollEventHandler(System.Windows.Forms.Messagemessage);publicconstintWM_VSCRoverProcoverProcROLL=0x115;(refSystem.Windows.Forms.Messagemsg){if(msg.Msg==WM_VSCROLL){if(vScroll!=null){vScroll(msg);}}base.WndProc(refmsg);}publicvoidPubWndProc(refSystem.Windows.Forms.Messagemsg){base.WndProc(refmsg);向窗体添加新控件,并且对于每个控件,显式通知控件的其他实例其vScroll位置已更改。像这样:privatevoidscrollSyncTxtBox1_vScroll(Messagemsg){msg.HWnd=scrollSyncTxtBox2.Handle;scrollSyncTxtBox2.PubWndProc(参考消息);我认为如果所有“链接”控件都没有相同数量的可显示行问题,则存在此代码。感谢杰伊的回答;经过一番搜索,我也找到了这里描述的方法。对于任何其他感兴趣的人,我将在下面概述。首先,声明以下枚举:publicenumScrollBarType:uint{SbHorz=0,SbVert=1,SbCtl=2,SbBoth=3}publicenumMessage:uint{WM_VSCROLL=0x0115}publicenumScrollBarCommands:uint{SB_THUMBPOSITION=4}Next,添加对GetScrollPos和SendMessage的外部引用。[DllImport("User32.dll")]publicexternstaticintGetScrollPos(IntPtrhWnd,intnBar);[DllImport("User32.dll")]publicexternstaticintSendMessage(IntPtrhWnd,uintmsg,IntPtrwParam,IntPtrlParam);最后,为适当的RichTextBox的VScroll事件添加一个事件处理程序:nPos在这种情况下,richTextBox2的垂直滚动位置将与richTextBox1同步。[Windows764位安装上的VisualStudioC#2010Express,v10.0.30319]我使用了上面发布的Donut的解决方案,但在滚动到包含多行的RichTextBox的末尾时发现了问题。如果GetScrollPos()的结果>0x7FFF,则在移动nPos时设置最高位。使用生成的wParam变量创建IntPtr将失败并出现OverflowException。您可以使用以下内容轻松测试(第二行将失败):IntPtrip=newIntPtr(0x7FFF0000);IntPtrip2=newIntPtr(0x80000000);使用UIntPtr版本的SendMessage()似乎是一种解决方案,但我无法让UIntPtr工作。所以,我使用以下内容:[DllImport("User32.dll")]publicexternstaticintSendMessage(IntPtrhWnd,uintmsg,UInt32wParam,UInt32lParam);这应该是优秀的0xffff,但后来失败了。我还没有遇到GetScrollPos()的>0xffff结果,并且假设User32.dll不太可能有64位版本的SendCommand(),但是对于这个问题的任何解决方案将不胜感激。在JosephKingry的博文中可以找到Jay的子类方法的变体:在C#中同步多行文本框位置。Joseph的方法也是子类化的,但不需要_VScroll事件处理程序。我将此方法用于3个框之间的3种方式绑定并添加了WM_HSCROLL。以上就是C#学习教程:C#:同步两个RichTextBox的滚动位置?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢