一般带表头的列表,只要双击表头 item 间的间隙,那么表头会把 Column 的长度展开至最大。请问:当我要双击表头 item 的间隙后,Column 展开至我所需要的长度,需要怎样处理?我用Spy++ 捕获了(双击表头 item 间的间隙时)一些消息:(如下),但具体不知道如何处理。
HDM_GETITEMCOUNT
HDM_GETITEMRECT
HDM_LAYOUT
HDM_ORDERTOINDEX

解决方案 »

  1.   

    你列出的这些消息是程序发给HeadCtrl对其进行控制的,如果你想知道HeadCtrl被双击时会产生哪些消息,应该用SPY++监视HeadCtrl的父窗口,消息应该是HDN_XXX或NM_XXX。
      

  2.   

    列宽最终匹配的是该列具有最宽内容那一格的长度。我估计得重载listctrl才能很好的解决
      

  3.   

    处理HDN_DIVIDERDBLCLICK通知消息,然后自己随便设置。
      

  4.   

    你捕获双击等消息HDN_DIVIDERDBLCLICK,然后判断对应位置等,再做你的扩展处理...
      

  5.   

    确实处理 HDN_DIVIDERDBLCLICK 消息就可以了,下面是我的代码。但是每次都要自己计算一次同一 Column 下每行的内容文字长度,然后取得最长的。有点麻烦,请问有没有更好的办法获得该 Column 下内容的最长文字长度?
    if (HDN_DIVIDERDBLCLICK == lpNmhdr->code && GetHeader() == lpNmhdr->hwndFrom)
    {
    LPNMHEADER phdn = (HD_NOTIFY FAR* ) lParam;
    int iItem = phdn->iItem;
    LVCOLUMN lvcol;
    lvcol.mask = LVCF_WIDTH;
    GetColumn(iItem, &lvcol);

    int iColumnWidth = GetMaxTextWidthInColumn(iItem, AtlGetDefaultGuiFont());//获得该 Column 下内容最长的文字长度
    lvcol.mask = LVCF_WIDTH;
    lvcol.cx = iColumnWidth + 28;
    SetColumn(iItem, &lvcol);
    SetMsgHandled(TRUE);
    return 1;
    }
      

  6.   

    如果保存起来,估计逻辑也有点复杂,刚才测试了下,150 个 item 也不会有“慢”的痕迹,以后有需要再优化。
    最后感谢回帖的朋友~