正常情况下,点击CListCtrl控件,系统会自动选中点击的CListCtrl的一行。怎么才能让用户点击列表时不能选?

解决方案 »

  1.   

    WM_LBUTTONDOWN 直接 return
      

  2.   

    把这个List control Disable掉
      

  3.   

    当鼠标点击动作的时候(OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)的开始),判断是否你要求不可选的那项,是的话直接返回,或者再把焦点设置回到上一个选中项。
    那就把你上一个选中项的号码储存在一个变量里(m_nIndex),判断是否你要求不可选的那项,是的话将焦点设回到m_nIndex项。void CUniListCtrlEntity::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

    if(pNMLV->iItem<0)return;
    if(pNMLV->uChanged==LVIF_STATE)
    {
    if(pNMLV->uNewState)
    {
                         if( 在这里判断pNMLV->iItem是不是你要求不可选的那项)
                          {
                                //是的话
               SetItemState(m_nIndex,LVIS_SELECTED| LVIS_FOCUSED,LVIS_SELECTED| LVIS_FOCUSED);
                 SetHotItem(m_nIndex);
               EnsureVisible(m_nIndex, FALSE);
                                 *pResult = -1;
                                 return;
                           }                   }
              }
         m_nIndex=pNMLV->iItem;
         *pResult = 0;
    }
      

  4.   

    对题目理解有误。
    直接屏蔽该ListCtrl的所有消息就可以了。
      

  5.   

    大致上是通过下面的代码实现的:void CMeasureView::OnNMCustomdrawList(NMHDR *pNMHDR, LRESULT *pResult)
    {
    // 取得NMLVCUSTOMDRAW结构
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); // 设置默认的返回标识
    *pResult = CDRF_DODEFAULT; // 如果是CDDS_PREPAINT消息,则要求系统返回CDDC_ITEMPREPAINT消息
    if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
    {
    *pResult = CDRF_NOTIFYITEMDRAW;
    }
    // 如果是CDDS_ITEMPREPAINT消息,则要求系统返回SubItem的PrePaint消息
    else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
    {
    *pResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    // 如果是SubItem的PrePaint消息
    else if (CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM)
    {
    // 画SubItem
    DrawSubItem(pLVCD);
    // 跳过其他画ListCtrl的操作
    *pResult = CDRF_SKIPDEFAULT;
    }
    }
    void CMeasureView::DrawSubItem(NMLVCUSTOMDRAW* pLVCD)
    {
    // 取得ListCtrl的DC
    CDC dc;
    dc.Attach(pLVCD->nmcd.hdc);
    // 取得该SubItem的所在列名
    CString strColName = GetColName(pLVCD->iSubItem);
    // 取得该SubItem的显示范围
    CRect rectSub;
    m_list.GetSubItemRect((int)pLVCD->nmcd.dwItemSpec, (int)pLVCD->iSubItem, LVIR_LABEL, rectSub);
    // 取得该SubItem的内容
    CString strValue;
    strValue = GetSubItemValue((int)pLVCD->nmcd.dwItemSpec, pLVCD->iSubItem); // 如果是P-CCPCH RSCP列,则根据其值画出柱状图
    if ("P-CCPCH RSCP" == strColName)
    {
    CRect rectFill;
    COLORREF rgbColor = RGB(0, 255, 0);
    // 根据实际的RSCP值设置柱状图的范围
    double dbPercent = CalcRSCPRect(strValue, rgbColor);
    rectFill = rectSub;
    rectFill.right = rectSub.left + (rectSub.Width() * dbPercent); // 画出柱状图
    dc.FillRect(rectFill, &CBrush(rgbColor));
    // 将SubItem内容填入列表中
    dc.DrawText(strValue, rectSub, DT_LEFT);
    }
    // 如果是其他列,则不画柱状图,只填入SubItem的内容
    else
    {
    dc.DrawText(strValue, rectSub, DT_LEFT);
    }
    }