mfc之ListBox介绍
ListBox窗口用来列出一系列的文本,每条文本占一行。创建一个列表窗口可以使用成员函数:
BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对列表控件指明专门的风格。
LBS_MULTIPLESEL 指明列表框可以同时选择多行
LBS_EXTENDEDSEL 可以通过按下Shift/Ctrl键选择多行
LBS_SORT 所有的行按照字母顺序进行排序
在列表框生成后需要向其中加入或是删除行,可以利用:
int AddString( LPCTSTR lpszItem )添加行,
int DeleteString( UINT nIndex )删除指定行,
int InsertString( int nIndex, LPCTSTR lpszItem )将行插入到指定位置。
void ResetContent( )可以删除列表框中所有行。
通过调用int GetCount( )得到当前列表框中行的数量。
如果需要得到/设置当前被选中的行,可以调用int GetCurSel( )/int SetCurSel(int iIndex)。如果你指明了选择多行的风格,你就需要先调用int GetSelCount( )得到被选中的行的数量,然后int GetSelItems( int nMaxItems, LPINT rgIndex )得到所有选中的行,参数rgIndex为存放被选中行的数组。通过调用int GetLBText( int nIndex, LPTSTR lpszText )得到列表框内指定行的字符串。
此外通过调用int FindString( int nStartAfter, LPCTSTR lpszItem )可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem )可以选中包含指定字符串的行。
最后介绍一下列表框几种常用的消息映射宏:
ON_LBN_DBLCLK 鼠标双击
ON_EN_ERRSPACE 输入框无法分配内存时产生
ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在输入框失去/得到输入焦点时产生
ON_LBN_SELCHANGE 选择的行发生改变
使用以上几种消息映射的方法为定义原型如:afx_msg void memberFxn( );的函数,并且定义形式如ON_Notification( id, memberFxn )的消息映射。如果在对话框中使用列表框,Class Wizard会自动列出相关的消息,并能自动产生消息映射代码。
GetDlgItem(IDC_LIST1)->EnableWindow(FALSE)提供控件的id.获得指向控件的指针
是CWnd的成员函数
->ShowWindow(SW_SHOW)
->ShowWindow(SW_HIDE)显示或隐藏窗口,也是CWnd的成员函数
CListBox::AddString()函数可以向列表框中添加项目
事例程序:
void COptionListDlg::OnAddButton()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_edit==""){
MessageBox("请输入添加的数据");
return;
}
switch(m_radio){
case 0:
m_listbox1.AddString(m_edit);
break;
case 1:
m_listbox2.AddString(m_edit);
break;
case 2:
m_listbox3.AddString(m_edit);
break;
}
UpdateData(FALSE);
}
CListBox::GetCurSel()返回当前列表框选择项目的序号
CListBox::GetText()函数可以根据当前列表框的序号读取当前选择的项目
程序:
void COptionListDlg::OnSelchangeList1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int index = m_listbox1.GetCurSel();
if(index == LB_ERR)
m_edit="";
else
m_listbox1.GetText(index,m_edit);
UpdateData(FALSE);
}
m_listbox1.DeleteString()
m_listbox1.InsertString()
程序:
void COptionListDlg::OnEditButton()
{
// TODO: Add your control notification handler code here
int index;
UpdateData(TRUE);
if(m_edit == ""){
MessageBox("请输入修改项目");
return;
}
switch(m_radio){
case 0:
index = m_listbox1.GetCurSel();
if(index == LB_ERR){
MessageBox("请选择要修改的项目");
return;
}
m_listbox1.DeleteString(index);
m_listbox1.InsertString(index,m_edit);
break;
case 1:
index = m_listbox2.GetCurSel();
if(index == LB_ERR){
MessageBox("请选择要修改的项目");
return;
}
m_listbox2.DeleteString(index);
m_listbox2.InsertString(index,m_edit);
break;
case 2:
index = m_listbox3.GetCurSel();
if(index == LB_ERR){
MessageBox("请选择要修改的项目");
return;
}
m_listbox3.DeleteString(index);
m_listbox3.InsertString(index,m_edit);
break;
}
}
CObject←CCmdTarget←CWnd←CListBox
CListBox类提供Windows列表框的功能。列表框显示项的列表,如用户可以见到和选择的文件名称。在单选列表框里,用户只可选择一个项。在多选列表框里,可选择许多项。当用户选择某项时,其高亮显示且列表框给父窗口发送一个通知消息。 可从对话模板或直接在你的代码中创建列表框。直接创建时,构造CListBox对象,再调用 Create成员函数创建Windows列表框控件并将其附加给CListBox对象。要在对话模板中使用列表框,可在对话框类中声明一个 CListbox 变量,再在对话框类的DoDataExchange中使用DDX_Control连接成员变量到此控件(当向对话框类中添加控件变量 时,ClassWizard自动为你实现)。 构造函数可以是从CListBox派生的类的一个单步进程。为派生类写构造函数并从中调用Create。如果要处理由列表框发送到其父亲(通常为从CDialog派生的类)的Windows通知消息,为每个消息添加消息映射入口和消息处理成员函数到父类。 每个消息映射入口有以下形式: ON_Notification( id,memberFxn ) id 指定发送通知的列表框控件的子窗口,memberFxn 是编写处理通知的父成员函数名的地方。 父函数原型如下: afx_msg void memberFxn( ); 下面是可能的消息映射入口列表和描述它们可能被发送到父亲的情况: ON人_LBN_DBLCLK 用户双击列表框中的字符串。只有LBS_NOTIFY风格的列表框才会发送此通知消息。 ON_LBN_ERRSPACE 列表框不能重新分配足够的内存来满足请求。 ON_LBN_KILLFOCUS 列表框正失去输入焦点。 ON_LBN_SELCANCEL 当前列表框选择被取消。此消息只有在列表框是LBS_NOTIFY风格时才发送。 ON_LBN_SELCHANGE 列表框中的选择可能改变。如果选择被CListBox::SetCurSel成员函数改变,则通知不发送。此通知只适用于LBS_NOTIFY风格的列表 框。无论何时用户按下箭头键,即使选择未改变,LBN_SELCHANGE通知消息都被发送给多选列表框。 ON_LBN_SETFOCUS 列表框正在接收输入焦点。 ON_WM_CHARTOITEM 一个无字符串的自绘制列表接受WM_CHAR消息。 ON_WM_VKEYTOITEM LBS_WANTKEYBOARDINPUT风格的列表框接受WM_KEYDOWN消息。 如果在对话框中构造一个CListBox对象(通过对话资源),当用户关闭对话框时,CListBox对象自动毁弃。 如果在窗口中构造一个CListBox对象,可能需要毁弃CListBox对象。如果在栈上创建CListBox对象,它会自动毁弃。如果使用new函数在堆上创建CListBox对象,必须对此对象调用delete来在用户关闭父窗口时毁弃它。 如果在CListBox对象中分配内存,可覆盖CListBox析构程序释放分配的内存。 #include <afxwin.h> 请参阅:CWnd, CButton, CComboBox, CEdit, CScrollBar, CStatic