RichTextBox知识--让我们的行号随滚动条滚动起来

2009年1月7日星期三

RichTextBox知识--让我们的行号随滚动条滚动起来

我们新建一个类,他继承自RichTextBox,取名“adaLineIdTxt ”。
我们知道Windows事件处理都是消息机制,你触动键盘、拖动鼠标、拖动滚动条,都会触发消息。拖动滚动条?消息?对,拖动滚动条的消息就是“Message.Msg”里的“WM_HSCROLL = 0x0114”和“WM_VSCROLL = 0x0115”。只要我们捕获到这两个消息,就可以控制拖动滚动条的滚动了。

首先,我们定义一个委托
public delegate void SendMessage(Message poMsg);
光有委托不行,我们还得定义一个事件
public event SendMessage SendMessageEvent;

以上做好之后,我们还需要重载WndProc方法。
protected override void WndProc(ref Message m)
{
if ( m.Msg == WM_VSCROLL)
{
if (SendMessageEvent != null)
{
SendMessageEvent(m);
}
}
base.WndProc(ref m);
}

//如果拖动滚动条是垂直方向(因为这里只让行号滚动,所以只有垂直方向),就触发消息。
定义一个滚动方法。
public void Scroll(Message poMsg)
{
if (this.Handle != null)
{
poMsg.HWnd = this.Handle;
WndProc(ref poMsg);
}
}
这样,我们的行号随滚动条滚动的功能就基本上实现了。下面是完整代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace AdaEniac
{
public delegate void SendMessage(Message poMsg);
public partial class adaLineIdTxt : RichTextBox
{
private int WM_HSCROLL = 0x0114;
private int WM_VSCROLL = 0x0115;
public event SendMessage SendMessageEvent;
public adaLineIdTxt()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
if ( m.Msg == WM_VSCROLL)
{
if (SendMessageEvent != null)
{
SendMessageEvent(m);
}
}
base.WndProc(ref m);
}
public void Scroll(Message poMsg)
{
if (this.Handle != null)
{
poMsg.HWnd = this.Handle;
WndProc(ref poMsg);
}
}
}
}

需要说明的是,我前天写的“RichTextBox知识--为RichTextBox添加行号”需要做部分修改。将“_LineId”换成“adaLineIdTxt ” 类型。然后,还需“AdaScrollRichTextBox ”要在里增加一个方法
public void LineIdScroll(Message poMsg)
{
if (poMsg.Msg == (int)wm.WM_VSCROLL)
{
_LineId.Scroll(poMsg);
}
}

在你使用该控件“AdaScrollRichTextBox ”的时候,需要调用其“SendMessageEvent”事件。在该事件里,可以让行号随滚动条滚动起来。

如例private void txtView_SendMessageEvent(Message poMsg)
{
this.txtView.LineIdScroll(poMsg);
}

至此,我们为RichTextBox增加的行号已经可以随滚动条的滚动而滚动了。但是还是存在些问题,什么问题呢?

那就是滚轮滑动时,行号没滚动。呵呵,我明天继续写...

0 评论:

发表评论