如何迭代CListCtrl的元素

How to iterate through elements of CListCtrl?

本文关键字:CListCtrl 元素 迭代 何迭代      更新时间:2023-10-16

简要描述:
我得到了一个CTreectrl类的实例,其中存储了对象,当选择一个对象时,会显示该对象的相应列表报告
我需要调整从CListCtrl派生的类MyListCtrl实例的列宽度,这样用户就可以在不调整列大小的情况下查看该列中的数据。

我如何处理任务:
我实现了从树中选择对象时调用的InitColumnWidth方法

    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;

需要帮助!

使用这个(用下面的代码替换for (int col = 0; col < NumCol; ++col)(:

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?
}

无需重新发明轮子。如果您只想调整列的大小以适应文本,请尝试:

for (int i = 0; i < NumCol; ++i)
    ListView_SetColumnWidth( m_hWnd, i, LVSCW_AUTOSIZE );