【问题标题】:winapi - rich edit control and vertical text layout (single line)winapi - 富编辑控件和垂直文本布局(单行)
【发布时间】:2020-01-14 10:58:12
【问题描述】:

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

编辑:

这样我得到了 PARAMFORMAT2 结构:

PARAFORMAT2 pf;
ZeroMemory(&pf, sizeof(pf));
pf.cbSize = sizeof(pf);
SendMessage(hwndRichEdit1, EM_GETPARAFORMAT, 0, (LPARAM)&pf);

dySpaceBefore 已初始设置为 0,您可以在随附的屏幕截图中看到效果。

我使用 Visual Studio 2017,MSFTEDIT_CLASS 在 Richedit.h 中定义为 L"RICHEDIT50W"

【问题讨论】:

    标签: winapi


    【解决方案1】:

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

    您尚未添加语言标签,但您可以在C 中执行此操作(另请参阅documentation 以获取EM_SETPARAFORMAT):

    //...
    PARAFORMAT2 pf2;
    pf2.cbSize = sizeof(PARAFORMAT2);
    pf2.dwMask = PFM_SPACEBEFORE; // Of course, you can OR in other bits/options to set!
    pf2.dySpaceBefore = 0;        // Will align to the top; use a small +ve value, if you prefer
    SendMessage(hWndEdit, EM_SETPARAFORMAT, 0, (LPARAM)&pf2);
    //...
    

    要获得垂直居中的文本需要更多的工作,因为您需要获得文本的高度(使用GetTextExtent)和控件的客户矩形的高度,然后使用(client_height - text_height)/2.

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

    【讨论】:

    • @Irbis OK - 这只是一个猜测,但也许可以尝试将编辑控件的样式设置为包含ES_MULTILINE(尽管我知道实际上只有一行) : 也许PARAFORMAT(2) 不适用于单行控件?
    • ES_MULTILINE 不会改变任何东西。
    【解决方案2】:

    我可以像这个快照显示的那样重现这个问题:

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

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

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

    代码示例:

       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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多