请问怎么才能让CListCtrl的Item不能被选择 正常情况下,点击CListCtrl控件,系统会自动选中点击的CListCtrl的一行。怎么才能让用户点击列表时不能选? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WM_LBUTTONDOWN 直接 return 把这个List control Disable掉 当鼠标点击动作的时候(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;} 对题目理解有误。直接屏蔽该ListCtrl的所有消息就可以了。 大致上是通过下面的代码实现的: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); }} 高手:CSpinButton实现浮点型数的增加或减小时,为什么对手工输入数不能完成。。。。。。 关于色彩空间转换 附分求教:请各位资深程序员推荐一本VC++入门类经典!谢谢! 关于DLL的一个问题! 请问:下面的文件内容如何读取?急!急!急!在线实时等候!!!!!! 急!请问各位前辈,如何把一个按钮(Button)标题的字体改变? 怎样把视图中取得的字符串用提示条(象VC中那样)显示出来。 在VC程序中ADO连接 SQL SERVER数据库如何进行事务处理 请教打印数据过滤 如何获取树形控件里选中项目的完整路径? 如何在vc平台上编译c程序? 关于客户区大小
那就把你上一个选中项的号码储存在一个变量里(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;
}
直接屏蔽该ListCtrl的所有消息就可以了。
{
// 取得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);
}
}