簡體   English   中英

圖片框控件無法正常使用C#.NET(Visual Studio)

[英]picturebox Control is not working C# .NET (Visual Studio)

我正在做一個鋼琴鍵盤,它也帶有一個Music Staff,這樣,當您按鍵盤上的一個鍵時,根據音符的持續時間(鈎針,半短音等)會彈出Music Staff。

我有一個窗體(稱為Form1),其中有一個面板(Panel1),其中包含由按鈕組成的鍵盤鍵。 我還有一個音樂譜夾,它由一個可容納譜桿(或梯級不知道它叫什么)的PictureBox和一個可保存音高(基本上是映射音符時演奏的音符)的Test Text Box組成。

問題是這樣的。 我需要在譜號(pictureBox1)上顯示音符,以便在Form1中充當主類,但是每當我編寫時

mn = new MusicNote (nPos,nPitch, duration,nShape);
pictureBox1.Controls.Add(this.mn);
pictureBox1.Controls[pictureBox1.Controls.Count - 1].BringToFront(); //Bring the notes OVER the Stave

當我只用這個 OR panel1 (例如)替換每個pictureBox1時,它基本上不起作用

this.Controls.Add(this.mn); 

它會在FORM1(灰色區域)或鍵盤本身上顯示“音符”(請參閱​​下方查看鍵盤)。 問題在於,它實際上並沒有添加到PictureBox中,而是添加到了Form1 / Panel中

您是否知道如何解決此問題並使音樂筆記實際上成為PictureBox1的一部分? 因為我還需要一些方法在該pictureBox上工作,例如當我單擊其中一個Notes時,它們實際上會播放該持續時間的聲音(在該聲音中,我仍然需要弄清楚如何將控件從Form1.cs傳遞到MusicNote.cs)

下面是與圖像的“添加”有關的MusicNote.cs的部分編碼:

public class MusicNote : PictureBox
{
    public int pitch;
    public int duration;
    public string noteShape;

    string nShape;

    bool isDragging = false;
    public string rootFolder = @"..\..\\bin\\Debug\\images\\";

    ArrayList al = new ArrayList();
    SoundPlayer sp = new SoundPlayer();
    Timer t1 = new Timer();

    public MusicNote(int x, int mPitch, int mDuration,string nShape)
        : base()
    {
        pitch = mPitch;
        duration = mDuration;
        noteShape = nShape;

        Location = new Point(x, 100);
        this.Size = new Size(35, 40);

        //--------- Get the Image of Note ----------

        Bitmap bmp = new Bitmap(@rootFolder + nShape + ".bmp");
        this.Image = bmp;
        this.BackColor = Color.Transparent;

        //-------Mouse Events-------

        this.MouseDown += new MouseEventHandler(StartDrag);
        this.MouseUp += new MouseEventHandler(StopDrag);
        this.MouseMove += new MouseEventHandler(NoteDrag);

    }


    etc
    ...
    ...
    ...
    }

Form1.cs編碼(將所有內容都從一種方法連接到另一種方法進行發布)問題出在私有無效的onMouseUp(對象發送者,MouseEventArgs e)上 ,這是最后一種方法

using System;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Media;
using System.Collections;


