Статусбар: ресайз панели по ширине текста

Тема в разделе "WASM.WIN32", создана пользователем rmn, 17 фев 2008.

  1. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    делаю так:
    Код (Text):
    1. hdc = GetDC(m_hStatusBar);
    2. hStatusFont = (HFONT)SendMessage(m_hStatusBar, WM_GETFONT, 0, 0l);
    3. hOldStatusFont = (HFONT)SelectObject(hdc, (HGDIOBJ)hStatusFont);
    4.  
    5. SendMessage(m_hStatusBar, SB_GETBORDERS, 0, (LPARAM)&nBorders);
    6.  
    7. for (i=0; i<DVSBARPARTSCOUNT; i++)
    8. {
    9.     GetTextExtentPoint32(hdc, szParts[i], lstrlen(szParts[i]), &PartSize);
    10.     nParts[i] = PartSize.cx;
    11.  
    12.     if (i) nParts[i] += (nParts[i-1] + nBorders[2]);
    13. }
    14.  
    15. SendMessage(m_hStatusBar, SB_SETPARTS, (WPARAM)DVSBARPARTSCOUNT, (LPARAM)nParts);
    16.  
    17. for (i=0; i<DVSBARPARTSCOUNT; i++)
    18.     SendMessage(m_hStatusBar, SB_SETTEXT, (WPARAM)i, (LPARAM)szParts[i]);
    19.  
    20. SelectObject(hdc, (HGDIOBJ)hOldStatusFont);
    21. ReleaseDC(m_hStatusBar, hdc);
    все равно текст не влезает. Как правильно сделать?
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    А с остальными подобными ф-ми не пробовали?
    GetTextCharacterExtra
    GetTextMetrics => tmMaxCharWidth * strlen // для италика не работает вроде
    и т.д. и т.п.
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    Для немоноширинных шрифтов tmMaxCharWidth - слишком много (а tmAveCharWidth - слишком мало :))
    GetTextExtentPoint32 правильно возвращает границы текста. Я что-то не учитываю в самом контроле (про левую границу знаю, но она не настолько широкая, чтобы "съедать" полтора символа)
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    После исправления:
    Код (Text):
    1. if (i) nParts[i] += (nParts[i-1] + nBorders[2] * 2);
    начал правильно считать (вроде).
    Получается, что nBorders[2] - это не граница между панелями, а ширина границы каждой панели (?).

    psdk: