MFC ListBox控件用法介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用?BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格:
•LVS_ICONLVS_SMALLICONLVS_LISTLVS_REPORT这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示
•LVS_EDITLABELS结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。
•LVS_SHOWSELALWAYS在失去焦点时也显示当前选中的结点
•LVS_SINGLESEL同时只能选中列表中一项
首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:?
CImageList*SetImageList(CImageList*pImageList,LVSIL_NORMAL);?
如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用:?
CImageList*SetImageList(CImageList*pImageList,LVSIL_SMALL);
通过调用intInsertItem(intnItem,LPCTSTRlpszItem);可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符。除LVS_REPORT风格外其他三种风格都只需
要直接调用InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。
通过调用
intInsertColumn(intnCol,LPCTSTRlpszColumnHeading,intnFormat,intnWidth,intnS ubItem);可以插入列。iCol为列的位置,从零开始,lpszColumnHeading为显示的列名,nFormat为显示对齐方式,nWidth为显示宽度,nSubItem为分配给该列的列索引。
在有多列的列表控件中就需要为每一项指明其在每一列中的显示字符,通过调用?BOOLSetItemText(intnItem,intnSubItem,LPTSTRlpszText);可以设置每列的显示字符。nItem为设置的项的位置,nSubItem为列位置,lpszText为显示字符。下面的代码演示了如何设置多列并插入数据:
(&m_listSmall,LVSIL_SMALL);.)
(LPSTR_TEXTCALLBACK,...)
置listctrl风格及扩展风格
LONGlStyle;?
lStyle.=GetWindowLong,GWL_STYLE);=~LVS_TYPEMASK;=LVS_REPORT;();?dwStyle.|=LVS_EX_FULLROWSELECT;=LVS_EX_GRIDLINES;=LVS_EX_CHEC KBOXES;入数据
(0,"ID",LVCFMT_LEFT,40);直选中item
选中style中的Showselectionalways,或者在上面第2点中设置
LVS_SHOWSELALWAYS
5.选中和取消选中一行
intnIndex=0;?
到listctrl中所有行的checkbox的状态
(LVS_EX_CHECKBOXES);?
CStringstr;?
for(inti=0;i<();i++)?
{?
if(i,LVIS_SELECTED)==LVIS_SELECTED||(i))?{?
(_T("第%d行的checkbox为选中状态"),i);?AfxMessageBox(str);?
}?
}
7.得到listctrl中所有选中行的序号
方法一:?
CStringstr;?
for(inti=0;i<();i++)?
{?
if(i,LVIS_SELECTED)==LVIS_SELECTED)?{?
(_T("选中了第%d行"),i);?
AfxMessageBox(str);?
}?
}
方法二:?
POSITIONpos=();?
if(pos==NULL)?
TRACE0("Noitemswereselected!\n");?
else?
{?
while(pos)?
{?
intnItem=(pos);?
TRACE1("Item%dwasselected!\n",nItem);?
到item的信息
TCHARszBuf[1024];?
LVITEMlvi;?
=nItemIndex;?
=0;?
=LVIF_TEXT;?
=szBuf;?
=1024;?
(&lvi);
关于得到设置item的状态,还可以参考msdn文章?Q173242:UseMaskstoSet/GetItemStatesinCListCtrl?
9.得到listctrl的所有列的header字符串内容
LVCOLUMNlvcol;?
charstr[256];?
intnColNum;?
CStringstrColumnName[4];listctrl中一项可见,即滚动滚动条
(i,FALSE);
11.得到listctrl列数
intnHeadNum=()->GetItemCount();
12.删除所有列
方法一:?
while(0))?
因为你删除了第一列后,后面的列会依次向上移动。
方法二:?
intnColumns=4;?
for(inti=nColumns-1;i>=0;i--)?
(i);
13.得到单击的listctrl的行列号
添加listctrl控件的NM_CLICK消息相应函数?
voidCTest6Dlg::OnClickList1(NMHDR*pNMHDR,LRESULT*pResult)?{?
断是否点击在listctrl的checkbox上