它有文字,图像,然后是复选框,
我想使用更好的图像进行检查,但无法找到更改已检查和未检查图像的方法
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;
任何人都知道一个不需要我自己控制的人吗?
答案 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的人来说,还有另一种解决方案:
ImageList
控件并将其填入图像以反映已选中/未选中状态。Checkbox
控件的Appearance
属性设置为Button
(摆脱标准CheckBox图标)FlatStyle
属性设置为Flat
(以便控件看起来不像按钮)。FlatAppearance
属性组。即CheckedBackColor
,MouseDownBackColor
,MouseOverBackColor
,即将它们全部设置为Control
值。Checkbox
控件的ImageList
属性设置为ImageList
控件的名称。Checkbox
控件的Imageindex
和ImageAlign
属性以反映其当前状态。Checkbox
控件的TextImageRelation
属性(除非您需要,否则此值不会让文本和图像重叠)。即ImageBeforetext
值表示常用的CheckBox图标位置。现在唯一要做的就是在状态改变时更改图像,如下所示:
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