VC++学习-控件篇(列表控件listcontrol)

VC++学习-控件篇(列表控件listcontrol)
转载⽤于后续查看
编程环境:VS2013,MFC
List Control控件,是个列表,对应的类为CListCtrl。下⾯没有说明的,默认风格都为report。
⼀、基本的使⽤
1.初始化风格
对于style的(报表风格、单选模式等)设置;对于ExtendedStyle(⽹格添加、item前添加check box等)的设置;例:对于⼀个关联变量为m_Errorlist的List Control初始化:
LVS_ICON: 为每个item显⽰⼤图标
LVS_SMALLICON: 为每个item显⽰⼩图标
LVS_LIST: 显⽰⼀列带有⼩图标的item
LVS_REPORT: 显⽰item详细资料
直观的理解:windows资源管理器,“查看”标签下的“⼤图标,⼩图标,列表,详细资料”
LONG lStyle;
lStyle =GetWindowLong(m_Errorlist.m_hWnd,GWL_STYLE);//获取当前窗⼝style
lStyle &=~LVS_TYPEMASK;//清除显⽰⽅式位
lStyle |=LVS_REPORT;//设置style
lStyle |=LVS_SINGLESEL;//单选模式
SetWindowLong(m_Errorlist.m_hWnd,GWL_STYLE, lStyle);//设置style
DWORD dwStyle = m_Errorlist.GetExtendedStyle();
dwStyle |=LVS_EX_FULLROWSELECT;//选中某⾏使整⾏⾼亮(只适⽤与report风格的listctrl)
dwStyle |=LVS_EX_GRIDLINES;//⽹格线(只适⽤与report风格的listctrl)
dwStyle |=LVS_EX_CHECKBOXES;//item前⽣成checkbox控件
m_Errorlist.SetExtendedStyle(dwStyle);//设置扩展风格
2.插⼊列、⾏
插⼊列:参数分别为(列位置0、列标题为Amp Enable、位置居中、列宽度、列索引号0)
m_ErrorList.InsertColumn(0,"Amp Enable",LVCFMT_CENTER, EnableListCtrlRect.Width()*1/1,0);
插⼊⾏:参数分别为(⾏索引0、⾏标题)
m_Errorlist.InsertItem(0,"caption");
3.插⼊⼦项:参数分别为(⾏索引号、列索引号、⼦项内容)
m_ListCtr.SetItemText(0,1,"content");
int nRow = m_ListCtrl.GetItemCount();//列表控件⾏数
int nCol = m_ListCtrl.GetHeaderCtrl()->GetItemCount();//列表控件列标题数量
for(int i =0; i < nRow; i++)
{
for(int j =0; j < nCol; j++)
{
CString str = m_ListCtrl.GetItemText(i, j);//获取i⾏j列数据
}
}
清除列表控件标题
m_ListCtrl.DeleteColumn(i);
4、已知选中item
选中style中的Show selection always选项,设置为true,或者在上⾯第2点中设置LVS_SHOWSELALWAYS
设置为true后,当选中某⼀个item,这个item就会⼀直被选中,知道选中下⼀个或者都不选。
5、选中和取消选中⼀⾏
//选中
m_list.SetItemState(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED); //取消选中
m_list.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);
6、得到listctrl中所有⾏的checkbox的状态
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED|| m_list.GetCheck(i))
{
str.Format(_T("第%d⾏的checkbox为选中状态"), i);
DNA变性与杂交
AfxMessageBox(str);
联系人管理}
}
7、得到listctrl中所有选中⾏的序号
⽅法⼀:
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED)
{
str.Format(_T("选中了第%d⾏"), i);
AfxMessageBox(str);
}
}
⽅法⼆:
POSITION pos = m_list.GetFirstSelectedItemPosition();
if(pos ==NULL)
TRACE0("No items were selected!\n");
else
{
while(pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}
8、得到item的信息
TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem =0;
lvi.mask =LVIF_TEXT;
lvi.pszText = szBuf;
m_list.GetItem(&lvi);海量数据查询
9、得到listctrl的所有列的header字符串内容
char  str[256];
int  nColNum;
CString  strColumnName[4];//假如有4列
nColNum =0;
lvcol.mask =LVCF_TEXT;
lvcol.pszText = str;
while(m_list.GetColumn(nColNum,&lvcol))
{
strColumnName[nColNum]= lvcol.pszText;
nColNum++;
}
10、使listctrl中⼀项可见,即滚动滚动条
m_list.EnsureVisible(i,FALSE);
11、得到listctrl列数
int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
12、删除所有列
⽅法⼀:
while( m_list.DeleteColumn(0))
因为删除了第⼀列后,后⾯的列会依次向上移动。⽅法⼆:
int nColumns =4;
for(int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn(i);
13、得到单击的listctrl的⾏列号
添加listctrl控件的NM_CLICK消息相应函数
// ⽅法⼀:
/*
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
int nItem = m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
CString strtemp;
strtemp.Format("单击的是第%d⾏第%d列", lvinfo.iItem, lvinfo.iSubItem);          AfxMessageBox(strtemp);
}
*/
// ⽅法⼆:
/*
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("单击的是第%d⾏第%d列",
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*/
*pResult =0;
}
14、判断是否点击在listctrl的checkbox上
添加listctrl控件的NM_CLICK消息相应函数
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR,LRESULT* pResult)
{
DWORD dwPos =GetMessagePos();
CPoint point(LOWORD(dwPos),HIWORD(dwPos));
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
导热油配方
lvinfo.pt = point;
lvinfo.flags =LVHT_ABOVE;
UINT nFlag;
int nItem = m_list.HitTest(point,&nFlag);
//判断是否点在checkbox上
if(nFlag ==LVHT_ONITEMSTATEICON)
{
AfxMessageBox("点在listctrl的checkbox上");
}
*pResult =0;
}
石墨密封圈
15、右键点击listctrl的item弹出菜单
添加listctrl控件的NM_RCLICK消息相应函数
NM_LISTVIEW* pNMListView =(NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem !=-1)
{
m_pRClickMenu =new CMenu();
ASSERT(m_pRClickMenu !=NULL);
m_pRClickMenu->CreatePopupMenu();
m_pRClickMenu->AppendMenu(MF_STRING,IDC_BTN_SEND_EMAIL,"发送邮件");
m_pRClickMenu->AppendMenu(MF_STRING,IDC_BTN_COPY,"复制到剪切板");
// DWORD dwPos = GetMessagePos();
/
/ CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
CPoint point;
GetCursorPos(&point);
m_pRClickMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y,this,NULL);
}
*pResult =0;
}
16、item切换焦点时(包括⽤键盘和⿏标切换item时),状态的⼀些变化顺序
添加listctrl控件的LVN_ITEMCHANGED消息相应函数
void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR,LRESULT* pResult)
{
NM_LISTVIEW* pNMListView =(NM_LISTVIEW*)pNMHDR;
aoi测试// TODO: Add your control notification handler code here
CString sTemp;
if((pNMListView->uOldState &LVIS_FOCUSED)==LVIS_FOCUSED&&
(pNMListView->uNewState &LVIS_FOCUSED)==0)
{
sTemp.Format("%d losted focus",pNMListView->iItem);
}
else if((pNMListView->uOldState &LVIS_FOCUSED)==0&&
(pNMListView->uNewState &LVIS_FOCUSED)==LVIS_FOCUSED)
{
sTemp.Format("%d got focus",pNMListView->iItem);
}
if((pNMListView->uOldState &LVIS_SELECTED)==LVIS_SELECTED&&
(pNMListView->uNewState &LVIS_SELECTED)==0)
{
sTemp.Format("%d losted selected",pNMListView->iItem);
}
else if((pNMListView->uOldState &LVIS_SELECTED)==0&&
(pNMListView->uNewState &LVIS_SELECTED)==LVIS_SELECTED)
{
sTemp.Format("%d got selected",pNMListView->iItem);
}
*pResult =0;
}
17、listctrl内容进⾏⼤数据量更新时,避免闪烁。
m_list.SetRedraw(FALSE);
//更新内容
m_list.SetRedraw(TRUE);
// m_list.Invalidate();
// m_list.UpdateWindow();
18、listctrl第⼀列始终居左,解决办法
把第⼀列当成虚列,然后插⼊第⼆列及数据,最后删除第⼀列,以后列还是从0开始。

本文发布于:2024-09-21 12:32:39,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/161276.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:选中   控件   列表   风格
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议