Число ВИДИМЫХ символов/строк в multiline edit

Тема в разделе "WASM.WIN32", создана пользователем 0leg, 26 сен 2006.

  1. 0leg

    0leg New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2006
    Сообщения:
    20
    Здравствуйте!

    Подскажите, пожалуйста, как можно узнать число видимых символов или строк в многострочном edit-контроле. Или сколько символов из буфера будет отображено в его контексте.

    P.S. Нашел функцию GetTextExtentExPoint, но она позволяет узнать лишь сколько символов влезет по ширине (если я правильно понял). Но Edit у меня многострочный, и сколько строк влезет никак не могу узнать.

    Если кто-нибудь сталкивался с подобной задачей, подскажите, пожалуйста!
     
  2. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Ну так возьми фонт из контрола, его высоту и подели высоту едита на высоту фонта :)
    или что-то не так?
     
  3. 0leg

    0leg New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2006
    Сообщения:
    20
    Сейчас я примерно так и делаю, но там не только высота фонта, а + межстрочные интервалы. Но что-то не выходит... Значения получаются близкие к реальному числу отображаемых строк, но все же не то. Подостовернее способов нет?
     
  4. SmikeX

    SmikeX New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2003
    Сообщения:
    20
    заполучи...
    код очень старый, но вроде пашет в одной из аппликаций
    до сих пор, функция дает индекс последней видимой строки в
    CEdit
    для определения числа видимых строк закомментируй
    nIndex += GetFirstVisibleLine();

    Код (Text):
    1. class CEditDerived : public CEdit
    2. {
    3. public:
    4. int GetLastVisibleLine();
    5. //to do! add some other crap, here ..................
    6. }
    7.  
    8. //The function returns the index of last visible line or
    9. // -1 if it fails
    10. int CEditDerived::GetLastVisibleLine()
    11. {
    12.    int nIndex = -1;
    13.    int nLineIndex;
    14.    CString cstring;
    15.    CString cstringLeft;
    16.    RECT rectClient;
    17.    RECT rect;
    18.    GetClientRect(&rectClient);
    19.    CDC * pDC = GetDC();
    20.    pDC->SetMapMode(MM_TEXT);
    21.    pDC->SetBkMode(OPAQUE);
    22.    CFont * pFont = GetFont();
    23.    pDC->SelectObject(pFont);
    24.  
    25.    GetWindowText(cstring);
    26.    int nRetVal;
    27.    for(nIndex = 0; nIndex < GetLineCount(); nIndex++)
    28.    {
    29.       rect = rectClient;
    30.       nLineIndex = LineIndex(nIndex);
    31.       cstringLeft = cstring.Left(nLineIndex);
    32.       nRetVal = pDC->DrawText( (LPCTSTR)(cstringLeft), nLineIndex, &rect,
    33.          DT_CALCRECT|DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
    34.       if(((rect.bottom - rect.top)>rectClient.bottom) && nRetVal)
    35.       {
    36.          nIndex-=2;
    37.          break;
    38.       }
    39.    }
    40.    ReleaseDC(pDC);
    41.    nIndex += GetFirstVisibleLine();
    42.    return nIndex;
    43. }
     
  5. 0leg

    0leg New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2006
    Сообщения:
    20
    Спасибо за ответы!
    SmikeX - особенно спасибо! Правда этот код я еще не проверял - сделал делением высоты котрола на высоту фонта. Кривенько, но работает. Если что нипременно воспользуюсь!