как узнать высоту и ширину Rich edit'а в символах?

Тема в разделе "WASM.WIN32", создана пользователем _220, 10 май 2008.

  1. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    собственно сабж, нужно узнать сколько в него влазит, в ширину и высоту, в нем ничего нет(пустой).
     
  2. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    хороший вопрос .... может кто-нибудь знает ... ещё? - как заставить Рич эдит помещать начало первой строки в начало окна ( своего ) ? а не разрезать её пополам...некрасиво
     
  3. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    _220
    получаете размеры контрола, параметры фонта (полную высоту и среднюю ширину символа), который использовать будете. Делите первое на второе.
    непонятно
     
  4. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    а поконкретнее, размеры я могу узна ть GetClientRect'om, потом брошу EM_GETCHARFORMAT и узнаю высоту в символах (кстати это момент у меня вылетает, но я разберусь) . А как узнать длину (среднюю ширину шрифта)?
     
  5. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    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 ничего не меняется, как это исправить?
     
  6. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    _220
    потому что это ричэдит.

    исходя из заголовка:
    тебе надо брать заголовок из ричедита и вытаскивать оттуда фонт.
    центрирование текста так же задаётся тегом \qc, а снимается простым \par\pard.

    вобще советую
    скомпиль заголовок как в цитате выше,
    запихай его в чар*, и дописывая текст в неё, делай settext ричедиту.
    я так делал.
     
  7. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    если скролировать страницами - верхнюю строку ( ртф ) начинает отборажать как попало - может разрезать её ( вдоль ) .

    тоже самое, если txt - можно в принципе подобрать размер окна редактора к размеру шрифта, что-бы он отображался нормально, но если изменить после запуска размер шрифта... опять всё сикось-накось.

    ещё вопрос - можно ли получить координаты верхнего левого угла начала конкретной строки номер такой-то? но не "приблизительно"
     
  8. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    можешь, (высота шрифта+лайнспейсинг)*номер строки
     
  9. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    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 ) - вроде некие логические единицы.

    Проблема в том, что я не хочу использовать скролл-бар - убедился, что постранично ловчее во всех отношениях. Програмисты мелкософта в пылу заботы о пользователях сделали так, что последняя строка - показывается как первая на следующей странице и с этим ничего не поделать - приходится прятать последнюю строку.
    Но - теперь не могу изменить размер окна и шрифта ( т.е. предоставить пользователю возможность настройки - у меня то всё ОК ) - строки начинают отображаться сикось накось.

    Если бы удалось получать координаты верхнего левого угла первой отображаемой строки и точную высоту строк в пикселях..., то при изменени пользователем размера главного окна или шрифта, можно вычислить необходимый размер окна редактора - но что-то не видно как это сделать.
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    _220
    Ага, сначала GetClientRect, потом что-то вроде этого:
    Код (Text):
    1.     HFONT hFont;
    2.     ...
    3.     // Создать фонт
    4.  
    5.     SIZE TextSize;
    6.     HDC ScrDC = GetDC(NULL);
    7.     HDC MemDC = CreateCompatibleDC(ScrDC);
    8.     SelectFont(MemDC, hFont);
    9.  
    10.     GetTextExtentPoint32(MemDC, _T("x"), 1, &TextSize);
    11.  
    12.     ReleaseDC(NULL, ScrDC);
    13.     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. Конечно, если шрифт не моноширинный, то проблема не может быть поможена.
     
  11. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Шрифт моноширинный, а что такое не может быть поможена (решена?)