转载:https://blog.csdn.net/lsh_2013/article/details/44624239
1. CListCtrl 样式及设置
- LVS_ICON: 每个item显示大图标
- LVS_SMALLICON: 每个item显示小图标
- LVS_LIST: 显示一列带有小图标的item
- LVS_REPORT: 显示item详细资料
- 如windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”
- LONG lStyle;
- lStyle=GetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE); //获取当前窗口style
- lStyle &= ~LVS_TYPEMASK; //清除显示方式位
- lStyle |= LVS_REPORT; //设置style
- SetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE, lStyle); //设置style
LVS_ICON: 每个item显示大图标
LVS_SMALLICON: 每个item显示小图标
LVS_LIST: 显示一列带有小图标的item
LVS_REPORT: 显示item详细资料
如windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”
LONG lStyle;
lStyle=GetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE); //获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE, lStyle); //设置style
2. 扩展样式设置
- DWORD dwStyle = m_ListCtrl.GetExtendedStyle(); //获取当前扩展样式
- dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时)
- dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时)
- dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件
- m_ListCtrl.SetExtendedStyle(dwStyle); //设置扩展风格
DWORD dwStyle = m_ListCtrl.GetExtendedStyle(); //获取当前扩展样式
dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时)
dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时)
dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件
m_ListCtrl.SetExtendedStyle(dwStyle); //设置扩展风格
3. 数据插入
- m_ListCtrl.InsertColumn(0,“名称”,LVCFMT_LEFT,50); //插入列
- m_ListCtrl.InsertColumn(1,”备注”,LVCFMT_LEFT,50);
- //直接插入:
- int nRow=m_ListCtrl.InsertItem(0, “VC++”); //插入行
- m_ListCtrl.SetItemText(nRow,1,”Visual C++ 6.0”); //设置数据
- //LVITEM 结构插入:
- LVITEM item={0};
- item.iItem=0; //行号
- item.mask=LVIF_TEXT; /*LVIF_IMAGE支持图标*/;
- item.cchTextMax=15;//插入字符串长度
- item.pszText=”Visual C++ 6.0”;
- int nRow=m_ListCtrl.InsertItem(&item);
- m_ListCtrl.SetItemText(nRow,1,”Visual C++ 6.0”);
m_ListCtrl.InsertColumn(0,"名称",LVCFMT_LEFT,50); //插入列
m_ListCtrl.InsertColumn(1,"备注",LVCFMT_LEFT,50);
//直接插入:
int nRow=m_ListCtrl.InsertItem(0, "VC++"); //插入行
m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0"); //设置数据
//LVITEM 结构插入:
LVITEM item={0};
item.iItem=0; //行号
item.mask=LVIF_TEXT; /*LVIF_IMAGE支持图标*/;
item.cchTextMax=15;//插入字符串长度
item.pszText="Visual C++ 6.0";
int nRow=m_ListCtrl.InsertItem(&item);
m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0");
4. 一直选中Item
- 选中style中的 Show selection always,
- 或者添加扩展样式 LVS_SHOWSELALWAYS
选中style中的 Show selection always,
或者添加扩展样式 LVS_SHOWSELALWAYS
5. 选中和取消选中Item
- int nIndex = 0;
- //选中
- m_ListCtrl.SetItemState(nIndex,LVIS_SELECTED|
- LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
- //取消选中
- m_ListCtrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);
int nIndex = 0;
//选中
m_ListCtrl.SetItemState(nIndex,LVIS_SELECTED|
LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_ListCtrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);
6. 得到CListCtrl中所有行的checkbox的状态
- CString str;
- for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
- {
- if(m_ListCtrl.GetItemState(i, LVIS_SELECTED)==
- LVIS_SELECTED || m_ListCtrl.GetCheck(i))
- {
- str.Format(_T(”第%d行的checkbox为选中状态”), i);
- AfxMessageBox(str);
- }
- }
CString str;
for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
{
if(m_ListCtrl.GetItemState(i, LVIS_SELECTED)==
LVIS_SELECTED || m_ListCtrl.GetCheck(i))
{
str.Format(_T("第%d行的checkbox为选中状态"), i);
AfxMessageBox(str);
}
}
7. 得到CListCtrl中所有选中行的序号
- //方法一:
- CString str;
- for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
- {
- if(m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
- {
- str.Format(_T(”选中了第%d行”), i);
- AfxMessageBox(str);
- }
- }
- //方法二:
- POSITION pos=m_ListCtrl.GetFirstSelectedItemPosition();
- if(pos==NULL)
- TRACE0(”No items were selected!/n”);
- else
- {
- while(pos)
- {
- int nItem=m_ListCtrl.GetNextSelectedItem(pos);
- TRACE1(”Item %d was selected!/n”, nItem);
- //添加其他操作
- }
- }
//方法一:
CString str;
for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
{
if(m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("选中了第%d行"), i);
AfxMessageBox(str);
}
}
//方法二:
POSITION pos=m_ListCtrl.GetFirstSelectedItemPosition();
if(pos==NULL)
TRACE0("No items were selected!/n");
else
{
while(pos)
{
int nItem=m_ListCtrl.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!/n", nItem);
//添加其他操作
}
}
8. 得到item的信息
- TCHAR szBuf[1024];
- LVITEM lvi;
- lvi.iItem = nItemIndex;
- lvi.iSubItem = 0;
- lvi.mask = LVIF_TEXT;
- lvi.pszText = szBuf;
- lvi.cchTextMax = 1024;
- m_ListCtrl.GetItem(&lvi);
TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_ListCtrl.GetItem(&lvi);
9. 得到CListCtrl的所有列的header字符串内容
- LVCOLUMN lvcol;
- char str[256];
- int nColNum;
- CString strColumnName[3];//假如有3列
- nColNum = 0;
- lvcol.mask = LVCF_TEXT;
- lvcol.pszText = str;
- lvcol.cchTextMax = 256;
- while(m_list.GetColumn(nColNum, &lvcol))
- {
- strColumnName[nColNum] = lvcol.pszText;
- nColNum++;
- }
LVCOLUMN lvcol;
char str[256];
int nColNum;
CString strColumnName[3];//假如有3列
nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}
10. 使CListCtrl中一项可见,即滚动滚动条
- m_ListCtrl.EnsureVisible(i, FALSE);
m_ListCtrl.EnsureVisible(i, FALSE);
11. 得到CListCtrl列数
- int nHeadNum=m_ListCtrl.GetHeaderCtrl()->GetItemCount();
int nHeadNum=m_ListCtrl.GetHeaderCtrl()->GetItemCount();
12. 删除所有列
- 方法一:
- while(m_ListCtrl.DeleteColumn(0))
- //因为你删除了第一列后,后面的列会依次向上移动。
- 方法二:
- int nColumns = 3; //列数
- for(int i=nColumns-1; i>=0; i–)
- m_ListCtrl.DeleteColumn(i);
方法一:
while(m_ListCtrl.DeleteColumn(0))
//因为你删除了第一列后,后面的列会依次向上移动。
方法二:
int nColumns = 3; //列数
for(int i=nColumns-1; i>=0; i--)
m_ListCtrl.DeleteColumn(i);
13. 得到单击的CListCtrl的行列号
- 添加listctrl控件的NM_CLICK消息相应函数
- void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
- {
- //方法一:
- DWORD dwPos=GetMessagePos();
- CPoint point( LOWORD(dwPos), HIWORD(dwPos));
- m_ListCtrl.ScreenToClient(&point);
- LVHITTESTINFO lvinfo;
- lvinfo.pt=point;
- lvinfo.flags=LVHT_ABOVE;
- int nItem=m_ListCtrl.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;
- }
添加listctrl控件的NM_CLICK消息相应函数
void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
//方法一:
DWORD dwPos=GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos));
m_ListCtrl.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt=point;
lvinfo.flags=LVHT_ABOVE;
int nItem=m_ListCtrl.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. 判断是否点击在CListCtrl的checkbox上
- 添加listctrl控件的NM_CLICK消息相应函数
- void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
- {
- DWORD dwPos=GetMessagePos();
- CPoint point(LOWORD(dwPos), HIWORD(dwPos));
- m_ListCtrl.ScreenToClient(&point);
- LVHITTESTINFO lvinfo;
- lvinfo.pt=point;
- lvinfo.flags=LVHT_ABOVE;
- UINT nFlag;
- int nItem=m_ListCtrl.HitTest(point, &nFlag);
- //判断是否点在checkbox上
- if(nFlag==LVHT_ONITEMSTATEICON)
- {
- AfxMessageBox(”点在listctrl的checkbox上”);
- }
- *pResult = 0;
- }
添加listctrl控件的NM_CLICK消息相应函数
void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
DWORD dwPos=GetMessagePos();
CPoint point(LOWORD(dwPos), HIWORD(dwPos));
m_ListCtrl.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt=point;
lvinfo.flags=LVHT_ABOVE;
UINT nFlag;
int nItem=m_ListCtrl.HitTest(point, &nFlag);
//判断是否点在checkbox上
if(nFlag==LVHT_ONITEMSTATEICON)
{
AfxMessageBox("点在listctrl的checkbox上");
}
*pResult = 0;
}
15. 右键点击CListCtrl的item弹出菜单
- 添加CListCtrl控件的NM_RCLICK消息相应函数
- void CMyDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
- {
- NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
- if(pNMListView->iItem!=-1)
- {
- DWORD dwPos = GetMessagePos();
- CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
- CMenu menu;
- VERIFY( menu.LoadMenu( IDR_MENU1 ) );
- CMenu* popup = menu.GetSubMenu(0);
- ASSERT( popup != NULL );
- popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
- point.x, point.y, this );
- }
- *pResult = 0;
- }
添加CListCtrl控件的NM_RCLICK消息相应函数
void CMyDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem!=-1)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
CMenu menu;
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this );
}
*pResult = 0;
}
16. CListCtrl进行大数据量更新时,避免闪烁
- m_ListCtrl.SetRedraw(FALSE);
- //更新内容
- m_ListCtrl.SetRedraw(TRUE);
- m_ListCtrl.Invalidate();
- m_ListCtrl.UpdateWindow();
m_ListCtrl.SetRedraw(FALSE);
//更新内容
m_ListCtrl.SetRedraw(TRUE);
m_ListCtrl.Invalidate();
m_ListCtrl.UpdateWindow();
//或者参考 地址
17.举例
- BOOL CImageDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Add “About…” menu item to system menu.
- // IDM_ABOUTBOX must be in the system command range.
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- DWORD dwStyle = m_list.GetExtendedStyle(); //获取当前扩展样式
- dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时)
- dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时)
- m_list.SetExtendedStyle(dwStyle); //设置扩展风格
- m_list.InsertColumn(0,”ID”);
- m_list.InsertColumn(1,”位置(X)”);
- m_list.InsertColumn(2,”位置(Y)”);
- m_list.InsertColumn(3,”旋转角度(Angle)”);
- m_list.InsertColumn(4,”匹配分数(Score)”);
- CRect rect;
- m_list.GetClientRect(rect);
- m_list.SetColumnWidth(0,rect.Width()/5);
- m_list.SetColumnWidth(1,rect.Width()/5);
- m_list.SetColumnWidth(2,rect.Width()/5);
- m_list.SetColumnWidth(3,rect.Width()/5);
- m_list.SetColumnWidth(4,rect.Width()/5);</span>
- // Set the icon for this dialog. The framework does this automatically
- // when the application’s main window is not a dialog
- SetIcon(m_hIcon, TRUE);// Set big icon
- SetIcon(m_hIcon, FALSE);// Set small icon
- // TODO: Add extra initialization here
- return TRUE; // return TRUE unless you set the focus to a control
- }
BOOL CImageDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
DWORD dwStyle = m_list.GetExtendedStyle(); //获取当前扩展样式
dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时)
dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时)
m_list.SetExtendedStyle(dwStyle); //设置扩展风格
m_list.InsertColumn(0,"ID");
m_list.InsertColumn(1,"位置(X)");
m_list.InsertColumn(2,"位置(Y)");
m_list.InsertColumn(3,"旋转角度(Angle)");
m_list.InsertColumn(4,"匹配分数(Score)");
CRect rect;
m_list.GetClientRect(rect);
m_list.SetColumnWidth(0,rect.Width()/5);
m_list.SetColumnWidth(1,rect.Width()/5);
m_list.SetColumnWidth(2,rect.Width()/5);
m_list.SetColumnWidth(3,rect.Width()/5);
m_list.SetColumnWidth(4,rect.Width()/5);</span>
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
以上是本人做项目知识记录,部分内容来自网络,本着知识共享原则,不侵犯任何人权益!