我正在帮助某人转换一堆乱七八糟的面板和700个精心放置的复选框,并使之更加理智。我的计划是实现一个自定义控件,该控件使用ControlPaint类手动绘制复选框。这样可以更轻松地处理数据,并且从表单中删除700个GDI句柄可能是一件好事*。
ControlPaint.DrawCheckbox()接受Graphics,复选框的边界和ButtonState。界限似乎很有趣;我认为该行为可能是:
因此,我使用100x100矩形进行了边界测试,发现结果是100x100复选框。有趣!但是,我只想要一个普通的旧复选框,该复选框显示系统默认的复选框大小。我希望这将是对诸如GetSystemMetrics()之类的一些API函数的调用,但是我不确定是否有什么方法是正确的方法。 (也许是SM_CXMENUCHECK?这似乎只是偶然的关系。)
CheckBoxRenderer以正确的大小呈现。我将使用它,但是我不喜欢不知道该怎么做。因此,我与Reflector一起闲逛,看看它在做什么。如果您使用某种视觉样式进行渲染,它将调用GetThemePartSize(),这是一个相当复杂的API调用,但至少可以回答我如何获得视觉主题的尺寸。有趣的是,如果不使用视觉样式,则似乎会返回硬编码的尺寸:13x13。系统的复选框大小是否确实硬编码为13像素见方,还是MS的一个懒惰监督?
这个问题的重点不是要告诉我仅使用CheckBoxRenderer。我已经在做我很好奇如何找到自己的尺寸,在编写使用Reflector的过程中,现在我很好奇尺寸实际上是否无法更改。
*我知道,即使您找到一种使用负内存的方法,在屏幕上放置700个东西也不是一个好主意。该项目的第2步建议进行更合理的设计。 DataGridView已经被认为是不合适的东西。我试图一次使事情迈出一步,而且我也真的很好奇是否有一种方法可以确定系统的复选框大小。
最佳答案
有一种简单的方法来获取大小。
1,您将一个实际的CheckBox实例添加到您的窗体。
2,将其放置在无法看到的位置。位置=(-1000,-1000)
3,将复选框文本设置为要测量的内容。
4,使用checkBox1.GetPreferredSize(Size.Empty)
然后,这将给出首选大小,即使用您给定的当前文本设置绘制该控件所需的实际大小。
关于winforms - 绘制CheckBox时如何确定合适的尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3721664/