-1

私がしたことは、Form1の上部に新しいint変数moveCounterを追加したことです。コンストラクターでは、変数を0で開始します。moveCounter= 0;

pictureBox1ペイントイベントでは、次のようにしました。moveCounter ++; また、paintイベントでは、moveCounterの値をtextBoxに入れます。

private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            SolidBrush brush;
            Pen p=null;
           Point connectionPointStart;
           Point connectionPointEnd;
           Graphics g = e.Graphics;
           g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

               brush = new SolidBrush(Color.Red);
               p = new Pen(brush);
               for (int idx = 0; idx < wireObject1._point_X.Count; ++idx)
               {
                   Point dPoint = new Point((int)wireObject1._point_X[idx], (int)wireObject1._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);    
               }

               for (int i = 0; i < wireObject1._connectionstart.Count; i++)
               {    
                   int startIndex = wireObject1._connectionstart[i];
                   int endIndex = wireObject1._connectionend[i];
                   connectionPointStart = new Point((int)wireObject1._point_X[startIndex], (int)wireObject1._point_Y[startIndex]);
                   connectionPointEnd = new Point((int)wireObject1._point_X[endIndex], (int)wireObject1._point_Y[endIndex]);
                   p.Width = 4;
                   g.DrawLine(p, connectionPointStart, connectionPointEnd);
                   moveCounter++;
                   textBox1.Text = moveCounter.ToString();
               }
        }

Form1の上部で、StreamWriterwの変数を作成しました。そしてコンストラクターで私はしました:

w = new StreamWriter(@"d:\movesCounter.txt");

pictureBox1のマウス移動イベントで、moveCounterが10を超えている場合にのみチェックし、値をテキストファイルに書き込みます。

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (mouseMove == true)
            {
                mouseDrag = true;
                Point NewPoint = e.Location;                    
                    wireObject1.MovePoint(selectedIndex, NewPoint, NewPoint); // when moving a point dragging the other point is vanished deleted. To check why !

                    label1.Text = "{X = " + NewPoint.X + "}" + " " + "{Y = " + NewPoint.Y + "}";
                    refreshFlag = true;
                    timer2.Start();

                    if (moveCounter > 10)
                    {
                        w.WriteLine("Number Of Moves ===>   " + moveCounter);
                    }
            }
            else
            {
                label19.Text = "{X = " + e.X + "}" + " " + "{Y = " + e.Y + "}";
            }
        }

pictureBox1のマウスアップイベントで、StreamWriterを閉じます。

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (mouseMove == true)
            {
                Point NewPoint = e.Location;
                wireObject1._point_X[(int)selectedIndex] = NewPoint.X;
                wireObject1._point_Y[(int)selectedIndex] = NewPoint.Y;
                mouseMove = false;
                if (moveCounter > 10)
                {
                    w.Close();
                }
                WireObjectCoordinatesCloneFrame();
            }
    }

私がやりたいのは、moveCounterの値をテキストファイルに記録/書き込みすることです。私はmoveCounter++を置きました。下のループのペイントイベントでは、このループは2つ以上のポイントが線で接続されている場合に機能し、接続されたポイントの1つをpictureBoxエリアクライアントの周りで移動すると、moveCounter値が上昇しているのがリアルタイムでわかります。

問題は、ハードディスク上のテキストファイルで得られる結果が次のようになることです。

Number Of Moves ===>   11
Number Of Moves ===>   11
Number Of Moves ===>   11
Number Of Moves ===>   12
Number Of Moves ===>   12
Number Of Moves ===>   12
Number Of Moves ===>   13
Number Of Moves ===>   13
Number Of Moves ===>   13
Number Of Moves ===>   14
Number Of Moves ===>   14
Number Of Moves ===>   14
Number Of Moves ===>   15
Number Of Moves ===>   15
Number Of Moves ===>   16
Number Of Moves ===>   16
Number Of Moves ===>   17
Number Of Moves ===>   17
Number Of Moves ===>   18
Number Of Moves ===>   18
Number Of Moves ===>   19
Number Of Moves ===>   19
Number Of Moves ===>   20
Number Of Moves ===>   20
Number Of Moves ===>   20
Number Of Moves ===>   21
Number Of Moves ===>   21
Number Of Moves ===>   21

202020または212121または1818のように、値の一部を2回または3回続けて取得する理由がわかりません。代わりに、各値を1回取得します。

