Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Richedit (центрировать по вертикали) [D6, WinXP]


Eug201 ©   (2002-09-06 10:40:00) 

Погомите, please!!!!

Срочно нужно решить проблему - время поджимает - не могу ничего придумать :(((

Вывожу текст в Richedit - только для просмотра. Нужно сделать так: если полоса вертикальной прокрутки не показывается - т.е. весь текст влазит в Richedit, то текст нужно отцентрировать по вертикали. В тексте живут разные шрифты и объекты.

Help!!


Alx2   (2002-09-09 09:06:00) [1]

>Eug201 © (06.09.02 15:32)
>Да для начала приблизительно: вставлять пустые строки перед
>текстом,
Природа не любит пустоты :)
Используй сообщения Em_SetRect, Em_GetRect для центровки.
С их помощью красиво центруется (или центрируется?)

Чтобы определить весь ли текст помещается в видимой области, а также определить размеры этой области, можно попробовать сообщение EM_GETFIRSTVISIBLELINE - для определения индекса первой видимой строки и пару EM_CHARFROMPOS/EM_POSFROMCHAR ( EM_CHARFROMPOS - с координатами нижнего правого угла прямоугольника, полученного с помощью em_getrect) - для определениия координаты нижней границы текста (она получается вызовом EM_POSFROMCHAR с параметром вернувшимся из EM_CHARFROMPOS и увеличенным на высоту соответсвующей строки).


Eug201   (2002-09-06 15:32:00) [2]

To Alx2: попробовал GetWindowLong(...) Спасибо!!!


Eug201   (2002-09-06 15:26:00) [3]

Вот еще с какой проблемой столкнулся: если строка пустая - то EM_GETCHARFORMAT высоту, естесвенно не выдает, а высота завист от размера шрифта :(( Но я пока просто заменяю на пробел. Может кто подскажет чего?


Alx2   (2002-09-06 14:19:00) [4]

>Наерное надо узнать, показал-ли он скроллбар.
Это просто:
Var Style : Integer;

begin
Style := GetWindowLong(RichEdit1.Handle,GWL_Style);
if Style and WS_VSCROLL<>0 then
ShowMessage("Есть вертикальный скроллбар");
end;


Eug201   (2002-09-06 13:53:00) [5]

To Alx2: Да для начала приблизительно: вставлять пустые строки перед текстом, в вообще-то, наверное надо будет из окошка richedit"а получить картинку, а потом ее отцентрировать. Может подскажешь, как проверить, влазит текст в richedit или нет? Без подсчета высоты. Наерное надо узнать, показал-ли он скроллбар.


Alx2   (2002-09-06 13:09:00) [6]

>Eug201 © (06.09.02 12:30)
>To Alx2: мне нужно по вертикали :(

Извини, невнимательно читал.

>Это правильно?

Похоже.
А как собрался центрировать?


Eug201   (2002-09-06 12:30:00) [7]

To Alx2: мне нужно по вертикали :(

Вообщем, если я правильно понял:

PPI_Y:=GetDeviceCaps(frmMain.Canvas.Handle,LOGPIXELSY);
..
//получаем высоту
SendMessage(reQuestionText.Handle,EM_GETCHARFORMAT,1,LParam(@MCharFormat));
LineHeight:=MCharFormat.yHeight;
..
//переводим из твипсов в пиксели
Text_Height:=Trunc(PPI_Y/1440*LineHeight);

Это правильно?


Alx2   (2002-09-06 11:34:00) [8]

А стиль ES_Center не помогает?


Anatoly Podgoretsky   (2002-09-06 10:54:00) [9]

По моему ты выдумаваешь для себя лишнюю проблемую
По умолчанию в 1 дюйме 72 пункта, это типографские системы измерения, а 1 твипс = 20 пунктов
Дальше просто узнаешь количество пикселей на дюйм и пересчитываешь


Eug201   (2002-09-06 10:43:00) [10]

Сейчас разбираюсь с EM_GETCHARFORMAT, чтобы расчитать высоту буковок, но он выдает все в твипсах! А размеры-то компонентов обычно в пикселях :(

Как мне из твипсов перевести в пиксели? Пока не нашел :((

twip
A unit of measurement, implemented as 1/20 of a point, or 1/1440 of an inch. There are 567 twips to a centimeter. Twips are screen-independent measurements. See also point. Contrast pixel.


Наверх

Титульная страница Поиск, карта сайта Написать письмо