请问各大位大虾.小弟在做一个程序界面的时候CListCtrl出现了一些问题.想请各位给点意见.帮我个忙.我做的CListCtrl,里面经常会有数据的更新,就像股票一样.经常会有数据的变化.时快时慢,有时几秒钟更新一次,有时几十秒更新一次.而CListCtrl每次收到数据的时候.我用一个线程让他一直在跑,在显示的宽度大于字体的宽度.也就是每一列的列宽都大于显示字体的宽度.但我现在这样子所获得的字体的长度也就不是具体字体的实际长度.而且我这个clistctrl有时需要更换字体,有时需要切换中英文.所以字体的长度总没法取到适当的值.而如果以上每种做法都适应到的最短宽度对于一些字体来说就显得太长了.我现在的问题就是想问一下各位大虾.有个没有什么方法能像我们双击clistctrl两列之间的那个时候CListCtrl以最长内容的长度做为列宽的那种算法.能够得到字体的最长长度.也就是我所说的自适应. 请各位指教.小弟不胜感激.

解决方案 »

  1.   

    每列保存一个最大宽度(字符总宽度)
    改变字体可以响应WM_FONTCHANGE看看
    插入新内容之前计算每列的最大宽度,如果有变化就SetColumnWidth动态调整如果这些用在自绘的LISTCTRL要好一些。
      

  2.   

            CHeaderCtrl* pHeaderCtrl = m_list.GetHeaderCtrl();
            nColumnCount = pHeaderCtrl->GetItemCount()
    for (int i = 0; i < nColumnCount; i++)
    {
    m_list.SetColumnWidth(i, LVSCW_AUTOSIZE);
    int nColumnWidth = m_list.GetColumnWidth(i);
    m_list.SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
    int nHeaderWidth = m_list.GetColumnWidth(i); 
    m_list.SetColumnWidth(i, max(nColumnWidth, nHeaderWidth));
    }这段代码可以实现,但是最后一列在整个窗口比它长度要长的时候.最后一列会给拉得很长.还没有找到问题的解决办法.没办法让它只显示最后一列的长度.
      

  3.   


    // put this into the header file, in the public:section
    void AdjustColumnWidth();
    int GetColumnCount();
    // and this into the cpp file, in the public: section
    void CMyListCtrl::AdjustColumnWidth()
    {
              SetRedraw(FALSE);
              int nColumnCount = GetColumnCount();          for (int i = 0; i < nColumnCount; i++)
              {
                       SetColumnWidth(i, LVSCW_AUTOSIZE);
                       int nColumnWidth = GetColumnWidth(i);
                       SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
                       int nHeaderWidth = GetColumnWidth(i); 
                       SetColumnWidth(i, max(nColumnWidth, nHeaderWidth));
              }
              SetRedraw(TRUE);

    int CMyListCtrl::GetColumnCount()
    {
              CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl();
              return (pHeaderCtrl->GetItemCount());
    }