SysTools Logo SysTools


C, WinAPI: Adjust ListBox horizontal extent


// PATCH: listbox fix
// References and documentation links for this code:
// http://web.archive.org/web/20090826011441/http://support.microsoft.com/kb/66370
// ! http://forum.sources.ru/index.php?showtopic=207672
void AdjustListBoxHorizontalExtent(HWND hWndLstBox) {
HFONT hFont;
HDC hDCLstBox;
TEXTMETRIC tm;
DWORD dwExtent;
int i, cnt, len;
TCHAR *s;
SIZE sz;
  // get item count
  cnt = SendMessage(hWndLstBox, LB_GETCOUNT, 0, 0);
  // note that LB_ERR defined as (-1) so this check
  // also handles any other unwanted things
  if (cnt > 0) {
    // find most large string (in characters)
    len = 0;
    for (i = 0; i < cnt; i++) {
      // LB_ERR defined as (-1) so it's safe to call max() here
      len = max(len, SendMessage(hWndLstBox, LB_GETTEXTLEN, i, 0));
    }
    // found something?
    if (len > 0) {
      // allocate memory (in bytes)
      s = (TCHAR *) GetMem((len + 1) * sizeof(s[0]));
      // memory allocated?
      if (s) {
        // allocate GDI handles
        hDCLstBox = GetDC(hWndLstBox);
        hFont = (HFONT) SendMessage(hWndLstBox, WM_GETFONT, 0, 0);
        hFont = (HFONT) SelectObject(hDCLstBox, hFont);
        GetTextMetrics(hDCLstBox, (LPTEXTMETRIC) &tm);
        // find most large string (in pixels)
        dwExtent = 0;
        for (i = 0; i < cnt; i++) {
          len = SendMessage(hWndLstBox, LB_GETTEXT, i, (LPARAM) s);
          // got something?
          if (len > 0) {
            GetTextExtentPoint(hDCLstBox, s, len, &sz);
            dwExtent = max(dwExtent, sz.cx);
          }
        }
        dwExtent += tm.tmAveCharWidth;
        // free GDI handles
        SelectObject(hDCLstBox, hFont);
        ReleaseDC(hWndLstBox, hDCLstBox);
        // free memory
        FreeMem(s);
        // should dwExtent be fixed?
        if (SendMessage(hWndLstBox, LB_GETHORIZONTALEXTENT, 0, 0) < dwExtent) {
          SendMessage(hWndLstBox, LB_SETHORIZONTALEXTENT, dwExtent, 0);
          InvalidateRect(hWndLstBox, NULL, TRUE);
        }
      } // (s)
    } // (len > 0)
  } // (cnt > 0)
}

2015.04.15


[ Код ]