我正在帮助某人将大量的面板和700个精心布置的复选框转换成稍微更健全的东西。我的计划是实现一个自定义控件,它使用 ControlPaint 类手动绘制复选框;这样可以更轻松地处理数据,从表单中删除700个GDI句柄可能是件好事。*
ControlPaint.DrawCheckbox()采用 Graphics ,边界为复选框,以及 ButtonState 。界限似乎很有趣;我认为行为可能是:
所以我测试了100x100矩形的边界,发现结果是100x100复选框。有趣!但是,我只想要一个普通的旧复选框,它显示系统的默认大小,用于复选框。我预计它会调用某些API函数,如 GetSystemMetrics(),但我不确定任何突出的正确路径。 (也许SM_CXMENUCHECK?这似乎只是偶然相关。)
CheckBoxRenderer 以适当的大小呈现。我打算用它,但我不喜欢不知道该怎么做。所以我用Reflector探究它正在做什么。如果你使用某种视觉样式进行渲染,它会调用 GetThemePartSize(),这是一个相当复杂的API调用,但至少可以解答如何获得视觉主题的大小。有趣的是,如果没有使用视觉样式,它似乎返回硬编码大小:13x13。系统的复选框大小是否真的硬编码为13像素的正方形,或者这只是MS的懒惰疏忽?
这个问题的关键是不要告诉我只使用 CheckBoxRenderer 。我已经这样做了。我很好奇如何自己找到尺寸,并且在编写这个使用过的Reflector的过程中,现在我很好奇大小是否实际上是无法改变的。
* 我知道即使你找到一种使用负内存的方法,屏幕上有700个任何东西也是个坏主意。该项目的第2步建议采用更加理智的设计。 DataGridView已被解雇为一些看起来不正确的东西。我试图一步一步地做事,如果有办法确定系统的复选框大小,我也非常好奇。
答案 0 :(得分:1)
有一种获得尺寸的万无一失的方法。
1,您将一个实际的CheckBox实例添加到您的表单。 2,定位使其无法看到。位置=( - 1000,-1000) 3,将复选框文本设置为您要测量的任何内容。 4,使用checkBox1.GetPreferredSize(Size.Empty)
然后给出首选大小,即使用您提供的当前文本设置绘制该控件所需的实际大小。