我想在List  Control有些记录(记录指的就是List  Control中的一行)前加上图标,(有些记录前不加图标)图标是个小喇叭,并且点击这个小喇叭可以弹出一个对话框或者一些其它的操作怎么实现

解决方案 »

  1.   

    定义一个CImageList对象,调用其Create函数创建,然后调用CListCtrl类的SetImageList函数,之后InsertItem的时候给出Image的索引值。
      

  2.   


    这个CImageList对象里面要有一个空白的ICON,最好放在第一的位置。这样你在InsertItem的时候不指定图标索引,就默认为“0”而显示一张空白的ICON,也就等于没有图片。
      

  3.   

    用SubItemHitTest判断鼠标点击的格点,如果在第一格,那么判断位置是否在图标区域。图标的大小你总是确定的吧
      

  4.   

    happyparrot 
    你说的我听的不是很明白,能不能给点详细的代码呢,多谢!
      

  5.   

    void CRouteInfoShowDlg::OnClkWplist(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NMLISTVIEW *pItem = (NMLISTVIEW*)pNMHDR;
            if(pItem->iSubItem == 0)//确定点击的是第一列
            {
                 CRect gridRc;
            m_WPList.GetSubItemRect(pItem->iItem,pItem->iSubItem,LVIR_BOUNDS,gridRc);
                    gridRc.right = gridRc.left + 16;//假设图标宽度为16
                    ClientToScreen(gridRc);
                    CPoint pt;
                    GetCursorPos(&pt);
                    if(gridRc.PtInRect(pt))
                    {
                         //弹出提示
                    }
            }
    }
    你测试一下,可能在坐标系转换过程中还不是完全正确。
      

  6.   

    响应ListCtrl的NM_CLICK通知,调用CListCtrl类的HitTest函数,判断得到的flags如果是LVHT_ONITEMICON就说明是点击图标。
      

  7.   

    我觉得happyparrot和满天星说的方法应该都可以实现我说的功能,
    happyparrot,我按照你说的方法试了一下,报了两个错误
    error C2065: 'm_WPList' : undeclared identifier
    error C2228: left of '.GetSubItemRect' must have class/struct/union type
    OnClkWplist(NMHDR* pNMHDR, LRESULT* pResult)这个函数是响应ListCtrl的消息函数还是自己随便添加的函数?还有'm_WPList' 是什么变量?to 满天星
    你说的方法我觉得应该还比较简单,但是我对HitTest函数不是太熟悉,看了msdn以后还是不太明白,是不是还要获得当前鼠标的位置,你能不能给点详细的代码呢,多谢!
      

  8.   

    int HitTest(
       CPoint pt,
       UINT* pFlags = NULL 
    );
    pt给鼠标坐标,pFlags给一个UINT型变量,函数返回后判断pFlags==LVHT_ONITEMICON。