文字列を追加します。文字列を画像にして追加してもいいのですが、拡大・縮小を繰り返すと画像が劣化してしまうので文字列は文字列として管理することにします。

文字列を描画するときに必要なものは、描画したい文字列のほかにフォント、色、描画位置、回転する角度です。そこで以下のようなクラスを作成します。

BitmapEx.GetBitmapRotateString(string str, Font font, Color color, int angle)メソッドは文字列、フォント、カラー、角度(度数法)からBitmapを取得するためのものです。

メニューで[文字列を挿入する]を選択するとダイアログが表示され、描画したい文字列に関する設定ができるようになります。

ではFormInsertStringクラスはどうなっているのでしょうか?

ShowImageString()メソッドはBitmapEx.GetBitmapRotateStringメソッドを呼び出すことで描画したい文字列のBitmapをフィールド変数Bitmapに格納するものです。このときBitmapのサイズが表示されます。

以下は生成されたBitmapをForm1に仮表示するためのメソッドです。Form1クラスのForm2_TemporaryFixingLayerメソッドが呼び出されて全体がどのようになるのかを確認できます。

MoveLayer()メソッドは、すでに仮表示がおこなわれているときにダイアログで変更がおこなわれると仮表示されているレイヤーを移動させるメソッドです。

[レイヤーの位置を確定する]ボタンをクリックするとレイヤーの位置が確定し、ダイアログが閉じます。このときにレイヤーがまだ生成されていないのであれば生成し、すでに存在するのであればその内容を変更します。そのあとForm1クラスのForm2_FixedLayerメソッドが呼び出され、Form1のピクチャーボックスに新しいBitmapが表示されます。

もし確定しない状態でダイアログを閉じようとすると、ダイアログで設定した値を反映させるかどうかを確認するメッセージボックスが表示されます。

[オリジナルサイズに戻す]をクリックすると元のサイズに戻ります。

テキストボックスに文字列を入力すると描画されるBitmapが表示されます。またボタンをクリックすることで使用するフォントや色の指定ができます。そしてレイヤーがすでに追加されている状態であれば変更がForm1側にも反映されます。

アップダウンコントロールの値が変化した場合も同様にShowImageString()メソッドとMoveLayer()メソッドが呼び出されて処理がおこなわれます。

Form1のメニューで[レイヤーの編集]のドロップダウンメニューが選択されると、そのレイヤーがStringLayerの場合、FormInsertStringダイアログが表示されます。このときはすでに組み込まれているレイヤーの情報を表示させます。

この場合はすでに存在するレイヤーの情報を表示させるためにFormInsertStringクラス側でも以下の処理が必要です。

さて、このプログラムには問題があります。FormInsertStringダイアログの表示サイズを変更しようとしても変更することができません。アップダウンコントロールの値を変更するとShowImageString()メソッドが実行されるため、変更しようとした値が強制的に元の値に戻されてしまいます。

さてどうしたものか?