хороший вопрос .... может кто-нибудь знает ... ещё? - как заставить Рич эдит помещать начало первой строки в начало окна ( своего ) ? а не разрезать её пополам...некрасиво
_220 получаете размеры контрола, параметры фонта (полную высоту и среднюю ширину символа), который использовать будете. Делите первое на второе. непонятно
а поконкретнее, размеры я могу узна ть GetClientRect'om, потом брошу EM_GETCHARFORMAT и узнаю высоту в символах (кстати это момент у меня вылетает, но я разберусь) . А как узнать длину (среднюю ширину шрифта)?
CHARFORMAT cf; memset(&cf,0,sizeof(cf)); cf.dwMask = CFM_SIZE | CFM_FACE; SendMessage(hrich,EM_GETCHARFORMAT,0,(long)&cf); hhexlen = r.bottom/c.yHeight;;//здесь деление на ноль, потоиу что от SendMessage ничего не меняется, как это исправить?
_220 потому что это ричэдит. исходя из заголовка: тебе надо брать заголовок из ричедита и вытаскивать оттуда фонт. центрирование текста так же задаётся тегом \qc, а снимается простым \par\pard. вобще советую скомпиль заголовок как в цитате выше, запихай его в чар*, и дописывая текст в неё, делай settext ричедиту. я так делал.
если скролировать страницами - верхнюю строку ( ртф ) начинает отборажать как попало - может разрезать её ( вдоль ) . тоже самое, если txt - можно в принципе подобрать размер окна редактора к размеру шрифта, что-бы он отображался нормально, но если изменить после запуска размер шрифта... опять всё сикось-накось. ещё вопрос - можно ли получить координаты верхнего левого угла начала конкретной строки номер такой-то? но не "приблизительно"
invoke CreateWindowEx, WS_EX_TRANSPARENT, addr RichEditClass, 0, WS_CHILD or ES_MULTILINE or WS_VISIBLE or ES_AUTOVSCROLL or ES_NOHIDESEL, 36,50,608,493, hWnd,RichEditID,hInstance,0 Вот такой у меня РичЭдит. Высота шрифта (-14), строк в окне редактора - 29 и скроллится (постранично) нормально, шрифт Вердана. Но высота - это же не пиксели ( в пикселях тогда должно быть - 406 ) - вроде некие логические единицы. Проблема в том, что я не хочу использовать скролл-бар - убедился, что постранично ловчее во всех отношениях. Програмисты мелкософта в пылу заботы о пользователях сделали так, что последняя строка - показывается как первая на следующей странице и с этим ничего не поделать - приходится прятать последнюю строку. Но - теперь не могу изменить размер окна и шрифта ( т.е. предоставить пользователю возможность настройки - у меня то всё ОК ) - строки начинают отображаться сикось накось. Если бы удалось получать координаты верхнего левого угла первой отображаемой строки и точную высоту строк в пикселях..., то при изменени пользователем размера главного окна или шрифта, можно вычислить необходимый размер окна редактора - но что-то не видно как это сделать.
_220 Ага, сначала GetClientRect, потом что-то вроде этого: Код (Text): HFONT hFont; ... // Создать фонт SIZE TextSize; HDC ScrDC = GetDC(NULL); HDC MemDC = CreateCompatibleDC(ScrDC); SelectFont(MemDC, hFont); GetTextExtentPoint32(MemDC, _T("x"), 1, &TextSize); ReleaseDC(NULL, ScrDC); DeleteDC(MemDC); Затем, предположительно: rect.right -= 2*GetSystemMetrics(SM_CXFIXEDFRAME) + GetSystemMetrics(SM_CXVSCROLL); rect.bottom -= 2*GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYHSCROLL); А затем да, делить rect.right на TextSize.cx и rect.bottom на TextSize.cy. Конечно, если шрифт не моноширинный, то проблема не может быть поможена.