Autosize a column to fit its content | CodeGuru

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: […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 6, 1998
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

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()).

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.