プログラムな日常>C#>
スクロールバーC#版
(the new class of scroll bars in C#)

以前ご紹介したスクロールバーを作ってみましたのC#版です。 スクロールバー自体(MyForm.cs)と、呼び出しプログラム(Scroll.cs)のソースをご紹介しますので、VisualStudio でコンパイルしてみて下さい。 ちなみに、私が使っているのは、暫く更新を怠っているので、Microsoft Visual Studio Community 2019 Version 16.8.5 で、 .Net Framework 4.7.2 です。Windows フォームアプリケーション のプロジェクトを作って下さい。 MyForm.cs と Scroll.cs の2つのファイルだけをプロジェクトに入れ、自動的に作られる他の *.cs ファイルは削除します。
実行時の見た目は以下のような感じです。

外観

【機能表】

scroll の関数:
関数文例
Scroll : コンストラクタnew Scroll();
getbase : 値を得るvar b=scr1.getbase();
setbase : 値を設定scr1.setbase(b);
setwhole : 全体を設定scr1.setwhole(wh); // === whole は base の最大値と view との和 !!!
setview : 視野を設定scr1.setview(v);
setlargechange : 大きな変化量を設定scr1.setlargechange(L);
setinverse : 右や下からなら true 設定scr1.setinverse(false);
setx : 位置(x)設定scr1.setx(20)その他、scr1.Location=new Point(x,y); scr1.SetBounds(x,y,w,h); も普通に使える。
sety : 位置(y)設定scr1.sety(150)
setw : 幅設定scr1.setw(200)その他、scr1.Size=new Size(w,h); scr1.SetBounds(x,y,w,h); も普通に使える。
seth : 高さ設定scr1.seth(25)


scroll のイベント:
イベント伝達の原因文例対応ハンドラ
BaseChangedMechanicalマウス操作(スクロールとクリック)のみscr1.BaseChangedMechanical(o, i)=>{ ... }); それぞれ第2引数は intOnBaseChangedMechanical
BaseChangedAnywayマウス操作(スクロールとクリック)および set** 関数 (setbase, setwhole, setview) scr1.BaseChangedAnyway(o, i)=>{ ... }); OnBaseChangedAnyway
BaseChangedByCodeset** 関数 (setbase, setwhole, setview)のみscr1.BaseChangedByCode => (o, i)=>{ ... }); OnBaseChangedByCode


【イベントを自作して考えたこと】

C# の既成のクラスでは、ほとんどの場合、イベントとイベントハンドラの両方が用意されている。 例えば、Paint というイベントと、オーバーライド可能な OnPaint というハンドラとがある。 しかし、利用する都合で言えば、このどちらかを使えばほぼ同じ機能を果たせる。 それならどうして両方が用意されているのか、長らく疑問だった。
それが、どうもこれは C# システムの基本設計に関係することが見えてきた。 Paint といったイベントを用意しても、これにハンドラが全く付かない状態でイベントが発生すると C# ではエラーを生じる。 このイベントは Invalidate や Refresh がコールされた場合などに普通に起こる。 だから、イベントには少なくとも1つのハンドラを最初から付けておかないと、色々面倒なのである。 その最初のハンドラとして OnPaint などが用意されていると考えられる。 ただ、どうしてそのような基本設計になったかはやはり不明である。


【ソースコード】

MyForm.cs(C#: スクロールバーのデモ):


Scroll.cs(C#: スクロールバー自体):