首先构造一个带有 勾选框listCtrl
LONG lStyle; lStyle = GetWindowLong(m_list_stock.m_hWnd, GWL_STYLE);// 获取当前窗口style lStyle &= ~LVS_TYPEMASK; // 清除显示方式位 lStyle |= LVS_REPORT; // 设置style SetWindowLong(m_list_stock.m_hWnd, GWL_STYLE, lStyle);// 设置style DWORD dwStyle = m_list_stock.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;// 选中某行使整行高亮(只适用与report 风格的listctrl ) dwStyle |= LVS_EX_GRIDLINES;// 网格线(只适用与report 风格的listctrl ) dwStyle |= LVS_EX_CHECKBOXES;//item 前生成checkbox 控件 m_list_stock.SetExtendedStyle(dwStyle); // 设置扩展风格 CRect mRect; m_list_stock.GetWindowRect(&mRect); //获取控件矩形区域 float kuan = (mRect.Width() -50)/4; m_list_stock.InsertColumn( 0, _T("行号"), LVCFMT_LEFT, 50 );// 插入列 m_list_stock.InsertColumn( 1, _T("证券代码"), LVCFMT_LEFT, kuan );// 插入列 m_list_stock.InsertColumn( 2, _T("证券名称"), LVCFMT_LEFT, kuan );// 插入列 m_list_stock.InsertColumn( 3, _T("证券数量"), LVCFMT_LEFT, kuan ); m_list_stock.InsertColumn( 4, _T("昨日收盘价"), LVCFMT_LEFT, kuan-3);
/
1. 插入数据 (这种插入方法,新插入的在最前面)
int i = 0;
int nloop = m_v_stock_info.size();
for (; i < nloop; i++) { strTemp = ""; strTemp.Format("%d",lineNum); nRow = m_list_stock.InsertItem(0, strTemp);// 插入行 m_list_stock.SetItemText(nRow, 1, m_v_stock_info[i].name);// 股票代码
。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
}
2. 删除指定的数据,可以删一行,也可以一次删除多行 ( 网上关于删除 多行数据的blog很多,我几乎挨个都试过了,可以说,没有一个可以用的。统统都是错的。很坑爹)
我发一个可以用的:
int totalItemCount = m_list_stock.GetItemCount(); if ( 0 == totalItemCount) { //没有记录,返回 return; } if ( 0 == JugSeclectItem()) { //没勾选返回 return; } //end //删除所选,一个或者一次删除多个都可以 for (int i = totalItemCount-1; i >= 0; i--) { if (m_list_stock.GetCheck(i)) { m_list_stock.DeleteItem(i); } }
关键就是:要倒过来删除”
3. 获取指定行的数据
int iCount = m_list_stock.GetItemCount(); CString strID, strSum; for (int i = 0; i < iCount; i ++) { if ( FALSE == m_list_stock.GetCheck(i)) { //直接在界面读取选中的行的 内容 strID = m_list_stock.GetItemText(i, 1); strSum = m_list_stock.GetItemText(i, 3); } }
4. 全选或者全反选
int iCount = m_list_stock.GetItemCount(); for (int i = 0; i < iCount; i ++) { m_list_stock.SetCheck(i);//全选
m_list_stock.SetCheck(i,FALSE);//全部反选 }
5. 获取 当前点击的那一行(选中过,再点中,就反选; 没选过,点中了,就选上)
POSITION Pos = m_list_stock.GetFirstSelectedItemPosition(); int nSelect = -1; bool bRet = false; while ( Pos ) { nSelect = m_list_stock.GetNextSelectedItem(Pos); //nSelect能获得第几行 bRet = m_list_stock.GetCheck(nSelect); if (bRet)//说明已经选中过 { m_list_stock.SetCheck(nSelect,FALSE); } else { m_list_stock.SetCheck(nSelect); }
在这里,可以 获取被选中行的内容,方法参考3.
}