namespace Piano
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }



        // Objects of Music Note, Piano Keys, and all variables surronding the Keyboard and Notes
        WhiteKey wk;
        BlackKey bk;
        public int pitch;
        public int duration = 0;
        string nShape = "";

        public const int xOff = 35;
        int count = 0;
        int nPos = 0;
        public string rootFolder = @"..\..\\bin\\Debug\\images\\";

        MusicNote mn;
        MusicStaff ms;
        SoundPlayer sp = new SoundPlayer();
        Stopwatch sw = new Stopwatch();

        //--------------- White and Black Keys Creation both Buttons and Position------------------
        public int[] wKeys = { 1, 3, 5, 6, 8, 10, 12, 13, 15, 17, 18, 20, 22, 24, 25 }; //White Keys notes numbers (pitch)
        public int[] bKeys = { 0, 2, 0, 4, 0, 0, 7, 0, 9, 0, 11, 0, 0, 14, 0, 16, 0, 0, 19, 0, 21, 0, 23, 0, 0 }; //Black Keys notes numbers (pitch)
        int[] wPos = { 35, 70, 105, 140, 175, 210, 245, 280, 315, 350, 385, 420, 455, 490, 525 }; // Position of White Keys on the Panel
        int[] bPos = { 0, 57, 0, 92, 0, 0, 162, 0, 197, 0, 232, 0, 0, 302, 0, 337, 0, 0, 407, 0, 442, 0, 477, 0, 1 }; //Position of the Black Keys in the Panel




        private void Form1_Load(object sender, System.EventArgs e)
        {

            for (int i = 0; i < 15; i++)
            {                
                WhiteKey wk = new WhiteKey(wKeys[i], wPos[i]-35,0); //create a new white Key with [i] Pitch, at that x position and at y =0 position
                wk.MouseDown += onMouseDown; //Plays the Key and starts Timer
                wk.MouseUp += onMouseUp; // Holds the data like Time and shape and so 
                this.panel1.Controls.Add(wk); //Give it control (to play and edit)
            }




            for (int i = 0; i < 25; i++) //same for the Black Keys but instead we use 25 keys and those denoted at 0 are where the WHITE KEYS should be placed
            {
                if (bKeys[i] != 0)
                {
                    //Same as above but for Black Key which is inherits from WhiteKey
                    bk = new BlackKey(bKeys[i], bPos[i]-35, 0);
                    bk.MouseDown += onMouseDown;
                    bk.MouseUp += onMouseUp;    
                    this.panel1.Controls.Add(bk);
                    this.panel1.Controls[this.panel1.Controls.Count - 1].BringToFront(); //Make the Black Keys show OVER the white  
                }

            }
        }


       //Method showing what happens when you do a MouseDown Event
        private void onMouseDown(object sender, MouseEventArgs e)
        {
            wk = sender as WhiteKey; //gets the WhiteKey Controls


            pitch = wk.pitch; //assign pitch


            sp.SoundLocation = @"..\\..\\bin\\Debug\\sound\\mapped\\" + pitch + ".wav"; //find that pressed note
            sp.Play(); //play it

            sw.Reset(); //Reset Stop Watch
            sw.Start(); //Start Time

        }

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

        private void onMouseUp (object sender, MouseEventArgs e)
        {

            if (e.Button == MouseButtons.Left)
            {
                sw.Stop(); //Stop time
                duration = (int)sw.ElapsedMilliseconds / 100;

                textBox.Text += (string)(pitch + " , ");  //add the Pitch used to the textbox

                // Will determine the Music Note Image
               if (duration >= 0 && duration < 2)
                {
                    nShape = "Quaver";
                 }
                else if (duration >= 2 && duration < 5)
                {
                    nShape = "Crotchet";
                }
                else if (duration >= 5 && duration < 8)
                {
                    nShape = "minim";
                }
                else if (duration >= 8 && duration < 10)
                {
                    nShape = "DotMin";
                }
                else if (duration >= 10)
                {
                    nShape = "SemiBreve";
                }

                count++; //will help Determine the 'x' coordiante of the Music Note
                nPos = xOff * count; //moves the x-coordinate by 35 pixels each note

                mn = new MusicNote(nPos,pitch,duration,nShape); //Creation of a new MusicNote
                pictureBox1.Controls.Add(this.mn); //PROBLEM --- Doesn't add to the PictureBox (Does Nothing)
                pictureBox1.Controls[pictureBox1.Controls.Count - 1].BringToFront(); //Brought to front of stave to make sure it doesn't get hidden in background

            }

        }

    }
}

知道如何將CONTROL添加到PictureBox1並進行音符顯示嗎? 因為我設法使其在Form1和Panel1上顯示,但在pictureBox上顯示失敗

FORM1上帶有音符的鋼琴的外觀

鋼琴

根據Visual Studio的DEBUGGER [Piano.Form1]

http://postimg.org/image/vdu0x1gv1/

注意:很長的帖子,很抱歉,但是我不知道該怎么解釋。

我認為該程序只是讓我感到困惑。

感謝那些看過這個問題的人。

要在圖片框中播放聲音,請執行以下操作

 [DllImport("winmm.dll")]
        private static extern bool PlaySound(string lpszName, int hModule, int dwFlags);

PlaySound("your sound loc ", 1, 0x0011);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM