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



Comments

  • thank

    Posted by googlefbb on 09/29/2007 06:01am

    I like it

    Reply
  • Nice Code

    Posted by cuongnq on 03/31/2006 07:25pm

    Thanks in advanced

    Reply
  • word wrap

    Posted by Legacy on 08/01/2002 12:00am

    Originally posted by: chaitra

    Instead of resizing the columns...can we word wrap within the cells??
    is this possible?

    -chaitra

    Reply
  • CListCtrl Column Width- Please send details of user extend facility

    Posted by Legacy on 07/08/2002 12:00am

    Originally posted by: Bala

    Hi,

    I want to change CListCtrl Column resize by end user, if end user changed once, they wants the same size upto the application close, even if they refresh. please send full details and full source code for this.

    Thanks & Regards
    bala...

    Reply
  • Problem with items with different fonts.

    Posted by Legacy on 03/11/2002 12:00am

    Originally posted by: Irena

    It doesn't work properly also when the font of list items differ. For example if part of items are in BOLD font and the other part aren't, calling SetColumnWidth( ..., LVSCW_AUTOSIZE ) will resize the column width according to a smallest font string.

    Does anybody have an idea how to make code to distinguish the different fonts?

    Reply
  • Last Column problem

    Posted by Legacy on 01/12/2000 12:00am

    Originally posted by: Gary Hoffer

    You may find that the last column is amde to fit the rest of the list control width. To avoid this add a dummy column before resizing and then delete it.

    Reply
  • Last Column problem

    Posted by Legacy on 01/12/2000 12:00am

    Originally posted by: Gary Hoffer

    You may find that the last column is made to fit the rest of the list control width. To avoid this add a dummy column before resizing and then delete it.

    Reply
  • why find MAX() of AUTOSIZE and AUTOSIZE_USEHEADER??

    Posted by Legacy on 07/21/1999 12:00am

    Originally posted by: Anton Riabov

    AFAIK it is not necessary to find maximum width of differently autosized columns, because AUTOSIZE_USEHEADER does the same thing - it counts header width when calculating maximum width. I.e. this maximum will always be the width received as a result of AUTOSIZE_USEHEADER.

    Summary: I suggest to remove calculations of maximum, and resizing with AUTOSIZE flag.

    Reply
  • Problom when the header font is changed

    Posted by Legacy on 02/15/1999 12:00am

    Originally posted by: Anil

    When the header font is changed, the alignment not working properly

    Reply
  • You must have javascript enabled in order to post comments.

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • This IDC study assists senior IT leaders in assessing the current state of their hybrid cloud management processes, governance models, technologies, and skills to identify gaps and create a road map for better aligning the organization's management model and tools with the emerging needs of complex, dynamic self-service hybrid cloud environments. This IDC MaturityScape identifies five maturity stages for hybrid cloud management based on a set of specific people, process, and technology dimensions and outcomes. …

  • As your content grows, it can be challenging to define the proper rules, regulations and policies that govern that content and ensure proper protection and compliance. Entrusting your content to Box – the only secure, modern content platform in the cloud – is the right first step. The next step is to evaluate your retention, disposition and defensible discovery needs and to establish the proper buy-in to satisfy all your needs. In this Information Governance webinar, learn how Box Governance can add …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date