winapi-丰富的编辑控件和垂直文本布局(单行)

winapi-丰富的编辑控件和垂直文本布局(单行),winapi,Winapi,我注意到rich edit控件中的文本(只有一行)没有垂直居中。文本和顶部边框边缘之间的间距大于文本和底部边框边缘之间的间距。尤其是当富编辑控件的高度仅比文本高度大一点点时。PARAMFORMAT仅允许设置水平对齐。如何设置垂直对齐/上下边距 编辑: 这样我就得到了PARAMFORMAT2结构: PARAFORMAT2 pf; ZeroMemory(&pf, sizeof(pf)); pf.cbSize = sizeof(pf); SendMessage(hwndRichEdit1, E

我注意到rich edit控件中的文本(只有一行)没有垂直居中。文本和顶部边框边缘之间的间距大于文本和底部边框边缘之间的间距。尤其是当富编辑控件的高度仅比文本高度大一点点时。PARAMFORMAT仅允许设置水平对齐。如何设置垂直对齐/上下边距

编辑:

这样我就得到了PARAMFORMAT2结构:

PARAFORMAT2 pf;
ZeroMemory(&pf, sizeof(pf));
pf.cbSize = sizeof(pf);
SendMessage(hwndRichEdit1, EM_GETPARAFORMAT, 0, (LPARAM)&pf);
DespaceBefore最初已设置为0,您可以在附加的屏幕截图上看到效果

我使用Visual Studio 2017,MSFTEDIT_类在Richedit.h中定义为L“RICHEDIT50W”

如果您使用的是控件,则可以使用
PARAFORMAT2
,它可以选择设置文本前的空格

您尚未添加语言标记,但以下是如何在
C
中添加语言标记(另请参见for
EM\u SETPARAFORMAT
):

/。。。
副甲酸2 pf2;
pf2.cbSize=sizeof(PARAFORMAT2);
pf2.dwMask=PFM_SPACEBEFORE;//当然,您可以在其他位/选项中进行设置!
pf2.1=0;//将与顶部对齐;如果愿意,请使用较小的+ve值
SendMessage(HwnEdit、EM_SETPARAFORMAT、0、(LPRAM)和pf2);
//...
要获得垂直居中的文本需要更多的工作,因为您需要获得文本的高度(使用
GetTextExtent
)和控件的客户端矩形的高度,然后使用(客户端高度-文本高度)/2的“前间距”值


请随时要求进一步澄清和/或解释。(我甚至可以为您提供另一种语言的代码。)

我可以复制此问题,如以下快照所示:

垂直对齐中心似乎不支持任何功能。我已经在内部提交了一个功能请求

正在使用一种变通方法,它可以通过限制控件将文本绘制到的矩形向上移动文本区域。以下快照显示了其效果:

然后,您可以使用它来调整文本,使其显示在顶部和底部之间的中心

代码示例:

   HWND hwndEdit = CreateWindowEx(
       0,
       MSFTEDIT_CLASS,
       TEXT("EDIT"),
       WS_BORDER | WS_VISIBLE | WS_CHILD,
       20,
       20,
       100,
       32,
       hWnd,
       NULL,
       hInst,
       NULL);

   RECT rect;

   SendMessage(hwndEdit, EM_GETRECT, 0, (LPARAM)&rect);

   rect.top -= 2;
   rect.bottom -= 2;

   SendMessage(hwndEdit, EM_SETRECT, 1, (LPARAM)&rect);

@Irbis OK-这只是一个猜测,但是可以尝试将编辑控件的样式设置为包含
ES\u MULTILINE
(尽管我知道您实际上只有一行):可能
PARAFORMAT(2)
在单行控件上不起作用?ES\u MULTILINE不会改变任何东西。