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)
{
}