Windows窗体中的自定义颜色对话框

时间:2014-01-01 20:45:13

标签: c# winforms colors colordialog

有没有办法在没有窗口边框的窗体上显示颜色对话框?为了让事情更加清晰,我希望它有点像Paint程序中使用的那样,这样我就能够改变在图片框上绘制的线条的颜色,而不必一次又一次地打开对话框:{{0 }}

我将它放在一个垂直的组合框中,我希望它能够适应它。可以吗?

3 个答案:

答案 0 :(得分:3)

您可以自己轻松构建它。使用TableLayoutPanelFlowLayoutPanel并添加一个小PictureBox列表,并在所需颜色上设置背景颜色。然后处理Click事件以返回/使用其背景颜色。

enter image description here

private void Form1_Load(object sender, EventArgs e)
{
    pictureBox3.Click += HandleColorPick;
    pictureBox4.Click += HandleColorPick;
    pictureBox5.Click += HandleColorPick;
    pictureBox6.Click += HandleColorPick;
    pictureBox7.Click += HandleColorPick;
    pictureBox8.Click += HandleColorPick;
    pictureBox9.Click += HandleColorPick;

}

private void HandleColorPick(object sender, EventArgs e)
{
    var s =(PictureBox) sender;
    MessageBox.Show(s.BackColor.ToString());
}

答案 1 :(得分:2)

您必须创建自己的调色板。

这是我用评论写的用户控件。我添加了一个OnSelectionChanged事件,当用户更改颜色时会触发该事件。

您可以使用设计器指定颜色,事件和其他属性,也可以对它们进行硬编码。

public partial class UserControl1 : UserControl
{
    // The event raised when a user changes color
    [Category("Behavior")]
    public event EventHandler OnSelectionChanged;

    /*
     * Properties
     * 
     */
    private Color[] m_Colors = new Color[] {}; // Colors on the palette
    private Color m_SelectedColor;             // Stores selected color
    private int m_MaxColorsPerLine = 14;       // Max colors per line

    public Color[] Colors
    {
        get { return m_Colors; }
        set { m_Colors = value; }
    }

    [Browsable(false)]
    public Color SelectedColor
    {
        get { return m_SelectedColor; }
    }

    public int MaxColorsPerLine
    {
        get { return m_MaxColorsPerLine; }
        set { m_MaxColorsPerLine = value; }
    }

    public UserControl1()
    {
        InitializeComponent();
    }

    private void UserControl1_Load(object sender, EventArgs e)
    {
        this.Controls.Clear();

        int COLOR_WIDTH = 16;
        int COLOR_HEIGHT = 16;

        // Border colors
        Color NEUTRAL_COLOR = Color.Black;
        Color HIGHLIGHTED_COLOR = Color.Orange;
        Color SELECTED_COLOR = Color.Red;         

        // Populate the palette
        for(int i = 0; i < m_Colors.Length; ++i)
        {
            // Get where the current color should be positioned.
            int linePos = (int)Math.Floor((double) i / m_MaxColorsPerLine);
            int colPos = i % m_MaxColorsPerLine;

            int posX = COLOR_WIDTH * colPos;
            int posY = COLOR_HEIGHT * linePos;

            // Create the panel that will hold the color
            Panel pnl = new Panel();
            pnl.Width = COLOR_WIDTH;
            pnl.Height = COLOR_HEIGHT;
            pnl.Location = new Point(posX, posY);
            pnl.BackColor = m_Colors[i];
            pnl.ForeColor = NEUTRAL_COLOR;

            // Change border color when highlighted
            pnl.MouseEnter += (s, args) => pnl.ForeColor = HIGHLIGHTED_COLOR;

            // Change border color when mouse leaves
            pnl.MouseLeave += (s, args) =>
            {
                if (pnl.Tag != null && (bool)pnl.Tag == true)
                {
                    pnl.ForeColor = SELECTED_COLOR; // restore selected border color on mouse leave if selected
                }
                else
                {
                    pnl.ForeColor = NEUTRAL_COLOR; // restore normal border color on mouse leave if not selected
                }
            };

            // Change border color when selected
            pnl.Click += (s, args) =>
            {
                if (pnl.Tag == null || (bool)pnl.Tag == false)
                {
                    pnl.ForeColor = SELECTED_COLOR;
                    pnl.Tag = true; // Use the Tag member to store whether the color is selected

                    m_SelectedColor = pnl.BackColor;

                    // Raise the SelectionChanged event if this panel is not already selected
                    if (OnSelectionChanged != null)
                    {
                        OnSelectionChanged(this, EventArgs.Empty);
                    }
                }

                // Unselect other colors
                foreach (Panel otherColor in this.Controls)
                {
                    if (otherColor == pnl)
                        continue;

                    if (pnl.Tag != null && (bool)pnl.Tag == true)
                    {
                        otherColor.ForeColor = NEUTRAL_COLOR;
                        otherColor.Tag = false;
                    }
                }
            };

            // Draw borders
            pnl.Paint += (s, args) =>
            {
                Rectangle outterRect = args.ClipRectangle;
                Rectangle innerRect = new Rectangle(outterRect.X + 1, outterRect.Y + 1, outterRect.Width - 3, outterRect.Height - 3);

                // Draw outter rectangle
                args.Graphics.DrawRectangle(
                new Pen(
                    new SolidBrush(pnl.ForeColor), 2),
                    outterRect);

                // Draw inner rectangle
                args.Graphics.DrawRectangle(
                new Pen(
                    Brushes.White, 1),
                    innerRect);
            };

            // Finally, add color panel to the control
            this.Controls.Add(pnl);

        }
    }
}

答案 2 :(得分:1)