MFC中多行静态文本的垂直居中

Bmy*_*est 5 mfc multiline vertical-alignment

如何CStatic使用文本自动换行(多行)使结果垂直居中在控件的矩形中?

我试图解决的问题是:我在 aCStatic旁边有一个控件,CComboBox它根据选择更新信息文本。该文本可以短也可以长,要求CStatic有时使用多行,有时不使用。我希望信息文本与CComboBox.

现在问题来了:

  • 如果我将CStatic唯一的 1 个文本行设为高,则它对于 1 行文本看起来不错,但多行不适合并且不会显示。

  • 如果我使CStatic更高以适应 2 行,它看起来很适合长文本(2 行),但 1 行文本向上移动,因为CStatic对齐顶部的文本。一个CStatic在问题中提到的行为会解决这个...

如果我无法轻松获得垂直居中的CStatic多行控件,另一种方法是根据其中的文本量调整控件 rect 的大小。但在这种情况下,我有一个不同的问题:

如何以编程方式找出CStatic特定宽度的文本需要多少行?

Roe*_*oel 5

不幸的是,您无法在CStatic.

你的下一个问题有一个解决方案,但使用起来有点痛苦。您要做的就是使用CDC::DrawTextExDT_CALCRECT标志来获取要格式化的文本的大小(以像素为单位)。通过将其除以一行文本的高度(在字体信息中给出,您可以从 中获取)DC,加上一些间距,我不确定它是多少 - 大概是一个固定的量,我不认为你可以使用DrawText) 指定行间距,您将获得您将获得的行数(近似值)。然后您可以调整控制矩形的大小。

想想看,您可能最好不要转换为线条,而只是将控件的大小调整到您获得的程度DrawTextEx:)

类似这样的事情通常需要一些实验才能完全正确,并且有时不同操作系统版本之间的行为有所不同。谨慎行事。

  • 问题是关于多行文本。当您应用 SS_CENTERIMAGE 时,自动换行不再起作用。我刚刚在 VS2008 / WinXP 上测试了它,它有这种行为。您尝试过使用多行文本吗?无论如何,我都会更新我的答案。 (2认同)