Frage

Brief description:
I got an instance of CTreectrl class where objects are stored, when an object is selected corresponding list report for that object is displayed.
I need to adjust width of columns of an instance of the class MyListCtrl which derives from CListCtrl so that data in that columns can be seen by user without resizing of columns.

How I approach my task:
I implement method InitColumnWidth which is called when object is selected from the tree

    void COwnListCtrl::InitColumnWidth ( unsigned const * defwidth, BOOL chars )
        {
            /* find the largest string in each column and set column width accordingly
            so that user no longer need to manually adjust columns width */

            RECT r;
            GetClientRect ( & r );
            int* arrOfMaxColumnWidth = new int[NumCol]; // array where max length for columns will be stored
            for (int i = 0; i < NumCol; ++i)
                arrOfMaxColumnWidth[i] = 0; // initialize
            tstring dataInColumn;
            double Scale = ( defwidth && chars ) ? GetCharAveWidth ( * GetFont () ) : ( r.right * 0.01 );
            int numberOfVisitedItems = 0;
            do
            {
                dataInColumn = _T(""); // initialize
                for (int col = 0; col < NumCol; ++col)
                {
                    //DWORD const itemData = this->GetItemData(numberOfVisitedItems);

                    dataInColumn = this->GetSubItemString(this->GetItemData(numberOfVisitedItems), col); 
                /* 1-st varaint returns only first row of the list 
           because GetItemData always returns zero, but I need to visit all rows */
                    dataInColumn = this->GetSubItemString(numberOfVisitedItems, col); 
   /* 2-nd variant, works for most objects from CTreeCtrl, but for a few of them assertion is raised, system reports on the corrupted heap and application terminates*/
                    if (dataInColumn.length() > arrOfMaxColumnWidth[col])
                        arrOfMaxColumnWidth[col] = dataInColumn.length();
                }
                ++numberOfVisitedItems;
            }
            while(dataInColumn.length() != 0); /* do{} while loop is used to get number of rows in the table
                                       as long as an empty string is read, which means that all rows were read*/
            for (int col = 0; col < NumCol; ++col)
                int tmp = ColWidth[col] = arrOfMaxColumnWidth[col] * Scale;
            ColWidth[0] = 100;

Need help!

War es hilfreich?

Lösung

use this (replace your for (int col = 0; col < NumCol; ++col) with the code below):

for (int col = 0; col < NumCol; ++col)
{
    int len = 0;
    for(int row = 0; this->GetItemCount(); ++row)
    {
        CString item = this->GetItemText(row, col);
        if(item.GetLength() > len) len = item.GetLength();
    }
    if (len > arrOfMaxColumnWidth[col])
        arrOfMaxColumnWidth[col] = len; // should you multiple it to Scale?
}

Andere Tipps

No need to reinvent the wheel. If you just want to resize the columns to fit the text try:

for (int i = 0; i < NumCol; ++i)
    ListView_SetColumnWidth( m_hWnd, i, LVSCW_AUTOSIZE );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top