2009-10-08 28 views

答えて

0

画像ボックスのmousemoveイベントをキャプチャして、画像ボックスから画像を取得します。

グラフィックg = pictureBox.CreateGraphics(); 次に、このグラフィックスオブジェクトを使用して描画したいものを描画することができます。

+0

Eeeeep、神なし!この方法でちらつきのあるグラフィックスが得られます。私が知っている.CreateGraphics()の唯一の用途は文字列を測定することです。代わりにOnPaintをオーバーライドする必要があります。 – Quibblesome

+0

を使用するか、.Imageプロパティを使用します。カスタム描画を行うつもりなら、私はPictureboxを完全になくし、Controlから継承します。 – Quibblesome

20

フォームにPictureBoxを配置し、BackColorを白に設定します。

private Point? _Previous = null; 
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    _Previous = e.Location; 
    pictureBox1_MouseMove(sender, e); 
} 
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_Previous != null) 
    { 
     if (pictureBox1.Image == null) 
     { 
      Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       g.Clear(Color.White); 
      } 
      pictureBox1.Image = bmp; 
     } 
     using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 
     { 
      g.DrawLine(Pens.Black, _Previous.Value, e.Location); 
     } 
     pictureBox1.Invalidate(); 
     _Previous = e.Location; 
    } 
} 
private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
{ 
    _Previous = null; 
} 

そして離れて描く:次に、(あなたが実際に以下のマウスイベントをフックする必要があり、すなわち、あなただけコピーして、フォームにこのコードを貼り付けることはできません)フォームにこのコードを追加します!

GraphicsオブジェクトのSmoothingModeプロパティを設定することで、描画されたイメージの品質をいくらか向上させることができます。

更新:ネットCFがPensコレクションを持ってdoes't、およびMoustEventArgsLocationを持っていないので、ここでCFに適したバージョンである:ここで

private Point? _Previous = null; 
private Pen _Pen = new Pen(Color.Black); 
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    _Previous = new Point(e.X, e.Y); 
    pictureBox1_MouseMove(sender, e); 
} 
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_Previous != null) 
    { 
     if (pictureBox1.Image == null) 
     { 
      Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       g.Clear(Color.White); 
      } 
      pictureBox1.Image = bmp; 
     } 
     using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 
     { 
      g.DrawLine(_Pen, _Previous.Value.X, _Previous.Value.Y, e.X, e.Y); 
     } 
     pictureBox1.Invalidate(); 
     _Previous = new Point(e.X, e.Y); 
    } 
} 
private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
{ 
    _Previous = null; 
} 
+0

助けていただきありがとうございますが、ペンとe.locationを知らないエラーが発生しました – Gold

+0

@Gold:CFにはPensコレクションがなく、MouseEventArgsにはこのメソッドのCFフレンドリーバージョンが追加されましたaロケーション(ちょうどXとY) – MusiGenesis

+0

+1、短く、あまりよく言われていない質問への長い、詳細な答え。 :) – JYelton

2

、pictureBox1 ==署名。私は、このようにVBに翻訳:

グローバル:

Dim _previous As Point = Nothing 
Dim _pen As Pen = New Pen(Color.Black) 
Dim drawing As Boolean = False 


''' <summary> 
''' This handles the signature drawing events (drawing) 
''' </summary> 
''' <param name="sender"></param> 
''' <param name="e"></param> 
''' <remarks></remarks> 
Private Sub signature_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles signature.MouseMove 
    If drawing = True Then 
     If signature.Image Is Nothing Then 
      Dim bmp As Bitmap = New Bitmap(signature.Width, signature.Height) 

      Using g As Graphics = Graphics.FromImage(bmp) 
       g.Clear(Color.White) 
      End Using 

      signature.Image = bmp 
     End If 

     Using g As Graphics = Graphics.FromImage(signature.Image) 
      g.DrawLine(_pen, _previous.X, _previous.Y, e.X, e.Y) 
     End Using 
     signature.Invalidate() 
     _previous = New Point(e.X, e.Y) 
    End If 
End Sub 

''' <summary> 
''' this indicates somebody is going to write a signature 
''' </summary> 
''' <param name="sender"></param> 
''' <param name="e"></param> 
''' <remarks></remarks> 
Private Sub signature_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles signature.MouseDown 
    _previous = New Point(e.X, e.Y) 
    drawing = True 
    signature_MouseMove(sender, e) 

End Sub 

''' <summary> 
''' the signature is done. 
''' </summary> 
''' <param name="sender"></param> 
''' <param name="e"></param> 
''' <remarks></remarks> 
Private Sub signature_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles signature.MouseUp 
    _previous = Nothing 
    drawing = False 
End Sub 
関連する問題