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

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
     int mincol = col < 0 ? 0 : col;
     int maxcol = col < 0 ? GetColumnCount()-1 : col;
     for (col = mincol; col <= maxcol; col++) {
          int wc1 = GetColumnWidth(col);
          int wc2 = GetColumnWidth(col);
          int wc = MAX(MINCOLWIDTH,MAX(wc1,wc2));
     // RecalcHeaderTips(); *** uncomment this if you use my header tips method
     // 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()).

More by Author

Must Read