编辑:根据对问题的进一步调查,对这个问题进行了重大编辑。
我正在开发一个程序 API,它显示以编程方式创建的丰富编辑控件。它允许调用者指定是使用纯文本还是富文本,如下所示:
void SetUseRichText(bool state)
{
DWORD textMode = SendDlgItemMessageW(GetWindowHandle(), GetControlID(), EM_GETTEXTMODE, 0, 0);
if (state)
{
textMode &= ~TM_PLAINTEXT;
textMode |= TM_RICHTEXT;
}
else
{
textMode &= ~TM_RICHTEXT;
textMode |= TM_PLAINTEXT;
}
SendDlgItemMessageW(GetWindowHandle(), GetControlID(), EM_SETTEXTMODE, textMode, 0);
}
此设置的主要目标是防止控件中的文本采用粘贴到控件中的文本的格式。如果程序本身可以修改字体之外的格式(它可以并且确实可以修改),那就太好了。
我遇到了一个问题,我希望能够控制控件中文本的行距。我有这个代码来做到这一点:
PARAFORMAT2 pf{};
pf.cbSize = sizeof(pf);
pf.dwMask = PFM_LINESPACING;
pf.bLineSpacingRule = value ? 3 : 0; // use twips, but no smaller than single-space
pf.dyLineSpacing = std::lround(value * 20.0);
SendDlgItemMessageW(GetWindowHandle(), GetControlID(), EM_SETPARAFORMAT, 0, reinterpret_cast<LPARAM>(&pf));
问题是,如果调用者将控件设置为
TM_PLAINTEXT
,那么 EM_SETPARAFORMAT
不起作用。 (SendMessage 返回 0。)我想我的问题是由多个部分组成的。
TM_PLAINTEXT
丰富的编辑控件的行间距?也许有某种不使用特定于控件的消息的方法?TM_PLAINTEXT
和 TM_RICHTEXT
都是位值,那么两者都已设置意味着什么? (或者如果两者都没有设置?)您看到EM_SETTEXTMODE上的备注了吗?
另一方面,纯文本控件不需要默认值, 文档结束标记,因此被省略。
所以有证据表明不能改变行距。有趣的事情会让你明白它。记事本可以修改行距吗?它没有这个功能。
关于设置
TM_PLAINTEXT
和TM_RICHTEXT
。
我发现一个错误如果你想在文本上设置
TM_RICHTEXT
和TM_PLAINTEXT
,你需要使用CHARFORMAT2W
。 PARAFORMAT2
只需设置段落格式即可。我已经测试过了。如果您设置CHARFORMAT2W
。它始终显示丰富编辑控件的字符格式。无论您设置其中之一,都可以,也可以没有。