.NET Windows窗体鼠标为所有现有PictureBox控件输入效果

时间:2012-12-02 20:05:48

标签: c# windows forms hover components

我是新来的,这是我在这里发表的第一篇文章。如果我不遵守关于在SO上创建新问题的标准,我表示歉意。

过去几个小时我一直绞尽脑汁试图编写一个自定义类,这样我就可以在现有的PictureBox控件中添加一个新属性,允许我将Color设置为我的自定义属性,这样就可以了当用户悬停控件时,会导致使用所选颜色设置边框。

以下是我到目前为止编写的代码:

[ProvideProperty("HoverColor", typeof(PictureBox))]
public class PictureBoxHover : Component, IExtenderProvider
{
    private readonly Dictionary<IntPtr, Color> _hoverColors;
    public PictureBoxHover()
    {
        _hoverColors = new Dictionary<IntPtr, Color>();
    }
    public bool CanExtend(object extendee)
    {
        return (extendee is PictureBox);
    }
    public Color GetHoverColor(PictureBox picb)
    {
        Color color;
        if (_hoverColors.TryGetValue(picb.Handle, out color))
            return color;
        return Color.Empty;
    }
    public void SetHoverColor(PictureBox picb, Color color)
    {
        Color hoverColor;
        _hoverColors[picb.Handle] = color;
    }
}

上面的代码将自定义属性“HoverColor”添加到我的解决方案中的所有现有PictureBox控件 - 就像我需要的那样。我现在需要做的就是以某种方式让用户在鼠标悬停在控件上时使用设置颜色在我的PictureBox上绘制边框。

我不希望我的类继承PictureBox或Control类,因为这需要将所有PictureBox从ordinaly PictureBox更改为我的自定义PictureBox - 这就是为什么我想要'追加'这个自定义属性和普通PictureBox控件的功能。

非常感谢任何帮助=)

1 个答案:

答案 0 :(得分:0)

也许您可以通过使用自定义用户控件而不是为图片框创建扩展属性来更轻松地实现目标。以下是一个简单的示例:

public class FramedPictureBox : UserControl
{
    private readonly PictureBox _pictureBox;

    public FramedPictureBox()
    {
        const int FRAME_SIZE = 3;
        _pictureBox = new PictureBox
                          {
                              Left = FRAME_SIZE,
                              Top = FRAME_SIZE,
                              Width = Width - 2*FRAME_SIZE,
                              Height = Height - 2*FRAME_SIZE,
                              Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Top
                          };

        _pictureBox.MouseEnter += OnPictureBoxMouseEnter;
        _pictureBox.MouseLeave += OnPictureBoxMouseLeave;

        Controls.Add(_pictureBox);
    }

    protected override void OnLoad(EventArgs e)
    {
        var image = new Bitmap(_pictureBox.Width, _pictureBox.Height);
        var graphics = Graphics.FromImage(image);
        graphics.Clear(Color.White);

        _pictureBox.Image = image;

        base.OnLoad(e);
    }

    private void OnPictureBoxMouseEnter(object sender, EventArgs e)
    {
        BackColor = Color.Red;
    }

    private void OnPictureBoxMouseLeave(object sender, EventArgs e)
    {
        BackColor = SystemColors.Control;
    }
}