前回までスクロールバー付きのピクチャーボックスを作成して改造してきました。今回はこれを使った簡単なアプリをつくります。

ピクチャーボックスにスクロールバーをつけて拡大縮小表示もできるようにする

どんなアプリかというと、左側のスクロールバー付きのピクチャーボックス(ScrollPictureBox)に画像ファイルをドラッグアンドドロップすると画像が表示されます。左側のピクチャーボックスをドラッグアンドドロップすると矩形が表示され、その部分が右側に送られます。

右側のスクロールバー付きのピクチャーボックスに画像が表示されるとトリミングで上下左右の切り捨てられた部分の長さとトリミングで得られた画像の幅、高さが表示されます。またトリミングできる部分はアップダウンコントロールでも設定できます。アップダウンコントロールの値がユーザーによって変更されるとトリミングされた画像が表示されます。

・・・というサンプルアプリ以上の何物でもないシンプルなアプリです。

左の黒枠部分がトリミングされています。また左と右では拡大率を変えていますが、うまくトリミングできていることがわかります。

最初にコンストラクタのなかで、イベントハンドラの設定と各コントロールに適切な値をいれます。

それでは最初に画像ファイルがドラッグアンドドロップされたら左のスクロールバー付きのピクチャーボックスに画像を表示させる処理を示します。

次に左側のスクロールバー付きのピクチャーボックス上でドラッグによって選択範囲が確定したときの処理を追加します。

ここではトリミングされた画像を右側のスクロールバー付きピクチャーボックスに表示させます。このときに元の画像から切り落とされた上下左右の長さも表示させます。あとコンストラクタのなかでFullScaleBitmapChangedイベントに対応できるようにしているので、別のイベントハンドラによって画像のサイズも表示されます。

上記の処理でSetNumericUpDownValue(NumericUpDown num, int value)という自作メソッドを呼び出しています。アップダウンコントロールには上限下限の値があり、これを超える値がセットされると例外が発生します。以下でそうならないための処理をしています。

GetNumericUpDownValue(NumericUpDown num)メソッドはNumericUpDown.Valueで得られた値をint型にキャストするのが面倒くさい、ただそれだけでつくられたメソッドです。

左右のスクロールバー付きのピクチャーボックスの下にある表示倍率を示すアップダウンコントロールの値が変更されたときに対応するためのものです。ScrollPictureBox.Expansionrateプロパティを変更しているだけです。

トリミングに関するアップダウンコントロールの値は左側のピクチャーボックスをドラッグしたときだけでなく、ユーザー自身が変更することもできます。この場合はトリミングされたBitmapを求めたあと、これを右側のスクロールバー付きのピクチャーボックスに表示させます。

上下左右の4つのアップダウンコントロールがありますが、やることは全部同じなのでOnNumericUpDownMarginChange()メソッドを作成して、ここで処理をしています。

またユーザーによって変更されたのか、プログラムによって変更されたかはアップダウンコントロールがアクティブかどうかで区別できます。イベントハンドラ NumericUpDownMarginRight_ValueChanged(object sender, EventArgs e)などでは、アップダウンコントロールがアクティブである場合にのみ、OnNumericUpDownMarginChange()を呼び出しています。

最後に左右のスクロールバー付きのピクチャーボックスのFullScaleBitmapプロパティが変更されたら、変更されたサイズを表示しなければなりません。これはScrollPictureBox.FullScaleBitmapChangedイベントを処理すれば簡単にできます。