-2

Form1 のトップ レベルにフラグがあります。コンストラクタで false に設定されている addFrame です。次に、picnt イベントで、false が描画できるかどうかを確認し、true も描画できるかどうかを確認します。ここでの問題は、プログラムを初めて実行するときに描画できるようにしたいということです! しかし、トラックバーを右に移動すると、何も描画したくありません。

private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {


           Graphics g = e.Graphics;

           g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

               moveCounter++;
               label6.Text = moveCounter.ToString();



                   if (addFrame == false)
                   {
                       WireObjectGraphics.Draw(wireObject1, g);
                   }
                   else
                   {
                       addFrame = false;
                       WireObjectGraphics.Draw(wireObject1, g);
                   }

        }

これはボタン クリック イベントで、クリックして addFrame を true に設定します。

private void button16_Click(object sender, EventArgs e)
    {
        wireObjectAnimation1.AddFrame();
        addFrame = true;
        trackBar1.Select();
    }

そして、この場合のスクロールバーイベントは、trackBarを右に移動し、まだ何も描画されていない場合、pictureBoxに画像を表示するだけで、何も描画しないでください! しかし、それを右に移動し、すでにドローがある場合は、それらを表示します。

左に移動すると、常に以前の描画が表示されます。

private void trackBar1_Scroll(object sender, EventArgs e)
        {
            if (addFrame == false)
            {

            }
            else
            {
                currentFrameIndex = trackBar1.Value - 1;
                textBox1.Text = "Frame Number : " + trackBar1.Value;

                wireObject1.woc.Set(wireObjectAnimation1.GetFrame(currentFrameIndex));
                trackBar1.Minimum = 0;
                trackBar1.Maximum = fi.Length - 1; 
                if (checkBox1.Checked)
                {
                    setpicture(trackBar1.Value);
                    Graphics g = Graphics.FromImage(pictureBox1.Image);
                    g.Clear(SystemColors.Control);
                    pictureBox1.Invalidate();
                }
                else
                {
                    setpicture(trackBar1.Value);
                }
                pictureBox1.Refresh();

                button1.Enabled = false;
                button2.Enabled = false;
                button3.Enabled = false;
                button4.Enabled = false;
                button8.Enabled = false;
                SaveFormPicutreBoxToBitMapIncludingDrawings(currentFrameIndex);

                return;

            }

        }

これは、WireObjectGraphics クラスの描画関数です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace AnimationEditor
{
    class WireObjectGraphics
    {
        static Point connectionPointStart;
        static Point connectionPointEnd;
        static SolidBrush brush;
        static Pen p = null;

        public WireObjectGraphics()
        {

        }

        public static void Draw(WireObject wo, Graphics graphics)
        {
            brush = new SolidBrush(Color.Red);
            p = new Pen(brush);
            Graphics g = graphics;
            WireObject wireObject1 = wo;

            if (wireObject1 != null)
            {
                for (int idx = 0; idx < wireObject1.woc.Point_X.Count; ++idx)
                {
                    Point dPoint = new Point((int)wireObject1.woc.Point_X[idx], (int)wireObject1.woc.Point_Y[idx]);
                    dPoint.X = dPoint.X - 5; // was - 2
                    dPoint.Y = dPoint.Y - 5; // was - 2
                    Rectangle rect = new Rectangle(dPoint, new Size(10, 10));
                    g.FillEllipse(brush, rect);
                    // bitmapGraphics.FillEllipse(brush, rect);

                    // g.FillEllipse(brush, rect);
                }

                for (int i = 0; i < wireObject1._connectionstart.Count; i++)
                {

                    int startIndex = wireObject1._connectionstart[i];
                    int endIndex = wireObject1._connectionend[i];



                    connectionPointStart = new Point((int)wireObject1.woc.Point_X[startIndex], (int)wireObject1.woc.Point_Y[startIndex]);
                    connectionPointEnd = new Point((int)wireObject1.woc.Point_X[endIndex], (int)wireObject1.woc.Point_Y[endIndex]);
                    p.Width = 2;
                    g.DrawLine(p, connectionPointStart, connectionPointEnd);
                    // bitmapGraphics.DrawLine(p, connectionPointStart, connectionPointEnd);
                }
            }
        }

    }


}

私が必要とするのは、プログラムを初めて実行して描画できるようにすることです! 次に、トラックバーを右に移動して描画が既に存在するかどうかを確認すると、存在しない場合は画像のみが表示され、ボタンをクリックしたときにのみ、フレームに描画が追加されます。

左に移動すると、他のフレームで行った描画が常に表示されます。

ワイヤ オブジェクト クラス:

コンストラクタ:

class WireObject
    {
        private string an;
        private bool fnExt;
        public string lockObject;
        private int idx;
        public WireObjectCoordinates woc;
        private List<int> connectionStart = new List<int>();
        private List<int> connectionEnd = new List<int>();

        private const string version = "01.00";

        string wo_name;


        public WireObject( string name )
        {
            wo_name = name;
            woc = new WireObjectCoordinates();
            fnExt = false;
        }

ワイヤーオブジェクトクラスには、保存や読み込みなどの削除ピクセルのようなポイント(ピクセル)の接続などの機能があります...

WireObjectCoordinates クラスは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AnimationEditor
{
    class WireObjectCoordinates
    {
        public List<float> Point_X = new List<float>();
        public List<float> Point_Y = new List<float>();

        public WireObjectCoordinates()
        {
        }

        public WireObjectCoordinates(WireObjectCoordinates w)
        {
            Point_X.AddRange(w.Point_X);
            Point_Y.AddRange(w.Point_Y);
        }

        public void Set(WireObjectCoordinates w)
        {
            if (w == null)
            {
            }
            else
            {
                for (int i = 0; i < Point_X.Count; i++)
                {
                    Point_X[i] = w.Point_X[i];
                    Point_Y[i] = w.Point_Y[i];
                }
            }
        }
    }
}

問題はまだ Form1 にあり、いつピクセルを表示するかというフラグがあります。ただし、一度は内部で Draw 関数を使用し、一度は使用しません。プログラムを実行すると、トラックバーを右に移動したら描画機能を使用できます。描画機能を使用しないでください。

4

1 に答える 1

0

Windows フォーム コントロールの場合、OnPaint は次の場合にのみ呼び出されます。 /1e430ef4.aspx

したがって、OnPaint は頻繁に呼び出されるはずです。

于 2012-07-29T15:13:14.810 に答える