0

我想让我的笑脸盒像现场信使一样。

笑脸盒

我怎样才能做到这一点?我想得到选中的图片?

谢谢?

4

2 回答 2

2

我会使用ToolStripToolStripSplitButton控件,然后我会创建自己的控件,从面板中继承来显示图片框中包含的微笑,当单击 ToolStripSplitButton 时会发生这种情况。

我试图模拟你想做的行为。所以这里有一些代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.SuspendLayout();

        List<Bitmap> Smiles = new List<Bitmap>(); //Add images

        ToolStripSplitButton _toolStripSplitButton = new ToolStripSplitButton();
        _toolStripSplitButton.Size = new Size(23, 23);
        //_toolStripSplitButton.Image = myImage; //Add the image of the stripSplitButton

        ToolStrip _toolStrip = new ToolStrip();
        _toolStrip.Size = new Size(ClientSize.Width, 10);
        _toolStrip.Location = new Point(0, this.ClientSize.Height - _toolStrip.Height);
        _toolStrip.BackColor = Color.LightGray;
        _toolStrip.Dock = DockStyle.Bottom;
        _toolStrip.Items.AddRange(new ToolStripItem[] { _toolStripSplitButton });

        SmileBox smilebox = new SmileBox(new Point(_toolStripSplitButton.Bounds.Location.X, _toolStrip.Location.Y - 18), 6);
        smilebox.Visible = false;

        Controls.Add(smilebox);

        foreach (Bitmap bmp in Smiles)
            smilebox.AddItem(bmp);

        _toolStripSplitButton.Click += new EventHandler(delegate(object sender, EventArgs e)
        {
            smilebox.Visible = true;
        });

        Click += new EventHandler(delegate(object sender, EventArgs e)
        {
            smilebox.Visible = false;
        });

        this.Controls.Add(_toolStrip);
        this.ResumeLayout();
    }

    void Form1_Click(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
}

class SmileBox : Panel
{
    public List<Item> Items
    {
        get;
        set;
    }

    Size _ItemSpace = new Size(20, 20);
    Point _ItemLocation;
    int _rowelements = 0;

    public SmileBox(Point Location, int RowElements)
    {
        BackColor = Color.LightGray;

        Height = _ItemSpace.Height;
        Width = _ItemSpace.Width * RowElements;

        this.Location = new Point(Location.X, Location.Y - Height);
        _ItemLocation = new Point(0, 0);
        _rowelements = RowElements;
    }

    int count = 1;
    public void AddItem(Bitmap Image)
    {
        Item item = new Item(_ItemSpace, _ItemLocation, Image);

        if (_ItemLocation.X + _ItemSpace.Width >= Width)
            _ItemLocation = new Point(0, _ItemLocation.Y);
        else
            _ItemLocation = new Point(_ItemLocation.X + _ItemSpace.Width, _ItemLocation.Y);

        if (count == _rowelements)
        {
            _ItemLocation = new Point(_ItemLocation.X, _ItemLocation.Y + _ItemSpace.Height);
            Height += _ItemSpace.Height;
            Location = new Point(Location.X, Location.Y - _ItemSpace.Height);

            count = 0;
        }

        count++;

        Controls.Add(item);
    }
}

class Item : PictureBox
{
    int _BorderSpace = 2;

    public Item(Size Size, Point Location, Bitmap Image)
    {
        this.Size = new Size(Size.Width - 2 * _BorderSpace, Size.Height - 2 * _BorderSpace);
        this.Location = new Point(Location.X + _BorderSpace, Location.Y + _BorderSpace);
        this.Image = new Bitmap(Image, this.ClientSize);

        Click += new EventHandler(delegate(object sender, EventArgs e)
        {
            //Here what do you want to do when the user click on the smile
        });

        MouseEnter += new EventHandler(delegate(object sender, EventArgs e)
        {
            Focus();
            Invalidate();
        });
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        this.Focus();
        base.OnMouseDown(e);
    }

    protected override void OnEnter(EventArgs e)
    {
        this.Invalidate();
        base.OnEnter(e);
    }

    protected override void OnLeave(EventArgs e)
    {
        this.Invalidate();
        base.OnLeave(e);
    }

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

        if (this.Focused)
        {
            ClientRectangle.Inflate(-1, -1);
            Rectangle rect = ClientRectangle;
            ControlPaint.DrawFocusRectangle(pe.Graphics, rect);
        }
    }
}

这是创建此代码的快照:

在此处输入图像描述

当你微笑结束时:

在此处输入图像描述

在这里您可以单击单个项目。

于 2012-06-05T10:37:39.653 回答
0

创建一个用户控件或一个新表单(如果你想要一个浮动的东西),每个表情都带有图片框。每当用户单击图片框(单击事件)时,您都可以注册单击并将笑脸粘贴到适当的位置。

实际上,您可以创建一个新的图片框类来继承内置类的所有内容,然后添加一个包含笑脸代码的公共字符串。您在事件中获得了发送者对象,因此您所要做的就是在 Click 事件的函数中读取该字符串。

于 2012-06-05T08:58:08.553 回答