如下所示,OnColumnclickListSubvib响应LVN_COLUMNCLICK
现在的问题是,每次点击列表头排序时,进入程序的第一次点击无效,一定到第二次时才会有效
void CSubVibDlg::OnColumnclickListSubvib(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
//获取列的排序数据
PLISTSORTNODE_SubVib pItem = &m_tSortColumns[pNMListView->iSubItem];
pItem->pList        = &m_ctrlSubVib;
pItem->nColum       = pNMListView->iSubItem;
int iSub=pNMListView->iSubItem;
//设置三角头
CImageList *ImgHeaders = new CImageList;
    ImgHeaders->Create(8,8,ILC_MASK,1,1);
    ImgHeaders->Add(AfxGetApp()->LoadIcon(IDI_UP));
    ImgHeaders->Add(AfxGetApp()->LoadIcon(IDI_DOWN));

enum   { sizeOfBuffer = 256 };
TCHAR  lpBuffer[sizeOfBuffer];
HDITEM hdi;
hdi.pszText = lpBuffer;
hdi.cchTextMax = sizeOfBuffer;

CHeaderCtrl *pHdCtrl = m_ctrlSubVib.GetHeaderCtrl();
    pHdCtrl->SetImageList(ImgHeaders);  
ImgHeaders->Detach();//脱离掉才能显示出图片来!
ImgHeaders->DeleteImageList();

hdi.mask = HDI_TEXT | HDI_IMAGE;
pHdCtrl->GetItem(iSub, &hdi);
if ( pItem->nOrder == 0 )
{
pItem->nOrder = 1;
hdi.iImage=1;
}
else
{
pItem->nOrder = 0;
hdi.iImage=0;
}
    m_ctrlSubVib.SortItems(Compositor,(LPARAM)pItem); hdi.mask = HDI_IMAGE | HDI_FORMAT | HDI_TEXT/* | HDI_WIDTH*/;
hdi.fmt = HDF_LEFT | HDF_IMAGE | HDF_STRING;
pHdCtrl->SetItem(iSub,&hdi );

for (int i=0; i < m_ctrlSubVib.GetItemCount(); i++)  //根据索引调整内容,不影响原有数据
m_ctrlSubVib.SetItemData(i, i);  
*pResult = 0;
}

解决方案 »

  1.   

    http://bbs.csdn.net/topics/70473143
    与此帖中问题相同,有没有人遇到过或者提供点思路呢~
      

  2.   

    遇到过,因为第一次点击的时候默认控件获得焦点了。(控件本身也是CWnd,可以认为是个窗体)
    第二次点击有效因为已经选中焦点。就会触发你的代码了。直接说解决方法吧:
    可以在该控件父窗体的PretranslateMessage的地方截获该消息触发你的函数内容。
    传入坐标可以用HitTest来做模拟点击控件内容
      

  3.   

    不要LVN_COLUMNCLICK
    试下在HDN_ITEMCLICK消息中处理
      

  4.   


    代码好累赘哦! 
    最好 将“//设置三角头”部分放到 m_ctrlSubVib控件的初始化位置去。你的问题(点击2次才排序)。因为排序前要先设置排序用的序号Data。
             调整代码顺序!!!
             …………
             for (int i=0; i < m_ctrlSubVib.GetItemCount(); i++) 
                    m_ctrlSubVib.SetItemData(i, i);  
            m_ctrlSubVib.SortItems(Compositor,(LPARAM)pItem);
             …………