2016-11-17 4 views
1

私はユーザーがフォームにペンでペイントできるプログラムをコーディングしました。 しかし問題があります。塗料の色を変更する

私は、2色をちょうど2色に設定できます。左ボタンには黒色、右ボタンには赤色を設定します。

私が必要とするのは、このコードをユーザーが自分の色を選択できるコードに変更する方法です。

私はカラーダイアログのようにさまざまな方法を試しましたが、できませんでした。

マイコード:

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     Graphics graphic = this.CreateGraphics(); 
     graphic.DrawLine(Pens.Black, e.X, e.Y, e.X + 1, e.Y + 1); 
    } 

    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
    { 
     Graphics graphic = this.CreateGraphics(); 
     graphic.DrawLine(Pens.Red, e.X, e.Y, e.X + 1, e.Y + 1); 
    } 
} 
+0

'CreateGraphics'とは何ですか?オフスクリーンバッファにペイントしていない場合は、ウィンドウのクライアント領域が無効になったときにユーザーのアートワークが失われます。 – Dai

+0

@Dai i Know 私はこのコードを、自分の色を選択できるコードに変更しようとしています。 私がプロジェクトを始めたとき、このコードはまさに私が望むものでした。ペンのちょうど色... – VorTex318

+2

Winformsのグラフィックスの基本的なルール#1: 'control.CreateGraphics'を使用しないでください! 'Graphics'オブジェクトをキャッシュしないでください! 'Graphics.g = Graphics.FromImage(bmp)'を使って 'Bitmap bmp'に描画するか、' e.Graphics'パラメータを使ってコントロールの 'Paint'イベントに描画します。すべてのコントロールを描画する必要がありますあなたがコントロールすることができない時代には、したがって、これらのサーフェスに追加したいのは、システムが呼び出すイベント(Paintイベント)から作成する必要があります。 – TaW

答えて

1

if (_leftPen != null) { _leftPen.Dispose(); } 
_leftPen = new Pen(selectedColour, 1f); 

すなわち1fの厚さであることをマウスの左ボタンと右ボタンの色を選択し、クラスレベル変数にそれを保存するためにいくつかのダイアログを使用しますPen、これはあなたの要件を満たすために変更することができます。

あなたの描画方法では_leftPenを使用してください。次に右マウスボタンに同様のロジック、つまり_rightPenを適用します。あなたはそれを持っています:

private Pen _leftPen = Pens.Black; 
private Pen _rightPen = Pens.Red; 

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     Graphics graphic = this.CreateGraphics(); 
     graphic.DrawLine(_leftPen, e.X, e.Y, e.X + 1, e.Y + 1); 
    } 

    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
    { 
     Graphics graphic = this.CreateGraphics(); 
     graphic.DrawLine(_rightPen, e.X, e.Y, e.X + 1, e.Y + 1); 
    } 
} 

あなたがする必要があるのは、ユーザーが自分の色を選択する方法を見つけることです。

Winformsのグラフィックスの基本的なルール#1:control.CreateGraphicsを使用しないでください

また@Tawによってコメントを注意してください! Graphicsオブジェクトをキャッシュしないでください!グラフィックスg = Graphics.FromImage(bmp)を使用してビットマップbmpに描画するか、コントロールのペイントイベントでe.Graphicsパラメータを使用して描画します。システムは、すべてのコントロールのサーフェスを描画できません。コントロール;したがって、これらのサーフェスに追加したいのは、システムが呼び出す1つのイベント(Paintイベント)から作成する必要があります。

あなたはPaintイベントで、あなたが後でこれを更新し描きたい行の位置を格納する必要がありMouseMoveイベントにコードを使用する必要があります。

private Pen _leftPen = Pens.Black; 
private Pen _rightPen = Pens.Red; 

private List<Point> _leftPoints = new List<Point>(); 
private List<Point> _rightPoints = new List<Point>(); 

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     _leftPoints.Add(new Point(e.X, e.Y)); 
    } 

    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
    { 
     _rightPoints.Add(new Point(e.X, e.Y)); 
    } 

    this.Invalidate(); 
} 

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    foreach (Point point in _leftPoints) 
    { 
     e.Graphics.DrawLine(_leftPen, point.X, point.Y, point.X + 1, point.Y + 1); 
    } 

    //Similar code for _rightPoints here 
} 

Invalidateを呼び出すと、フォームは強制的に再描画されます。該当する場合は、代わりにthis.Refresh()またはthis.Update()を使用してください。

1
Color BackColor = Color.Black; 
Color ForeColor = Color.Red; 

次に、ユーザーの色を取得し、あなたがこのようなものを使用することができBackcolorForecolor

 private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      Graphics graphic = this.CreateGraphics(); 
      graphic.DrawLine(new Pen(ForeColor), e.X, e.Y, e.X + 1, e.Y + 1); 
     } 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      Graphics graphic = this.CreateGraphics(); 
      graphic.DrawLine(new Pen(BackColor), e.X, e.Y, e.X + 1, e.Y + 1); 
     } 
    } 
0

設定:this.UserColorsはあなたのメインウィンドウのコンボボックスである

using System; 
using System.Drawing; 
using System.Windows.Forms; 

public partial class Form1 : Form 
{ 
    private readonly Graphics graphics; 

    public Form1() 
    { 
     InitializeComponent(); 

     this.graphics = this.CreateGraphics(); 

     this.Load += (s, e) => 
     { 
      foreach (var color in Enum.GetValues(typeof(KnownColor))) 
       this.UserColors.Items.Add(color); 
     }; 
    } 

    /// <summary> 
    /// Painting (left button use changed color, right-white to erase) 
    /// </summary> 
    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
      this.graphics.DrawLine(
       new Pen(
        Color.FromKnownColor(
         (KnownColor)Enum.Parse(typeof(KnownColor), 
         this.UserColors.SelectedItem.ToString()))), 
       e.X, 
       e.Y, 
       e.X + 1, 
       e.Y + 1); 

     if (e.Button == MouseButtons.Right) 
      this.graphics.DrawLine(
       Pens.White, 
       e.X, 
       e.Y, 
       e.X + 1, 
       e.Y + 1); 
    } 
} 

を。

+0

正直なところ、この回答でどこに行くのかわからない – TheLethalCoder

+0

どうしたの? 私は彼に色から良いコードの例を与えました、ユーザーから選択可能です。 – EgoPingvina

+0

シンプルなことをするのは非常に扱いにくいと思います。私の答えとTawのコメントを参照してください。なぜ 'CreateGraphics'を使わないべきなのか、あなたの' Paint'イベント – TheLethalCoder

関連する問題