2011-12-28 101 views
2

我有一个面板,称为·Panel3中,这是在“Form1.cs的”找到。在这个小组中,我画了5行代表音乐人员。C#添加一个图片到面板

现在我想添加压在钢琴音乐的工作人员说明的图片。基本上,我想在音乐人员的特定位置添加一个图片框。

为了做到这一点,我创建了一个名为“Staff.cs” addPictureBox“的方法来建立一个图片框并将其放置在面板每次按下一个键上。

这是相关代码。问题是图片框不显示在面板上。只有先前绘制的线条才能在panel3中看到。

我能做些什么来解决这个问题吗?为什么picturebox不能显示在panel3中?谢谢。

编辑

感谢您的帮助:)我已经解决了这个问题

+0

从该事件被你叫addPictureBox()? – 2011-12-28 14:35:34

+0

我从MouseUp事件调用addPictureBox() – Clayton 2011-12-28 14:38:25

+0

你知道如何使用调试器吗?这对你自己来说会更容易,而且如果你在求助于stackoverflow之前先尝试调试过这些东西,那么速度会更快。当你不知道如何做某事,或者发生什么事情是不合逻辑的时候,Stackoverflow就是用来做这件事的。你的问题不是那些;你的问题只是你需要做一些调试。 – 2011-12-28 14:42:20

回答

0

尝试调用:

pNewImage.BringToFront(); 

panel3.Controls.Add(pNewImage); 
+0

我试过了,但面板上再没有任何东西出现。 – Clayton 2011-12-28 14:47:24

3

恕我直言,它不是好主意放置图片框 - 它不透明。所以我建议你手动绘制笔记。例如:


创建基调类:

public class Note 
{ 
    public Point Location { get; set; } 

    public virtual void Draw(Graphics g) 
    { 

    } 
} 

创建笔记,可以说简单,困难和图片(其中提请图片):

public class SimpleNote:Note 
{ 
    public SimpleNote(Point position) 
    { 
     Location = position; 
    } 

    public override void Draw(Graphics g) 
    { 
     g.FillEllipse(Brushes.Red, Location.X, Location.Y, 5, 5); 
     g.DrawLine(new Pen(Color.Red), Location.X+5, Location.Y, Location.X+5, Location.Y-15); 
    } 
} 

public class DifficultNote:Note 
{ 
    public DifficultNote(Point position) 
    { 
     Location = position; 
    } 

    public override void Draw(Graphics g) 
    { 
     SimpleNote left = new SimpleNote(Location); 
     SimpleNote right = new SimpleNote(new Point(Location.X + 20, Location.Y)); 

     left.Draw(g); 
     right.Draw(g); 
     g.DrawLine(new Pen(Color.Red), Location.X+5, Location.Y - 15, Location.X+25, Location.Y-15); 
    } 
} 

public class PictureNote:Note 
{ 
    private Image _image; 
    public PictureNote(Image image, Point position) 
    { 
     Location = new Point(position.X - image.Width/2, position.Y - image.Height/2); 
     _image = image; 
    } 

    public override void Draw(Graphics g) 
    { 
     g.DrawImage(_image, Location); 
    } 
} 

在职员类中添加注释列表并在OnPai中调用绘图方法NT方法:

public List<Note> noteList = new List<Note>(); 
protected override void OnPaint(PaintEventArgs e) 
{ 
    int yPos = kOffset + staffIndex * kStaffSpacing; 
    for (int bars = 0; bars < 5; bars++) 
    { 
     e.Graphics.DrawLine(Pens.Black, 0, yPos, kStaffInPixels, yPos); 
     yPos += kBarSpacing; 
    } 

    foreach (var note in noteList) 
    { 
     note.Draw(e.Graphics); 
    } 
} 

,并在您的工作人员面板创建鼠标单击事件处理程序,例如像这样:

private void staff1_MouseClick(object sender, MouseEventArgs e) 
{ 
    if(e.Button == MouseButtons.Left) 
     staff1.noteList.Add(new SimpleNote(new Point(e.X, e.Y))); 
    if(e.Button == MouseButtons.Right) 
     staff1.noteList.Add(new DifficultNote(new Point(e.X, e.Y))); 
    if(e.Button == MouseButtons.Middle) 
      staff1.noteList.Add(new PictureNote(new Bitmap("c:\\note.png"), new Point(e.X, e.Y))); 
     staff1.Invalidate(); 
} 

结果(第一个是从画面,第二个困难,三是简单):

enter image description here

诗代码不是最好的,我只是说明我的想法。