C# [フォーム・コントロール]

フォームはWindows アプリのダイアログウィドウの別称です。フォームは最初から出来上がったコンポーネントの 一つであり、プロパティを設定してカスタマイズ出来たり、別のコントロールや独自のイベントハンドラを追加したり します。
更新日 2016-02-13

フォーム

C# でWindows アプリを作る際は、フォームとよばれるシンプルなダイアログをベースにします。

プロパティ

フォームはカスタマイズ可能であり、それらはプロパティへの変更を通じて反映されます。

イベントハンドラ

各種のイベントに対してハンドラを設定できます。デリゲートにより複数のハンドラを設定したり、別のインスタンスの メソッドをコールする事もできます。しかも動的に!(エレガント!!)
C# ではフォーム上に配置したコントロールのイベントハンドラ(コールバック関数)もまた、親フォームのクラスのメソッドとして 記述されます。

コントロール

フォームに貼り付けるだけで使えるのが便利なコントロールです。C#になって便利に使えるようになった非ビジュアル コンポーネントも多く魅力的です。

ビジュアルコントロール コンポーネント

エディットボックスやコンボボックスの類は見慣れたものです。フォーム同様プロパティを通じてかなり自由に改変できます。 イベントもデリゲートを通じてハンドリング可能です。このデリゲート機能のおかげで、イベントハンドラを記述するために わざわざ派生クラスを作る必要もなくなってます(親フォームのクラスに記述する)。開発環境では、実際キー入力を必要とせずに イベントハンドラの雛形までがサクサク自動で生成できます。後は処理を書くだけなんだから、大変に便利!

非ビジュアル コントロール コンポーネント

データベースの接続であったり、イベントハンドラをワーカースレッドで呼び出したり、ファイル更新イベントを捕らえるといった 多種多様な機能がコンポーネント化されています。これらの貼り付け場所はフォームとは別にあり、見分けやすくなってます。

Drag and Drop

ドラッグアンドドロップを実装します。

実装

ドロップを受け付けるコントロールのAllowDrop 属性をtrue にします。イベントハンドラDragEnter, DragDrop を実装します。DragEnter でe.Effect を設定しないと、 カーソルの変化やDragDrop イベントは発生しません。
// エクスプローラーからのファイルドロップを処理する(ここではファイルが1つの時に限定)
private void m_textBox1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        String[] vecFile = (String[])e.Data.GetData(DataFormats.FileDrop);
        if (vecFile.Length == 1)
        {
            e.Effect = DragDropEffects.All;
        }
    }
}

private void m_textBox_EditMain_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        String[] vecFile = (String[])e.Data.GetData(DataFormats.FileDrop);

        this.m_textBox_EditMain.Text = vecFile[0];
    }
}

カスタムイベントの実装

ListView でスクロールイベントを受け取る

なぜかC# のListView ではスクロールイベントを処理できません。これをハンドリングしたいと思います。
// ListView を継承したクラス
public class BufferedListView : ListView
{
    private const int WM_VSCROLL = 0x115;

    protected override bool DoubleBuffered { get { return true; } set { } }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        if (m.Msg == WM_VSCROLL)
        {
            OnVScroll(new EventArgs());
        }
    }
        
    public event EventHandler VScroll;
    public virtual void OnVScroll(EventArgs e)
    {
        if (VScroll != null)
        {
            VScroll(this, e);
        }
    }
}
WndProce でメッセージを処理できますので、WM_VSCROLL を捉えたら イベントを発生させます。イベントハンドラへのコールバック関数の追加や実装は、 いつものようにTAB キーでもってポンポンポンと自動作成できます。
this.m_BufferedListView.VScroll += m_BufferedListView_VScrollEvent;

void m_BufferedListView_VScrollEvent(object sender, EventArgs e)
{

}