これは値169にあります。これを5秒経過して追加したかったのですが、問題ありませんが、値169が1回ではなく数回表示されます。そして、それはすべてのテキストファイルでこのように同じです。

Number Of Moves ===>   169
Passed 5 Seconds ===>   5
Number Of Moves ===>   169

解決策は何ですか?

編集済み**

これは、mouseMove bool変数をtrueに設定したpictureBox1マウスダウンイベントであるため、問題はここにある可能性があります。

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                label1.Visible = true;
                label4.Visible = true;




                float t = wireObject1.GetIndexByXY(e.X, e.Y, 5);

                if (t == -1)
                {
                    button3.Enabled = false;
                }
                else
                {
                    button3.Enabled = true;
                    {
                        selectedIndex = t;
                        mouseMove = true;
                        OriginalX = wireObject1._point_X[(int)selectedIndex];
                        OriginalY = wireObject1._point_Y[(int)selectedIndex];



                        if (cyclicSelectedIndex.Count() == 2)
                        {

                            cyclicSelectedIndex[currentCyclicIndex] = (int)selectedIndex;
                            currentCyclicIndex++;
                            if (currentCyclicIndex == 2)
                            {
                                currentCyclicIndex = 0;
                            }


                            if ((cyclicSelectedIndex[0] == cyclicSelectedIndex[1]) || (cyclicSelectedIndex[0] == -1) || (cyclicSelectedIndex[1] == -1))

                            {
                                button2.Enabled = false;
                            }
                            else
                            {
                                button2.Enabled = true;
                            }

                            for (int i = 0; i < wireObject1._connectionstart.Count; i++) 
                            {
                                if ((wireObject1._connectionstart[i] == cyclicSelectedIndex[0] && wireObject1._connectionend[i] == cyclicSelectedIndex[1]) ||
                                   (wireObject1._connectionstart[i] == cyclicSelectedIndex[1] && wireObject1._connectionend[i] == cyclicSelectedIndex[0]) ||
                                    wireObject1._connectionstart[i] == cyclicSelectedIndex[0] || wireObject1._connectionend[i] == cyclicSelectedIndex[1] ||
                                     wireObject1._connectionstart[i] == cyclicSelectedIndex[1] || wireObject1._connectionend[i] == cyclicSelectedIndex[0])
                                {

                                    button3.Enabled = false;
                                }

                                if ((wireObject1._connectionstart[i] == cyclicSelectedIndex[0] && wireObject1._connectionend[i] == cyclicSelectedIndex[1]) ||
                                   (wireObject1._connectionstart[i] == cyclicSelectedIndex[1] && wireObject1._connectionend[i] == cyclicSelectedIndex[0]))
                                {
                                    button2.Enabled = false;  
                                }
                            }

                            label13.Text = selectedIndex.ToString();
                            label13.Visible = true;
                            label14.Visible = true;
                            listView1.Items.Add(selectedIndex.ToString()).EnsureVisible();
                        }
                    }
                }
            }
        }

もう1つは、デザイナーのTimer1にタイマーを追加したことです。タイマーが有効になり、30ミリ秒に設定されます。

pictureBoxのマウス移動イベントで私は次のことを行いました。

refreshFlag = true;

次に、timer1ティックイベントで、このフラグがtrueかどうかを確認してから、pictureBox1.refresh();を作成します。アイデアは、moveイベントで接続されているポイントまたは接続されていないポイントをドラッグ/移動するときに、30ミリ秒ごとにのみペイントイベントを作成することでした。それで、多分問題はそこにありますか?

これはtimer1ティックイベントです。

private void timer1_Tick(object sender, EventArgs e)
        {
            if (refreshFlag == true)
            {
                pictureBox1.Refresh();
                refreshFlag = false;
            }
        }
4

1 に答える 1

0

2番目の呼び出しは30ミリ秒ごとにのみ呼び出され、マウスが前に動かされた場合に呼び出されるため、あなたpictureBox1_MouseMoveはあなたよりも頻繁に呼び出されます。pictureBox1_Paint

したがって、マウスが移動した場所でmoveCounterをインクリメントします。

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    ...
    moveCounter++;
    textBox1.Text = moveCounter.ToString();
    ...
}
于 2012-06-26T07:34:00.407 に答える