- ベストアンサー
テキストボックス上でマウスを動かすと赤い線を描画するプログラム
- テキストボックス上でマウスを動かすと赤い線を描画するプログラムを作成しました。
- この方法では、フォームが再描画されても描かれた線が消えないようにすることが目標です。
- また、アプリケーションを終了しても描かれた線を復元する方法も教えていただけると幸いです。
- みんなの回答 (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() といった具合にします この方法の場合、本来テキストボックスに表示されるキャレット(テキストの挿入位置に現れるカーソル)が描画されません 複数行のテキストボックスの場合 スクロールに対応できません などの制約が生じます