首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#向面板添加图片框

C#向面板添加图片框
EN

Stack Overflow用户
提问于 2011-12-28 14:32:16
回答 2查看 6.1K关注 0票数 2

我有一个名为panel3的面板,它可以在“Form1.cs”中找到。在这个小组中,我画了5条线来代表一位音乐工作者。

现在我想把按在钢琴上的音符的图片添加到音乐工作人员身上。基本上,我想在音乐工作人员的特定位置添加一个图片框。

为此,我在“addPictureBox”中创建了一个名为“Staff.cs”的方法,用于构建一个图片框,并在每次按下键时将其放置在面板上。

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

我能做些什么来解决这个问题?为什么panel3中没有显示图片框?谢谢。

编辑

谢谢你的帮助:)我解决了这个问题

EN

回答 2

Stack Overflow用户

发布于 2011-12-28 15:05:17

放置图片框不是个好主意--它不透明。所以我建议你手工画笔记。例如:

创建基条类:

代码语言:javascript
运行
复制
public class Note
{
    public Point Location { get; set; } 

    public virtual void Draw(Graphics g)
    {

    }
}

创建笔记,让我们说简单,困难和图片(画图片):

代码语言:javascript
运行
复制
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);
    }
}

在Staff类中添加备注列表,并在OnPaint方法中调用方法:

代码语言:javascript
运行
复制
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);
    }
}

在staff面板中,创建鼠标,单击事件处理程序,例如:

代码语言:javascript
运行
复制
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();
}

结果(第一是从图片看,第二是困难,第三是简单):

附注:代码不是最好的,我只是说明我的想法。

票数 3
EN

Stack Overflow用户

发布于 2011-12-28 14:42:41

试着打电话:

代码语言:javascript
运行
复制
pNewImage.BringToFront();

之后

代码语言:javascript
运行
复制
panel3.Controls.Add(pNewImage);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8657168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档