如何在WinForms中增加复选框的大小?

eqfvzcg8  于 2022-11-17  发布在  其他
关注(0)|答案(8)|浏览(316)

如何增加.Net WinForm中复选框的大小。我尝试了高度和宽度,但它不会增加框的大小。

dvtswwa3

dvtswwa31#

复选框的大小在Windows窗体中是硬编码的,您不能随意改变它。一个可能的解决方法是在现有复选框的顶部绘制一个复选框。这不是一个很好的解决方案,因为自动调整大小不再按原样工作,文本对齐方式也很混乱,但它是可用的。
将新类添加到项目中并粘贴下面所示的代码。编译。将新控件从工具箱顶部拖放到窗体上。调整控件的大小,以获得所需的框大小,并确保其宽度足以容纳文本。

using System;
using System.Drawing;
using System.Windows.Forms;

class MyCheckBox : CheckBox {
    public MyCheckBox() {
        this.TextAlign = ContentAlignment.MiddleRight;
    }
    public override bool AutoSize {
        get { return base.AutoSize; }
        set { base.AutoSize = false; }
    }
    protected override void OnPaint(PaintEventArgs e) {
        base.OnPaint(e);
        int h = this.ClientSize.Height - 2;
        Rectangle rc = new Rectangle(new Point(0, 1), new Size(h, h));
        ControlPaint.DrawCheckBox(e.Graphics, rc,
            this.Checked ? ButtonState.Checked : ButtonState.Normal);
    }
}
ars1skjm

ars1skjm2#

Properties窗口中有一个AutoSize选项;如果您通过将其更改为False来关闭它,您将能够修改CheckBox大小。

brtdzjyr

brtdzjyr3#

C#版本,来自a forum.codecall.net topic

class BigCheckBox : CheckBox
    {
        public BigCheckBox()
        {
            this.Text = "Approved";
            this.TextAlign = ContentAlignment.MiddleRight;              
        }

        public override bool AutoSize
        {
            set { base.AutoSize = false; }
            get { return base.AutoSize; }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            this.Height = 100;
            this.Width = 200;
            int squareSide = 80;

            Rectangle rect = new Rectangle(new Point(0, 1), new Size(squareSide, squareSide));

            ControlPaint.DrawCheckBox(e.Graphics, rect, this.Checked ? ButtonState.Checked : ButtonState.Normal);
        }
    }
8ulbf1ek

8ulbf1ek4#

一个简单的解决方法是使用CheckBox的外观属性。使用下面的代码使复选框看起来像一个按钮。它将作为一个复选框。现在,大小可以很容易地随文本大小沿着更改。

checkBox1.Appearance = Appearance.Button;
checkBox1.Font = new Font("Microsoft Sans Serif", 16);
checkBox1.AutoSize = false;
checkBox1.Size = new Size(100, 100);
zz2j4svz

zz2j4svz5#

它支持Flat

using System.Drawing;
using System.Windows.Forms;

public class TodoCheckBox : CheckBox
{
    public override bool AutoSize
    {
        get => base.AutoSize;
        set => base.AutoSize = false;
    }

    public TodoCheckBox()
    {
        this.TextAlign = ContentAlignment.MiddleRight;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        int h = this.ClientSize.Height - 2;
        var rc = new Rectangle(new Point(-1, this.Height / 2 - h / 2), new Size(h, h));
        if (this.FlatStyle == FlatStyle.Flat)
        {
            ControlPaint.DrawCheckBox(e.Graphics, rc, this.Checked ? ButtonState.Flat | ButtonState.Checked : ButtonState.Flat | ButtonState.Normal);
        }
        else
        {
            ControlPaint.DrawCheckBox(e.Graphics, rc, this.Checked ? ButtonState.Checked : ButtonState.Normal);
        }
    }
}
cclgggtu

cclgggtu6#

如果有人需要VB.NET代码,我会修改这段代码。我没有在类中使用AutoSize。项目构建后,控件应该添加到工具箱中。您可以在那里将AutoSize设置为False,就像设置其他控件一样。
如果有必要的话,我只是将类代码放在使用它的窗体的End Class下面。
为了说明AutoSize的作用,这个新控件的优点是可以将复选框的“框”部分做得更大。在普通的复选框中,不能更改框部分。
我看到的这个新控件的唯一缺点是,当您调整它的大小时,如果左对齐,则框部分会溢出文本;请使用TextAlign属性修复此问题。

Public Class NewCheckBox
    Inherits CheckBox

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        MyBase.OnPaint(e)

        'Make the box you check 3/4 the height
        Dim boxsize As Integer = Me.Height * 0.75
        Dim rect As New Rectangle(
            New Point(0, Me.Height / 2 - boxsize / 2),
            New Size(boxsize, boxsize)
        )

        ControlPaint.DrawCheckBox(e.Graphics, rect, If(Me.Checked, ButtonState.Checked, ButtonState.Normal))
    End Sub
End Class
wn9m85ua

wn9m85ua7#

使用一个不同的控件(例如标签或按钮),只需编写onclick事件,以可接受的方式更改其外观。

hjzp0vay

hjzp0vay8#

以下是我在Hi-Dpi场景(包括每个监视器)中使用的版本,其中TableLayoutPanels和所有内容都配置为“自动调整大小”模式(使用.NET Framework 4.8测试):

public class AutoSizeCheckBox : CheckBox
{
    public AutoSizeCheckBox()
    {
        Anchor = AnchorStyles.None;

        // uncomment for flat style
        // FlatStyle = FlatStyle.Flat;
    }

    public override bool AutoSize { get => false; set => base.AutoSize = false; }

    protected override void OnPaint(PaintEventArgs e)
    {
        OnPaintBackground(e); // we don't use base, so we must redraw focus ourselves

        var h = ClientSize.Height;
        var w = ClientSize.Width;
        var state = Checked ? ButtonState.Checked : ButtonState.Normal;
        if (FlatStyle == FlatStyle.Flat)
        {
            state |= ButtonState.Flat;
        }

        const int focusSize = 1;
        h -= focusSize * 2;
        var rc = new Rectangle(new Point((w - h) / 2, 0), new Size(h, h));

        if (Focused)
        {
            ControlPaint.DrawFocusRectangle(e.Graphics, rc);
        }

        if (FlatStyle != FlatStyle.Flat)
        {
            rc.Inflate(-focusSize, -focusSize);
        }
        ControlPaint.DrawCheckBox(e.Graphics, rc, state);
    }
}

相关问题