Winforms 在绘制复选框时,如何确定适当的大小?

Winforms 在绘制复选框时,如何确定适当的大小?,winforms,checkbox,size,Winforms,Checkbox,Size,我正在帮助某人将一大堆面板和700个精心放置的复选框转换成稍微理智一点的东西。我的计划是实现一个自定义控件,它使用ControlPaint类手动绘制复选框;这将使处理数据变得更容易,从表单中删除700个GDI句柄可能是一件好事* DrawCheckbox()接受图形、复选框的边界和按钮状态。边界似乎很有趣;我认为这种行为可能是: 如果我提供了太多的空间,我会在这些边界的中心画一个复选框 我得到一个与我指定的边界一样大的复选框 所以我用一个100x100的矩形作为边界进行了测试,发现结果是一个

我正在帮助某人将一大堆面板和700个精心放置的复选框转换成稍微理智一点的东西。我的计划是实现一个自定义控件,它使用ControlPaint类手动绘制复选框;这将使处理数据变得更容易,从表单中删除700个GDI句柄可能是一件好事*

DrawCheckbox()接受图形、复选框的边界和按钮状态。边界似乎很有趣;我认为这种行为可能是:

  • 如果我提供了太多的空间,我会在这些边界的中心画一个复选框
  • 我得到一个与我指定的边界一样大的复选框
所以我用一个100x100的矩形作为边界进行了测试,发现结果是一个100x100的复选框。有趣!但是,我只需要一个普通的旧复选框,它以系统默认的复选框大小显示。我希望它是对一些API函数(如GetSystemMetrics())的调用,但我不确定是否有什么是正确的路径。(也许是SM_CXMENUCHECK?这似乎只是偶然相关。)

CheckBoxRenderer以正确的大小渲染。我会用它,但我不喜欢不知道怎么做。所以我用反射器四处看看它在做什么。如果您使用某种视觉样式进行渲染,它将调用getThemPartSize(),这是一个相当复杂的API调用,但至少回答了如何获得视觉主题的大小。有趣的是,如果不使用视觉样式,它似乎返回一个硬编码大小:13x13。该系统的复选框大小是否真的硬编码为13像素的正方形,或者这只是微软的疏忽

这个问题的重点不是告诉我只使用CheckBoxRenderer。我已经在做了。我很想知道自己是如何找到尺寸的,在写这个用过的反射器的过程中,现在我很想知道尺寸是否是不能改变的


*我知道,即使你找到了一种使用负记忆的方法,在屏幕上显示700种东西也是个坏主意。这个项目的第二步是建议一个更理智的设计。DataGridView已经被认为是看起来不正确的东西。我试图一步一个脚印地去做,我也很好奇是否有办法确定系统的复选框大小。

有一种简单易行的方法来获取大小

1,将实际的复选框实例添加到表单中。 2、将其放置在看不见的位置。位置=(-1000,-1000) 3、将复选框文本设置为要测量的任何内容。 4、使用checkBox1.GetPreferredSize(Size.Empty)

然后给出首选大小,即使用当前文本设置绘制控件所需的实际大小