winapi - богатый контроль редактирования и вертикальное расположение текста (одна строка) - PullRequest
0 голосов
/ 14 января 2020

Я заметил, что текст в элементе управления расширенного редактирования (только одна строка) не центрируется по вертикали. Расстояние между текстом и краем верхней границы больше, чем пространство между текстом и краем нижней границы. Это особенно видимое , когда высота элемента управления расширенного редактирования чуть больше высоты текста. PARAMFORMAT позволяет только установить горизонтальное выравнивание. Как установить вертикальное выравнивание / поля сверху вниз?

Редактировать:

Таким образом, я получаю структуру PARAMFORMAT2:

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

dySpaceBefore is Первоначально уже установлено значение 0, а эффект вы можете увидеть на прикрепленном снимке экрана.

Я использую Visual Studio 2017, MSFTEDIT_CLASS определяется в Richedit.h как L "RICHEDIT50W"

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Я могу воспроизвести эту проблему, как показано на снимке:

enter image description here

Кажется, что функция для центра вертикального выравнивания не поддерживается. Я отправил запрос на добавление внутренней функции.

Обходной путь использует EM_SETRECT , который может перемещаться вверх по текстовой области через ограничивающий прямоугольник, в который элемент управления dr aws текст. Следующие снимки показывают его эффекты:

enter image description here

enter image description here

Затем вы можете использовать его для настройки текст для отображения в центре между верхом и низом.

Пример кода:

   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);
0 голосов
/ 14 января 2020

Если вы используете элемент управления Rich Edit 2.0 , вы можете использовать структуру PARAFORMAT2 , в которой можно задать пробел перед текстом.

Вы не добавили языковой тег, но вот как вы это сделаете в C (см. Также документацию для 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.

Не стесняйтесь просить дальнейших разъяснений и / или объяснений. (Я может даже смогу предложить вам код на другом языке.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...