如何更改复选框上的检查图像

时间:2013-04-04 14:19:52

标签: c# .net winforms checkbox

它有文字,图像,然后是复选框,

我想使用更好的图像进行检查,但无法找到更改已检查和未检查图像的方法

this.checkBox1.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
this.checkBox1.Checked = true;
this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked;
this.checkBox1.Image = global::ClientExam.Properties.Resources.action32;
this.checkBox1.Location = new System.Drawing.Point(145, 140);
this.checkBox1.Name = "checkBox1";
this.checkBox1.Size = new System.Drawing.Size(273, 127);
this.checkBox1.TabIndex = 0;
this.checkBox1.Text = "checkBox1";
this.checkBox1.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage;
this.checkBox1.UseVisualStyleBackColor = true;

任何人都知道一个不需要我自己控制的人吗?

4 个答案:

答案 0 :(得分:9)

如果您正在寻找如何在Winforms中执行此操作,简单的答案是创建一个派生自CheckBox的新复选框类,然后覆盖OnPaint方法。

以下是有关如何通过覆盖OnPaint方法创建自定义复选框的示例:

public class CustomCheckBox : CheckBox
{
    public CustomCheckBox()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    }

    protected override void OnPaint(PaintEventArgs pevent)
    {
        base.OnPaint(pevent);
        if (this.Checked)
        {
            pevent.Graphics.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(0, 0, 16, 16));
        }
        else
        {
            pevent.Graphics.FillRectangle(new SolidBrush(Color.Red), new Rectangle(0, 0, 16, 16));
        }
    }
}

这很简单,但它给你基本的想法。

答案 1 :(得分:6)

对于任何不想重写OnPaint的人来说,还有另一种解决方案:

  1. 添加ImageList控件并将其填入图像以反映已选中/未选中状态。
  2. Checkbox控件的Appearance属性设置为Button(摆脱标准CheckBox图标)
  3. 将其“FlatStyle属性设置为Flat(以便控件看起来不像按钮)。
    注意:您可能还想检查其“FlatAppearance属性组。即CheckedBackColorMouseDownBackColorMouseOverBackColor,即将它们全部设置为Control值。
  4. Checkbox控件的ImageList属性设置为ImageList控件的名称。
  5. 设置Checkbox控件的ImageindexImageAlign属性以反映其当前状态。
  6. 最后也是最重要的是设置Checkbox控件的TextImageRelation属性(除非您需要,否则此值不会让文本和图像重叠)。即ImageBeforetext值表示常用的CheckBox图标位置。
  7. 现在唯一要做的就是在状态改变时更改图像,如下所示:

        private void chkMyCheckBoxWithAnImage_CheckedChanged(object sender, EventArgs e)
        {
            if (chkMyCheckBoxWithAnImage.Checked)
                chkMyCheckBoxWithAnImage.ImageIndex = 1;
            else
                chkMyCheckBoxWithAnImage.ImageIndex = 0;
        }
    

答案 2 :(得分:0)

我以不同的方式解决这个问题,我使用背景图像并将其居中,然后在更改检查时更改主图像。 这似乎就像我想要的那样。

这有一个问题,背景图片如果尺寸不合适,检查图像不足,所以看起来不正确。

正如icemanind所描述的那样正确的解决方案。

答案 3 :(得分:-1)

一个简单的:

覆盖复选框OnPaint(PaintEventArgs e),如下所示:

Graphics g = e.Graphics;

        base.OnPaint(e);
        //// Fill the background
        //SetControlSizes();

        // Paint the outer rounded rectangle
        g.SmoothingMode = SmoothingMode.AntiAlias;
        using (GraphicsPath outerPath = GeneralUtilities.RoundedRectangle(mLabelRect, 1, 0))
        {
            using (LinearGradientBrush outerBrush = new LinearGradientBrush(mLabelRect,
                   mGradientTop, mGradientBottom, LinearGradientMode.Vertical))
            {
                g.FillPath(outerBrush, outerPath);
            }
            using (Pen outlinePen = new Pen(mGradientTop, mRectOutlineWidth))
            {
                outlinePen.Alignment = PenAlignment.Inset;
                g.DrawPath(outlinePen, outerPath);
            }
        }

        //// Paint the gel highlight
        using (GraphicsPath innerPath = GeneralUtilities.RoundedRectangle(mHighlightRect, mRectCornerRadius, mHighlightRectOffset))
        {
            using (LinearGradientBrush innerBrush = new LinearGradientBrush(mHighlightRect,
                   Color.FromArgb(mHighlightAlphaTop, Color.White),
                   Color.FromArgb(mHighlightAlphaBottom, Color.White), LinearGradientMode.Vertical))
            {
                g.FillPath(innerBrush, innerPath);
            }
        }
        // Paint the text
        TextRenderer.DrawText(g, Text, Font, mLabelRect, Color.White, Color.Transparent,
        TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis);

但如果你想拥有一个好的,你必须使用wpf CheckBox ControlTemplate Example