吵吵   2015-08-26  阅读:1,034

C#做一个自定义控件真的是方便啊,如果你在delphi年代做自定义控件做的习惯了,那么告诉你,c#也是一样的啦,你可以很方便的入手了。

继承和GDI让自绘图形界面的控件变成了一件so easy的事情!

1、先了解一下c#自定义控件怎么做吧:

选中VS中右侧的项目,右键添加“新建项”,选择“自定义控件”,然后输入控件的名称,那么c#就会给你生成如下的代码:

public partial class CustomControl1 : Control
{
public CustomControl1()
{
InitializeComponent();
}

protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
看的懂么?一个构造函数,另外一个是重载OnPaint,即绘制界面的函数,想一想你做的是一个什么样的控件,慢慢画吧。

2、事件。事件是什么?事件是一个带参数的委托!既然是委托就会有订阅者和被订阅者,对于一个滚动条来说,我们只需要一个事件,就是滚动,并且只需要把滚动到哪个位置的参数告诉它的拥有者就可以了。因此其它的控件就是滚动条的订阅者,订阅的是滚动条的滚动事件。也因此,event的拥有者就是滚动条,它把订阅者的函数不断地+=进来:
定义事件的参数:
public class ScrollEventArgs
{
private int value;
public int Value
{
get { return value; }
}

public ScrollEventArgs(int value)
{
this.value = value;
}
}
在滚动条中定义可以订阅的事件:

public delegate void ScrollEventHandler(object sender, ScrollEventArgs e);
public event ScrollEventHandler Scroll;
那么其它控件如何(订阅)响应这个事件呢?

verticalScroll = new VerticalScroll();

verticalScroll.Scroll += new VerticalScroll.ScrollEventHandler(VerticalScrollOnScroll);

3、滚动条的实现逻辑:

A、重载OnMouseDown事件,定义一个IsMouseDonw的属性来记录鼠标按下状态。

B、如果在按下状态还有OnMouseMove的话,计算拖拽的Y坐标,并将滚动条移动相应的距离。

C、有拖拽的话,还要触发OnScroll的事件,通知订阅的控件。

有一个问题是滚动条的Y坐标和控件的Y坐标是如何计算的?对应的去想就好了:

控件的高度(即可以显示的高度)CH 对应的就是滚动条的高度 VH。

控件的隐藏内容的高度 CTH-CH 对应的就是滚动条空白部分的高度 CH-VH。

了解了这一点,按照比例换算即可。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

3条回应:“c#自定义控件之滚动条怎么做?”

  1. 尘埃也不懂说道:

    博主 你好,无意间看到你的博客,很佩服你一直在坚持。还有想请教你一个问题,我打算明年转行安卓开发,零基础,非科班,现在正在自学java,不知道转这条路好不好,能帮我出点建议吗 谢谢

  2. 吵吵说道:

    学过其它语言转java不是分分钟的事情么?想做去做就是。

发表评论

电子邮件地址不会被公开。 必填项已用*标注