Autosize a column to fit its content

m_listctrl.SetColumnWidth( 0, LVSCW_AUTOSIZE );

The following was contributed by Roger Onslow.

Here is a routine to auto-size columns. This routine allows for a minimum column width (so columns don't disappear, or get too small for inplace editing) and fits to the larger of the column heading and the actual cell values.

Declare the following functions:

     void AutoSizeColumns(int col = -1);
     int GetColumnCount() const;

And here they are:

#define MINCOLWIDTH 10  /* or whatever */

int CMyListCtrl::GetColumnCount() const {
     // get the header control
     CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
     // return the number of items in it - ie. the number of columns
     return pHeader->GetItemCount();
}

void CMyListCtrl::AutoSizeColumns(int col /*=-1*/) {
     // Call this after your list control is filled
     SetRedraw(false);
     int mincol = col < 0 ? 0 : col;
     int maxcol = col < 0 ? GetColumnCount()-1 : col;
     for (col = mincol; col <= maxcol; col++) {
          SetColumnWidth(col,LVSCW_AUTOSIZE);
          int wc1 = GetColumnWidth(col);
          SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);
          int wc2 = GetColumnWidth(col);
          int wc = MAX(MINCOLWIDTH,MAX(wc1,wc2));
          SetColumnWidth(col,wc);
     }
     // RecalcHeaderTips(); *** uncomment this if you use my header tips method
     SetRedraw(true);
     // Invalidate(); *** uncomment this if you don't use my SetRedraw function
}

If you don't supply a column number, it will resize all columns. If you do supply a column numner, it will resize that column only. For example, you may only want to resize the first column when you do label editing (or another column if you use inplace cell editing or combos). But you might want to resize all columns after loading the list control with data.

Notice that the use of SetRedraw to stop flickering. You should use my custom version of this to avoid problems with nested calls to SetRedraw (and to remove the need for a final call to Invalidate()).



Copyright 2015 QuinStreet Inc. All Rights Reserved.