我用了一个clistctrl我想实现如下功能
1.鼠标点一个后要整行被选中比如说
沥沥 789
妹妹 421
粼粼 542
我要是实现鼠标点 妹妹 或者 421这一行被选中 我现在是单个被选中
2.选中后要把被选中的这行 行号返回
3.要实现在点沥沥或者 789 这行被选中,但是妹妹 421这行还是被选中的
现在状况是前一行没有被选中了
4.第二次点被选中行是,这行就不被选中了
5.看是某button被turndown 当单行被选中是这个button被点亮,2行或者2行以上被选中时button又被turndown
那位大虾能帮我实现下,我查了相关函数不能被实现。
真的不愿意,帮我找到函数,告诉如何使用也可以,谢拉。
网友回复:添加 LIST的 NM_CLICK 事件加入
m_listCtrl.SetExtendedStyle(m_listCtrl.GetExtendedStyle()|LVS_EX_FULLROWSELECT);
int nItem=GetSelectionMark();
if(nItem> =1) GetDlgItem(IDC_BUTTON)-> EnableWindow(FALSE);
else GetDlgItem(IDC_BUTTON1)-> EnableWindow(TRUE);
网友回复:错了,用这个吧
添加 LIST的 NM_CLICK 事件加入
m_listCtrl.SetExtendedStyle(m_listCtrl.GetExtendedStyle()|LVS_EX_FULLROWSELECT);
int nItem=m_listCtrl.GetNextItem(-1,LVNI_SELECTED);
if(nItem> =1) GetDlgItem(IDC_BUTTON)-> EnableWindow(FALSE);
else GetDlgItem(IDC_BUTTON1)-> EnableWindow(TRUE);
网友回复:要先设置ListCtrl的属性:
SingleSelection: false
本篇文章来源于 www.itzhe.cn IT者网站 原文链接:http://www.itzhe.cn/article/20080904/218770.html
故总结了一下自己的使用经验,以供参考使用。
先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象,
然后这里我们的ListCtrl都是report形式,至于其他的如什么大图标,小图标
的暂时不讲,毕竟report是大众话的使用。其次,我们这里用条款一,条款二
来描述第一点,第二点,这个是参照《Effective C++》的叫法,俺觉得这么
叫比较COOL :)
条款一:设置ListCtrl的风格
在CSDN上常常看到有人问怎么设置风格的,他们ListCtrl的样子是一个列表
,有横条和竖条分界线,然后选中一行,要整一行都选中,而不是只有某一列
被选中,等等,这里给一个比较全面的设置方法。
//获得原有风格
DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE);
dwStyle &= ~(LVS_TYPEMASK);
dwStyle &= ~(LVS_EDITLABELS);
//设置新风格
SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE,
dwStyle,|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);
//设置扩展风格
DWORD styles =
LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES;
ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles,
styles );
其中LVS_EX_FULLROWSELECT 就是前面说得整行选中
LVS_EX_GRIDLINES 网格线(只适用与report风格的listctrl)
LVS_EX_CHECKBOXES 前面加个checkbox
pListCtrl->SetExtendedStyle( m_listctrl.GetExtendedStyle()
|LVS_EX_SUBITEMIMAGES);
这也是一个很重要的属性,这样的话,可以在列表中加ICON,记得windows的
任务管理器吗,你想做得那样,这个属性也要加哦,这个我以后会讲的~
条款二:加入列头
这是一个比较实质的东西,给列表框分列,然后加上列头
代码说话,来了
TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};
LV_COLUMN lvcolumn;
CRect rect;
m_listctrl.GetWindowRect(&rect);
for(int i=0;i<2;i++)
{
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT
| LVCF_WIDTH | LVCF_ORDER;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = rgtsz[i];
lvcolumn.iSubItem = i;
lvcolumn.iOrder = i;
if(i==0)
{
lvcolumn.cx = rect.Width()*3/5 ;
}
else
lvcolumn.cx = rect.Width()*2/5;
m_listctrl.InsertColumn(i, &lvcolumn);
}
这是插入两列的做法,你要插入20列??随便你,依样画葫芦~~
lvcolumn.mask 中那个mask可以有各种属性,具体去看msdn吧,
条款三:把记录,插入列表框中
int nIndex = m_listctrl.GetItemCount();
LV_ITEM lvitemAdd = {0};
lvitemAdd.mask = LVIF_TEXT;
lvitemAdd.iItem = nIndex ;
lvitemAdd.iSubItem