这两天在做一个类似于记事本的浏览功能,要用到滚动条,我刚开始本来想直接用滚动条控件的,一番操作下来,发现自带滚动条好像不能根据当前篇幅所占比例去调整滑块大小(也可能是我没整明白)。索性不用了,自己画了滚动条,然后与一个PictureBox进行交互操作了。
简述下原理:PictureBox只是个小窗口,只显示窗口这个范围,我设置的整个文本尺寸可以远大于窗口的尺寸,所以我通过移动滚动条,实现让这个小窗口不断移动,能看到文本不同位置的内容了。
废话少说,先看代码:
一、设置文本尺寸大小
double MaxRectWidth = 3000; //文本最大宽度
double MaxRectHeight = 3000; //文本最大高度
UserVScrollBar vScrollBar; //自定义滚动条
二、根据文本显示窗口尺寸设置滚动条滑块大小(通过比例)
private void Form1_SizeChanged(object sender, EventArgs e)
{
if (vScrollBar != null)
{
CalculateCoordinate.InitRect(pictureBox1.Width, pictureBox1.Height);
vScrollBar.SetHeightRate((double)pictureBox1.Height / MaxRectHeight);
}
}
三、滚动条移动时的显示处理
public void UpdateRectY(double rateY)
{
CalculateCoordinate.SetRectY((float)(MaxRectHeight * rateY));
pictureBox1.Refresh();
}
四、坐标计算转化类CalculateCoordinate.cs
public static class CalculateCoordinate
{
static float RectX;
static float RectY;
static float RectWidth = 500;
static float RectHeight = 500;
public static void SetRectX(float rectX)
{
RectX = rectX;
}
public static void SetRectY(float rectY)
{
RectY = rectY;
}
public static void InitRect(float rectW, float rectH)
{
RectX = 0;
RectY = 0;
RectWidth = rectW;
RectHeight = rectH;
}
public static void PosToScreen(PointF pos, out PointF scr_pos)
{
scr_pos = PointF.Empty;
scr_pos.X = pos.X - RectX;
scr_pos.Y = pos.Y - RectY;
}
public static void ScreenToPos(PointF scr_pos, out PointF pos)
{
pos = PointF.Empty;
pos.X = scr_pos.X + RectX;
pos.Y = scr_pos.Y + RectY;
}
}
五、效果
初始效果:
左边是测试的三行字,右边是自定义的滚动条,滑块大小是根据当前文本窗口高度壁上设置的最大高度比例换算的。
点击一次滚动条向下的效果:
第一行字已经向上走了,幅度虽然有点小,但是可以设置的。当然,如果直接移动滑块,幅度就很大了。这样就简单的实现了浏览功能。
有部分代码没有贴上来,包括:三行字体的绘制部分和自定义滚动条的实现代码。
自定义滚动条在我资源里有,有不明白的地方可以找我。