プロが教える店舗&オフィスのセキュリティ対策術

テキストボックスの上でマウスを動かすと赤い線を描画するプログラムを書きました。

Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove
Dim g As Graphics = sender.CreateGraphics()
g.FillEllipse(Brushes.Red, e.X, e.Y, 5, 5)
End Sub

この方法の場合、フォームが再描画されると書いたものが消えてしまいます。
再描画されても消えなくて、なおかつアプリケーションをいったん終了しても復元できる方法があれば、教えてください。

A 回答 (1件)

やってやれないことは無いですがかなり制限が付くように思います



テキスト描画用と線描画用のBitmapを準備します
dim imgTxt, img as Bitmap

イメージの表示用にPictureBoxをフォームに追加します

重ね具合が TextBox1が下、PictureBox1が上にします
Form_Loadプロシージャに
Try
  ' 前回終了した時点のイメージを取得
  img = Bitmap.FromFile("Draw.bmp")
catch IO.FileNotFoundException
  ' ファイルが無ければ新規作成
  img = new Bitmap( TextBox1.Width, TextBox1.Height )
End Try
PictureBox1.Image = img
' テキスト描画用のBitmapを作成
txtImg = new Bitmap(TextBox1.Width, TextBox1.Height )

Form_Closedイベントで imgをファイルに保存
'新規に保存するためのBitmapを準備
dim tmp as new Bitmap( img.Width, img.Height )
dim g as Graphics = Graphics.FromImage( tmp )
' 保存用のイメージを描画
g.DrawImage( img, 0, 0 )
g.Dispose()
' imgと"Draw.bmp"を切り離す
img.Dispose()
' Draw.imgを削除
IO.File.Delete("Draw.bmp")
' 次回用のイメージを保存
tmp.Save( "Draw.bmp" )

テキストボックスの描画用のプロシージャを準備
Sub myDraText()
  ' 描画用のGraphicsオブジェクトを生成
  dim g as Graphics = Graphics.FromImage( txtImg )
  ' 描画域の初期化
  g.Clear(TextBox1.BackColor)
  ' 文字列描画
  g.DrawString( TextBox1.Text, TextBox1.Font, new SolidBrush( TextBox1.ForeColor), 0, 0 )
  g.Dispose()
  ' 表示用のイメージを生成
  dim bmpDraw as new Bitmap( txtImg.Width, txtImg.Height )
  g = Graphics.FromImage( bmpDraw )
  ' マウスの軌跡のイメージ描画
  g.DrawImage( img, 0, 0 )
  ' テキストイメージの背景色を透明に設定
  txtImg.MakeTransparent( TextBox1.BackColor )
  ' テキストイメージの描画
  g.DrawImage( txtImg, 0, 0 )
  g.Dispose()
  ' 完成したイメージをPictureBoxに設定
  PictureBox1.Image = bmpDraw
End Sub

PictureBox1_MouseMoveイベントで
  Dim g as Graphics = Graphics.FromImage( img )
  g.FillEllipse( Brushes.Red, e.X, e.Y, 5, 5 )
  g.Dispose()
  myDrawText()

TextBox1_TextChangedイベントに
  myDrawText()

といった具合にします

この方法の場合、本来テキストボックスに表示されるキャレット(テキストの挿入位置に現れるカーソル)が描画されません
複数行のテキストボックスの場合 スクロールに対応できません
などの制約が生じます
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!