2

私はここに新しく、これが私の最初の投稿です。ここ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 を通常の PictureBox からカスタム PictureBox に変更する必要があるためです。そのため、このカスタム プロパティと機能を通常の PictureBox コントロール。

どんな助けでも大歓迎です=)

4

1 に答える 1

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;
    }
}
于 2013-02-14T11:53:05.593 に答える