2012-12-21 64 views
0

我正在編寫一個程序,以便單擊一個按鈕,並根據您將鼠標放下的時間,打印鏈接的註釋。我的問題是,第一次點擊工作正常,但當我第二次堅持它不會更新,這是讓我瘋狂。任何幫助都感激不盡。下面找到我使用的以下代碼。由於控制和輸出音樂註釋

對於Form1中:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace NoteShape 
{ 
    public partial class Form1 : Form 
    { 
     public int duration = 0; 
     MusicNote mn; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      duration++; 
     } 

     private void button1_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       timer1.Enabled = true; 
       duration = 0; 
      } 
     } 

     private void button1_MouseUp(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       timer1.Enabled = false; 
      } 
      duration = duration % 20; 

      string bNoteShape = ""; 

      if (duration >= 12) 
      { 
       bNoteShape = "SemiBreve"; 
      } 

      if ((duration >= 6) && (duration <= 11)) 
      { 
       bNoteShape = "Minim"; 
      } 

      if ((duration >= 3) && (duration <= 5)) 
      { 
       bNoteShape = "Crotchet"; 
      } 

      if ((duration >= 1) && (duration <= 2)) 
      { 
       bNoteShape = "Quaver"; 
      } 

      if (duration == 0) 
      { 
       bNoteShape = "SemiQuaver"; 
      } 


      mn = new MusicNote(1, bNoteShape); 
      MessageBox.Show(bNoteShape); 
      this.Controls.Add(this.mn); 

     } 
    } 
} 

對於根據類:

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

namespace NoteShape 
{ 
    class MusicNote: PictureBox 
    { 
     public string path = "ImagesName\\"; 
     public int pitch; 
     public string noteShape; 

     public MusicNote(int iPitch, string iNoteShape) : base() 
     { 
      pitch = iPitch; 
      noteShape = iNoteShape; 

      Location = new Point(150, 50); 
      Size = new Size(40, 40); 
      Bitmap bmp1 = new Bitmap(path + noteShape + ".bmp"); 
      Image = bmp1; 
      BackColor = Color.Transparent; 
     } 

     protected override void OnPaint(PaintEventArgs pe) 
     { 
      base.OnPaint(pe); 
     } 
    } 
} 
+0

我強烈建議使用Environment.TickCount,而不是增加自己的持續時間。獲取mouseDown中的值,並在mouseUp中獲取一個新值,做出區別並持續以毫秒爲單位:請參閱此文檔:http://msdn.microsoft.com/zh-cn/library/system.environment。 tickcount.aspx –

+0

我不能這樣做,因爲教授只想使用課堂上完成的課程,這就是爲什麼......但問題仍然存在:/ – kurtborg92

+0

「你在課堂上完成的課程」意味着什麼。 Environnement.TickCount是.NET框架的一部分,並且可以像任何其他類一樣使用,例如Bitmap或者Point,您已經在您的項目中使用它。此外,如果您需要幫助,您應該在問題中編寫項目說明,因爲我們不知道它們。 –

回答

0

我剛剛在Visual Studio 2010中「按原樣」嘗試了您的代碼,沒有任何問題。我改變的唯一的事情是我評論位圖,因爲我沒有他們,但我選擇背景顏色黑色來看它。

//Bitmap bmp1 = new Bitmap(path + noteShape + ".bmp"); 
//Image = bmp1; 
BackColor = Color.Black; 

而且,我把定時器1與500毫秒的時間間隔,因爲我不知道什麼是你的時間間隔。

我可以一遍又一遍地做,它的消息框彈出正確的東西! 你可以再試一次或者更新你的代碼,因爲現在,根本沒有問題。

編輯

您需要在您的button1_MouseUp

this.Controls.Add(mn); 
mn.BringToFront(); 

在PictureBox繪製後面的前一個添加此。

+0

唯一的問題是圖像讓。消息框顯示正確,但控件僅添加第一個生成的音符。 – kurtborg92

+0

這意味着黑匣子將始終顯示正確,因爲它始終只輸出一個黑匣子。如果您嘗試移動黑匣子,這意味着它在第一次運行後在不同位置輸出,它將不起作用 – kurtborg92

+0

請參閱我的更新的答案 –

0

您正在創建一個新的筆記但將其放置在相同的位置每次。

您應該編輯現有的/點擊的筆記或放置新的筆記。

+0

是的,我想它更新自己,並取代其他... – kurtborg92

+0

所以,你應該首先檢測你點擊了什麼筆記,並輸入editmode或創建一個新的筆記,並定位它。編輯一個不可以被添加到MusicNote.Clicked事件,這樣你不必檢測點擊了什麼筆記。 –

+0

我已經這樣做了,因爲項目規格... – kurtborg92