2011-06-18 11 views
0

私の質問は少し長いようだが、私は解決策が私code.Iに若干の修正が私のフォーム1マウスイベントの呼び出しとメッセージボックスへの入力に関する問題

pictureBox1_MouseDown、 pictureBox1_MouseMove、 pictureBox1_Paintで3つのマウスイベントのシーケンスとペイントイベントを実施していますでしょう知っています、 pictureBox1_MouseUp。

コードはこのように動作するはずです。マウスをクリックしてドラッグして希望のポイントにボタンを放すと、入力値を取るカスタムメッセージボックスが表示されます。フォーム(form2)が表示されますメッセージボックスとして。ここでフォーム1の私のコードは、あなたがコードを見た後に問題を理解することができます。

をForm1:

 private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     // "e.X" and "e.Y" are used to get MousePositionX and MousePositionY 
     rect = new Rectangle(0, 0, e.X, e.Y); 
     pictureBox1.Invalidate(); 
    } 
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     // This makes sure that the left mouse button is pressed. 
     if (e.Button == MouseButtons.Left) 
     { 
      // Draws the rectangle as the mouse moves 

      rect.Width = e.X; 
      rect.Height = e.Y; 
     } 
     pictureBox1.Invalidate(); 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 

     using (Pen pen = new Pen(Color.Red, 2)) 
     { 
      e.Graphics.DrawRectangle(pen, rect); 
     } 
    } 


    private WindowsFormsApplication2.Form2 _form2 = new WindowsFormsApplication2.Form2(); 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     DialogResult dialogresult = _form2.ShowDialog(this); 


     if (dialogresult == DialogResult.OK) 
     { 
      try 
      { 
       for (int i = 0; i < 2; i++) 
       { 
        l[i] = e.X; 
        m[i] = e.Y; 
       } 
      } 
      catch (Exception ex) 
      { 
      } 
     } 
    } 

ここでの問題は、次のとおりです。

1)コードによると、我々は長方形が表示され、マウス、我々はメッセージボックスが表示され、マウスのボタンを残す場所をドラッグすると、フォーム2のOKボタンとCANCElボタンをform1.Afterに入力してOKを押すと、この矩形が消えるはずですが、ここではそれは起こっていません。このメッセージボックス(form2)は入力値を読み取ることができません。

2)私は入力を2回だけ与える必要があります。すなわち、私は以前のアクションのシーケンス(すべてのマウスイベントとペイントイベント)を2回しか実行しないので、FORループを書きました。しかし、問題はメッセージですボックス(form2)は毎回起動され、マウスボタンを放します。これは、2つの入力を与えた後にmousedoubleclickイベントを実装する必要があるため、重大な問題を引き起こしています。

私には必要な修正が必要です。ありがとうございます。

+0

このコードが何をしようとしているのか推測しにくいです。 l []とm []は何ですか?ダイアログが表示される前にマウスを持っていた位置にそれらを割り当てるのはなぜですか?あなたは* rect *で何かしたいと思っています。 –

+0

私はマウスポインタの座標をl []とm []に取得しようとしていますが、その宣言が正しいかどうかはわかりません。私は入力を2回与えなければならないので、私のFORループは2回実行されています。これらのマウスポインタの値は、後で計算するためにこれらの配列に保存されます! – raghu

答えて

1

「form2のOKボタンとCANCELボタンをform1と接続してください」という意味は不明ですか?

「接続」する必要はありません。必要なのは、Form2(OKとCancel)の2つのボタンと、それぞれの_clickメソッドでは、OKの場合はthis.DialogResult = DialogResult.OK;、キャンセルの場合はthis.DialogResult = DialogResult.Cancel;が必要です。

は、次に、あなたの「if」長方形を削除します

private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
     { 
      DialogResult dialogresult = _form2.ShowDialog(this); 

      if (dialogresult == DialogResult.OK) 
      {     
       rect.Width = 0; 
       rect.Height = 0; 
       pictureBox1.Invalidate(); 
      } 
     } 

フォーム1に進みます。私はそれが良い解決策であるかどうかは分かりませんが、うまくいきます。

pictureBox1_MouseUpを呼び出すたびに、ループ内のループが「0」に設定され、ループが開始されます。
Form1のコンストラクタにint TwoClicks = 0が必要です。

private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
     { 
      if (TwoClicks < 2) 
      { 
      TwoClicks++; 
      DialogResult dialogresult = _form2.ShowDialog(this); 

      if (dialogresult == DialogResult.OK) 
      {     
       rect.Width = 0; 
       rect.Height = 0; 
       pictureBox1.Invalidate(); 
      } 
      } 
     } 

はどんな質問をするお気軽に(と私は右のそれを取得していない場合は、あなたの最初の問題について説明します):そして、あなたはそれに応じてpictureBox1_MouseUpを変更する必要があります。

+0

ありがとうございます!あなたは正しい方法で私の意図を捉えました!!私はボタンを押したとき、彼らはあなたが言ったように動作するはずです。もしOKならば、与えられた値を取らなければならず、CANCELなら入力を再度尋ねなければならないが、その点でTwoClicksをインクリメントしてはいけません。 – raghu

+0

2つの入力を与えた後、画像ボックスをダブルクリックすると、四角形は表示されませんが、まだ表示されます。 – raghu

+0

@raghu:あなたはmousedownの "if(TwoClicks <2)"(とおそらくmousemoveでも)と同じトリックをしなければなりません。それはうまくいくはずです。 – Zeus

関連する問題