私はc#で小さなペイントプログラムを実行しようとしています。これまでのところ、すべてが正常に機能しています。唯一のことは、マウスを十分に速く動かすと、実線があるはずの場所にギャップが表示されることです。ダブルバッファリングからmouse_moveイベントの間隔を短くするまで、すべてを試しました(実際には、これを行う方法が見つかりませんでした。システム上の他のプロセスにも悪いと思います^^)
ここで私を正しい方向に向けてくれませんか?パネルのペイント方法をオーバーライドしようとしましたが、これを試しても何も起こらないようです。
コードは次のとおりです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Paint
{
public partial class Form1 : Form
{
bool paint;
SolidBrush color;
//size of brush
int pinselGröße;
List<Point> pointListe;
public Form1 ()
{
InitializeComponent ();
pointListe = new List<Point>();
paint = false;
color = new SolidBrush ( Color.Black );
//get brush size from combobox
pinselGröße = Convert.ToInt32 ( nudBrushSize.Value );
}
private void btnExit_Click ( object sender, EventArgs e )
{
this.Close ();
}
private void btnClear_Click ( object sender, EventArgs e )
{
Graphics gfx = pnlCanvas.CreateGraphics ();
gfx.Clear ( pnlCanvas.BackColor );
}
private void pnlCanvas_MouseDown ( object sender, MouseEventArgs e )
{
paint = true;
Graphics grfx = pnlCanvas.CreateGraphics ();
//draw a rectangle with brush "color" and pinselGröße as the brush size
grfx.FillRectangle ( color, e.X, e.Y, pinselGröße, pinselGröße );
}
private void pnlCanvas_MouseMove ( object sender, MouseEventArgs e )
{
if ( paint )
{
//Graphics grfx = pnlCanvas.CreateGraphics();
////put old position of mouse into variable
//int altePosX = e.X;
//int altePosY = e.Y;
////grfx.FillEllipse ( color, e.X, e.Y, pinselGröße, pinselGröße );
//grfx.FillRectangle(color, e.X, e.Y, pinselGröße, pinselGröße);
//grfx.Dispose();
pointListe.Add(e.Location);
pnlCanvas.Invalidate();
}
}
private void pnlCanvas_Paint(PaintEventArgs e)
{
e.Graphics.DrawLines(new Pen(color), pointListe.ToArray());
}
private void pnlCanvas_MouseUp ( object sender, MouseEventArgs e )
{
paint = false;
}
private void nudBrushSize_ValueChanged ( object sender, EventArgs e )
//when value of combobox changes, read value into brush size variable
pinselGröße = Convert.ToInt32 ( nudBrushSize.Value );
}
private void cmbColor_SelectedIndexChanged ( object sender, EventArgs e )
{
int index = cmbColor.SelectedIndex;
color.Dispose ();
switch ( index )
{
case 0:
{
color = new SolidBrush ( Color.Black );
break;
}
case 1:
{
Console.WriteLine ( "Geht" );
color = new SolidBrush ( Color.Red );
break;
}
case 2:
{
color = new SolidBrush ( Color.Blue );
break;
}
case 3:
{
color = new SolidBrush ( Color.Green );
break;
}
}
}
}
}
私がこのようにそれをするとき:
private void pnlCanvas_MouseMove ( object sender, MouseEventArgs e )
{
if ( paint )
{
Graphics grfx = pnlCanvas.CreateGraphics();
////put old position of mouse into variable
int altePosX = e.X;
int altePosY = e.Y;
//grfx.FillEllipse ( color, e.X, e.Y, pinselGröße, pinselGröße );
grfx.FillRectangle(color, e.X, e.Y, pinselGröße, pinselGröße);
grfx.Dispose();
//pointListe.Add(e.Location);
//pnlCanvas.Invalidate();
}
}
//private void pnlCanvas_Paint(PaintEventArgs e)
//{
// Console.Write("mjsda2");
// e.Graphics.DrawLines(new Pen(color), pointListe.ToArray());
//}
私はこれを手に入れます: