List Control (列表控件)
MFC
列表控件可以看作是功能增强的ListBox
为列表控件添加一个控制变量(m_list),通过其对相应函数进行调用。
报表风格 LVS_REPORT
SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
//List title (报表风格就必须先设置列表控件中的列信息)
int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);
iCol为列的位置(列号),从零开始
lpszColumnHeading为显示的列名
nFormat为显示对齐方式
nWidth为显示宽度
nSubItem为分配给该列的列索引
int SetColumnWidth(int nCol,int nWidth
CRect rect;
m_list.GetClientRect(rect);
m_list.SetColumnWidth(0,rect4.Width()/4);
m_list.SetColumnWidth(1,rect4.Width()/4);
m_list.SetColumnWidth(2,rect4.Width()/4);
m_list.SetColumnWidth(3,rect4.Width()/4);
插入显示数据
int InsertItem( int nItem, LPCTSTR lpszItem );
获取显示数据
CString GetItemText( int nItem, int nSubItem );
删除显示数据
BOOL DeleteItem(int nItem);
BOOL DeleteAllItems( );
相关操作
void SetItemCount( int iCount );
得到/修改控件的状态
COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr );
COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr );
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);
1.添加ListControl 控件,属性中的Appearance属性页下的View选择Report。
并设置其对应的控制变量如:m_list。
2.初始化,即设置list title
m_list.InsertColumn(0,_T("From"),LVCFMT_LEFT);
m_list.InsertColumn(1,_T("To"),LVCFMT_LEFT);
m_list.InsertColumn(2,_T("Sbuject"),LVCFMT_LEFT);
m_list.InsertColumn(3,_T("Date"),LVCFMT_LEFT);
CRect rect;
m_list.GetClientRect(rect);
m_list.SetColumnWidth(0,rect4.Width()/4);
m_list.SetColumnWidth(1,rect4.Width()/4);
m_list.SetColumnWidth(2,rect4.Width()/4);
m_list.SetColumnWidth(3,rect4.Width()/4);
这部分初始化操作,最好放在对话框类的OnInitDialog()函数里,自动初始化。
3.插入数据
//插入第一个数据,即第0条数据。先插入,然后在修改其他的信息。
m_list.InsertItem(0,"<jane@126.com>");
//修改第0条数据的其他信息。
m_list1.SetItemText(0,1,"<nina@126.com> ");
m_list1.SetItemText(0,2,"ok");
m_list1.SetItemText(0,3,"2009-01-01");
4.删除所有数据
m_list.DeleteAllItems();
补充:
<1>列可与一个结构体关联
//添加一个项目
int nItem = m_list.InsertItem(m_list.GetItemCount(), _T("content"));
//创建自定义结构(不能使用局部变量)
ITEMDATA *pData = new ITEMDATA;
//设置项目数据
m_list.SetItemData(nItem, (DWORD)pData);
//获取项目数据
ITEMDATA *pData = (ITEMDATA *)m_list.GetItemData(nItem);
//删除MyListCtrl中的项目前
delete (ITEMDATA *)m_list.GetItemData(nItem);
<2>带有CheckBox的CListCtrl中Check状态的获取
a. 建立测试工程
新建一个对话框工程,并添加一个CListCtrl控件,并关联一个成员变量m_List。
ListView_SetExtendedListViewStyle(m_List.GetSafeHwnd(), m_List.GetExStyle() | LVS_EX_CHECKBOXES);
在OnInitDialog()中添加如下代码:
m_List.InsertColumn(0,"Name",LVCFMT_LEFT,150);
m_List.InsertColumn(1,"Sex",LVCFMT_LEFT,200);
m_List.InsertItem(0, "jane");
m_List.InsertItem(1, "nina");
为ListCtrl控件添加LVN_ITEMCHANGED消息。系统生成如下代码:
void CXXXDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CXXXDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(1)) /* old state : unchecked */
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(2)) /* new state : checked */
)
{
TRACE("Item %d is checked\n", pNMLV->iItem);
}
else if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(2)) /* old state : checked */
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(1)) /* new state : unchecked */
)
{
TRACE("Item %d is unchecked\n", pNMLV->iItem);
}
else
{
TRACE("Item %d does't change the check-status\n", pNMLV->iItem);
}
*pResult = 0;
}
在debug环境下,改变checkbox的选中状态,查看输出信息。