MFC列表视图控件ListControl使⽤⼀
列表视图控件的创建
MFC同样为列表视图控件的操作提供了CListCtrl类。
如果我们不想在对话框模板中直接拖⼊List Control来使⽤列表视图控件,⽽是希望动态创建它,则要⽤到CListCtrl类的成员函数Create 函数,原型如下:
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
参数rect为列表视图控件的位置和尺⼨,pParentWnd为指向⽗窗⼝的指针,nID指定列表视图控件的ID,最复杂的⼀个参数同样还是dwStyle,它⽤于设定列表视图控件的风格,可以是以下风格的组合:
风格含义
LVS_ALIGNLEFT 显⽰格式是⼤图标或⼩图标时,标签放在图标的左边
LVS_ALIGNTOP 显⽰格式是⼤图标或⼩图标时,标题放在图标的上边
LVS_AUTOARRANGE 显⽰格式是⼤图标或⼩图标时,⾃动排列控件中的列表项
LVS_EDITLABELS ⽤户可以修改标签⽂本
LVS_ICON 指定⼤图标显⽰格式
LVS_LIST 指定列表显⽰格式
LVS_NOCOLUMNHEADER 在报表格式中不显⽰列的表头
LVS_NOLABELWRAP 显⽰格式是⼤图标时,使标签⽂本单⾏显⽰。默认是多⾏显⽰
LVS_NOSCROLL 列表视图控件⽆滚动条,此风格不能与LVS_LIST或LVS_REPORT组合使⽤
LVS_NOSORTHEADER 报表格式的列表视图控件的表头不能作为排序按钮使⽤
LVS_OWNERDRAWFIXED 由控件的拥有者负责绘制表项
LVS_REPORT 指定报表显⽰格式
LVS_SHAREIMAGELISTS 使列表视图共享图像序列
LVS_SHOWSELALWAYS 即使控件失去输⼊焦点,仍显⽰出项的选择状态
LVS_SINGLESEL 指定只能有⼀个列表项被选中。默认时可以多项选择
LVS_SMALLICON 指定⼩图标显⽰格式
LVS_SORTASCENDING 按升序排列列表项
LVS_SORTDESCENDING 按降序排列列表项
与前⾯的控件⼀样,除了以上风格⼀般我们还要为列表视图控件设置WS_CHILD和WS_VISIBLE风格。对于直接在对话框模板中创建的列表视图控件,其属性页中的属性与上述风格是对应的,例如,属性Alignment默认为Left,也就等价于指定了LVS_ALIGNLEFT风格。
CListCtrl类的主要成员函数
CListCtrl类有很多成员函数,这⾥就为⼤家介绍⼏个常⽤的主要成员函数。
UINT GetSelectedCount( ) const;
该函数返回列表视图控件中被选择列表项的数量。
POSITION GetFirstSelectedItemPosition( ) const;
获取列表视图控件中第⼀个被选择项的位置。返回的POSITION值可以⽤来迭代来获取其他选择项,可以当作参数传⼊下⾯的GetNextSelectedItem函数来获得选择项的索引。如果没有被选择项则返回NULL。
int GetNextSelectedItem(POSITION& pos) const;
该函数获取由pos指定的列表项的索引,然后将pos设置为下⼀个位置的POSITION值。参数pos为之前调⽤GetNextSelectedItem或GetFirstSelectedItemPosit ion得到的POSITION值的引⽤。返回值就是pos指定列表项的索引。
int GetItemCount( ) const;
获取列表视图控件中列表项的数量。
int InsertColumn(int nCol,const LVCOLUMN* pColumn );
int InsertColumn(int nCol,LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT,int nWidth = -1,int nSubItem = -1 );
这两个函数⽤于在报表式列表视图控件中插⼊列。第⼀个函数中,nCol参数为插⼊列的索引,pColumn参数指向LVCOLUMN结构,其中包含了插⼊列的属性。第⼆个函数中,nCol参数也是插⼊列的索引,lpszColumnHeading参数为列标题字符串,nFormat参数为列中⽂本的对齐⽅式,可以是LVCFMT_LEFT、LV CFMT_RIGHT或LVCFMT_CENTER,nWidth参数为列宽,nSubItem为插⼊列对应列表⼦项的索引。两个函数在成功时都返回新列的索引,失败都返回-1。
BOOL DeleteColumn(int nCol);
该函数⽤于删除列表视图控件中的某列。参数nCol为删除列的索引。删除成功则返回TRUE,失败返回FALSE。
int InsertItem(int nItem,LPCTSTR lpszItem);
向列表视图控件中插⼊新的列表项。参数nItem为要插⼊项的索引,参数lpszItem为要插⼊项的标签字符串。如果插⼊成功则返回新列表项的索引,否则返回-1。
BOOL DeleteItem(int nItem);
从列表视图控件中删除某个列表项。参数nItem指定了要删除的列表项的索引。删除成功则返回TRUE,否则返回FALSE。
CString GetItemText(int nItem,int nSubItem) const;
获取指定列表项或列表⼦项的显⽰⽂本。参数nItem指定了列表项的索引,参数nSubItem指定了列表⼦项的索引。
BOOL SetItemText(int nItem,int nSubItem,LPCTSTR lpszText);
设置指定列表项或列表⼦项的显⽰⽂本。参数nItem和nSubItem同GetItemText。参数lpszText为要设置的显⽰⽂本字符串。如果设置成功则返回TRUE,否则返回FALSE。
DWORD_PTR GetItemData(int nItem) const;
该函数⽤于获取指定列表项的附加32位数据。参数nItem为列表项的索引。返回值就是由nItem指定列表项的附加32位数据。
BOOL SetItemData(int nItem,DWORD_PTR dwData);
该函数⽤于为指定列表项设置附加32位是数据。参数nItem为列表项的索引,参数dwData为列表项的附加32位数据。
CListCtrl类应⽤实例
最后给⼤家写⼀个简单的实例,说明CListCtrl类的⼏个成员函数及通知消息等的使⽤⽅法。因为在开发中最常⽤的要属报表风格的List Control了,所以鸡啄⽶给⼤家写的是⼀个报表List Control的例⼦。
此实例实现的功能:在单选列表视图控件中显⽰⼀个简单的编程语⾔排⾏榜,然后在⽤⿏标左键选择某列表项时,将选中列表项的⽂本显⽰到编辑框中。下⾯是具体实现步骤:
1. 创建⼀个基于对话框的MFC⼯程,名称设置为“Example29”。
2. 在⾃动⽣成的对话框模板IDD_EXAMPLE29_DIALOG中,删除“TODO: Place dialog controls here.”静态⽂本控件、“OK”按
钮和“Cancel”按钮。添加⼀个List Control控件,ID设置为IDC_PROGRAM_LANG_LIST,View属性设为Report,即为报表风格,Single Selection属性设为True。再添加⼀个静态⽂本控件和⼀个编辑框,静态⽂本控件的Caption属性设为“选择的语⾔:”,编辑框的ID设为IDC_LANG_SEL_EDIT,Read Only属性设为True。此时的对话框模板如下图:
3. 为列表视图控件IDC_PROGRAM_LANG_LIST添加CListCtrl类型的控件变量m_programLangList。
4. 在对话框初始化时,我们将编程语⾔排⾏榜加⼊到列表视图控件中,那么需要修改
CExample29Dlg::OnInitDialog()函数为:
BOOL CExample29Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "" 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)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
program可以删除吗}
// 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
CRect rect;
// 获取编程语⾔列表视图控件的位置和⼤⼩
m_programLangList.GetClientRect(&rect);
// 为列表视图控件添加全⾏选中和栅格风格
m_programLangList.SetExtendedStyle(m_programLangList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_programLangList.SetExtendedStyle(m_programLangList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
// 为列表视图控件添加三列
m_programLangList.InsertColumn(0, _T("语⾔"), LVCFMT_CENTER, rect.Width()/3, 0);
m_programLangList.InsertColumn(1, _T("2012.02排名"), LVCFMT_CENTER, rect.Width()/3, 1);
m_programLangList.InsertColumn(2, _T("2011.02排名"), LVCFMT_CENTER, rect.Width()/3, 2);
// 在列表视图控件中插⼊列表项,并设置列表⼦项⽂本
m_programLangList.InsertItem(0, _T("Java"));
m_programLangList.SetItemText(0, 1, _T("1"));
m_programLangList.SetItemText(0, 2, _T("1"));
m_programLangList.InsertItem(1, _T("C"));
m_programLangList.SetItemText(1, 1, _T("2"));
m_programLangList.SetItemText(1, 2, _T("2"));
m_programLangList.InsertItem(2, _T("C#"));
m_programLangList.SetItemText(2, 1, _T("3"));
m_programLangList.SetItemText(2, 2, _T("6"));
m_programLangList.InsertItem(3, _T("C++"));
m_programLangList.SetItemText(3, 1, _T("4"));
m_programLangList.SetItemText(3, 2, _T("3"));
return TRUE; // return TRUE unless you set the focus to a control
}
5. 我们希望在选中列表项改变时,将最新的选择项实时显⽰到编辑框中,那么可以使⽤NM_CLICK通知消息。为列表框
IDC_PROGRAM_LANG_LIST的通知消息NM_CLICK添加消息处理函数 CExample29Dlg::OnNMClickProgramLangList,并修改如下:
void CExample29Dlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
CString strLangName; // 选择语⾔的名称字符串
NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR;
if (-1 != pNMListView->iItem) // 如果iItem不是-1,就说明有列表项被选择
{
// 获取被选择列表项第⼀个⼦项的⽂本
strLangName = m_programLangList.GetItemText(pNMListView->iItem, 0);
// 将选择的语⾔显⽰与编辑框中
SetDlgItemText(IDC_LANG_SEL_EDIT, strLangName);
}
}
6. 运⾏程序,弹出结果对话框,在对话框的列表框中⽤⿏标改变选中项时,编辑框中的显⽰会相应改变。效果图如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论