2017-09-02 15 views
1

私は目の動きをフォームに表示するために目のトラッカーを使用しています。動きがたくさんちらついているので、私は、目の動きが始まるときを除いて、全てがうまく動作するBufferedGraphicsを使うことができることを発見しました。元の色から黒にフォームを変えます。これがコードです。うまくいけば誰かが助けることができます!なぜ旋削の形が黒くなるのですか

private void button2_Click(object sender, EventArgs e) 
{ 
    var host = new Host(); 
    var gazeStream = host.Streams.CreateGazePointDataStream(); 
    gazeStream.GazePoint((x, y, ts) 
     => drawCircle(new PointF((float)x, (float)y))); 
} 

delegate void SetCallback(PointF point); 

private void drawCircle(PointF point) 
{ 
    float x = point.X; 
    float y = point.Y; 

    if (this.InvokeRequired) 
    { 
     SetCallback d = new SetCallback(drawCircle); 
     this.Invoke(d, new object[] { point }); 
    } 
    else 
    { 
     SolidBrush semiTransBrush = new SolidBrush(Color.Coral); 
     Pen pen = new Pen(Color.Aquamarine, 2); 

     BufferedGraphicsContext currentContext; 
     BufferedGraphics myBuffer; 
     // Gets a reference to the current BufferedGraphicsContext 
     currentContext = BufferedGraphicsManager.Current; 
     // Creates a BufferedGraphics instance associated with Form1, and with 
     // dimensions the same size as the drawing surface of Form1. 
     myBuffer = currentContext.Allocate(this.CreateGraphics(),this.DisplayRectangle); 
     myBuffer.Graphics.DrawEllipse(pen, x, y, 100, 100); 
     myBuffer.Graphics.FillEllipse(semiTransBrush, x, y, 100, 100); 


     // Renders the contents of the buffer to the specified drawing surface. 
     myBuffer.Render(this.CreateGraphics()); 

     myBuffer.Dispose(); 
    } 

enter image description here

あなたは円はフォームがなくなっているように思えるのコントロールの後ろに表示されていることを画像で見ることができますか?

+0

は 'myBuffer.Graphics.Clear(this.BackColor)を試してみてください;'図形を描画する前に - それは、フォーム –

+0

に何かを持っていない場合、私は、フォーム上のラジオボタンやラベルを持っています。コントロールはまだ表示されます。それはちょうど変化する色ではなくフォームの背景が削除されているように見えます – user8370201

+0

質問のコードはどこですか?メソッドの詳細を表示する –

答えて

1

バッファを割り当てると、指定したグラフィックスと互換性のあるレンダリングサーフェイスが作成されます。しかし、コピーしても何もコピーされないので、1つのサークルを塗るだけで残りの部分は黒くなります。

BufferedGraphics実際に特殊なケースでちらつきを避けるのに役立ちます(たとえば、何らかの理由でシステムのダブルバッファリングを無効にする必要がある場合など)が、これは過度です。

したがって、キーはダブルバッファリングを有効にしており、Paintイベント(またはOnPaintメソッド)のすべてのペイントを実行しています。あなたのコードでは、即座にペイントしますが、常にちらつきがあります。代わりに、フォームを無効にして、システムが通常の再ペイントセッションを実行するようにする必要があります。必要に応じてダブルバッファリングを使用できます。コンストラクタに

:次に

SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); 

クリックイベント変更:

private PointF lastGazePoint; 

private void button2_Click(object sender, EventArgs e) 
{ 
    var host = new Host(); 
    var gazeStream = host.Streams.CreateGazePointDataStream(); 
    gazeStream.GazePoint((x, y, ts) => 
     { 
      lastGazePoint = new PointF((float)x, (float)y); 
      Invalidate(); 
     }); 
} 

絵自体:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    DrawCircle(e.Graphics, lastGazePoint.X, lastGazePoint.Y); 
} 

そして最後に、PaintEventArgsからGraphicsを使用するようにDrawCircleを変更します:

private void DrawCircle(Graphics g, float x, float y) 
{ 
    using (Brush semiTransBrush = new SolidBrush(Color.Coral)) 
    { 
     using (Pen pen = new Pen(Color.Aquamarine, 2)) 
     { 
      g.DrawEllipse(pen, x, y, 100, 100); 
      g.FillEllipse(semiTransBrush, x, y, 100, 100); 
     }   
    }   
} 
+0

ありがとうございました。ユーザーが画面から離れて画面に戻ってくると円を動かす方法を理解する必要があります – user8370201

+0

こんにちは私はxmlファイルから円の動きを再生するために同じロジックを使用しようとしています。私はファイルを読み込み、xとyを得るためにそれを解析することができますが、円は一度だけ描画されます。私は同じDraw CircleとonPaintメソッドを使用していますが、今回は座標を取得するもう1つのメソッドがありますpublic void EyeMove(float x、float y) { point = new PointF(x、y); } – user8370201

+0

詳細を入力する必要があります。ソースがなければ、アニメーションを再生している最中にUIスレッドをブロックして、最後のフレームだけを見ることができます。再生エンジンには、 'Thread.Sleep'または同様のスレッドブロッキング技術が含まれてはいけません。それは十分な情報ではない場合は、詳細と別の質問を投稿してください。 – taffer

関連する問題