当前位置:文档之家› MFC ListBox控件用法介绍

MFC ListBox控件用法介绍

列表控件可以看作是功能增强的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_SHOWSELALWAYS5.选中和取消选中一行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上添加listctrl控件的NM_CLICK消息相应函数?voidCTest6Dlg::OnClickList1(NMHDR*pNMHDR,LRESULT*pResult)?{?DWORDdwPos=GetMessagePos();?CPointpoint(LOWORD(dwPos),HIWORD(dwPos));?(&point);?LVHITTESTINFOlvinfo;?=point;?=LVHT_ABOVE;?UINTnFlag;?intnItem=(point,&nFlag);?键点击listctrl的item弹出菜单添加listctrl控件的NM_RCLICK消息相应函数?voidCTest6Dlg::OnRclickList1(NMHDR*pNMHDR,LRESULT*pResult)?{?NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;?if(pNMListView->iItem!=-1)?{?DWORDdwPos=GetMessagePos();?CPointpoint(LOWORD(dwPos),HIWORD(dwPos));?CMenumenu;?VERIFY(IDR_MENU1));?CMenu*popup=(0);?ASSERT(popup!=NULL);?popup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,,,this);?}?*pResult=0;?}切换焦点时(包括用键盘和鼠标切换item时),状态的一些变化顺序添加listctrl控件的LVN_ITEMCHANGED消息相应函数?voidCTest6Dlg::OnItemchangedList1(NMHDR*pNMHDR,LRESULT*pResult)?{?NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;?到另一个进程里的listctrl控件的item内容18.选中listview中的itemQ131284:HowToSelectaListviewItemProgrammatically?19.如何在CListView中使用CListCtrl的派生类的subitem添加图标(LVS_EX_SUBITEMIMAGES);?(..);CListCtrl显示文件,并根据文件类型来显示图标网上找到的代码,share?BOOLCTest6Dlg::OnInitDialog()?{?CDialog::OnInitDialog();?HIMAGELISThimlSmall;?HIMAGELISThimlLarge;?SHFILEINFOsfi;?charcSysDir[MAX_PATH];?CStringstrBuf;?memset(cSysDir,0,MAX_PATH);?GetWindowsDirectory(cSysDir,MAX_PATH);?strBuf=cSysDir;?sprintf(cSysDir,"%s",("\\")+1));?himlSmall=(HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,?0,?&sfi,?sizeof(SHFILEINFO),?SHGFI_SYSICONINDEX|SHGFI_SMALLICON);?himlLarge=(HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,?0,?&sfi,?sizeof(SHFILEINFO),?SHGFI_SYSICONINDEX|SHGFI_LARGEICON);?if(himlSmall&&himlLarge)?{?::SendMessage,LVM_SETIMAGELIST,?(WPARAM)LVSIL_SMALL,(LPARAM)himlSmall);?::SendMessage,LVM_SETIMAGELIST,?(WPARAM)LVSIL_NORMAL,(LPARAM)himlLarge);?}?returnTRUE;.?};zName);?charszAge[10];?sprintf(szAge,"%d",strAllData[i].iAge);?(i,1,szAge);??staticintCALLBACK?MyCompareProc(LPARAMlParam1,LPARAMlParam2,LPARAMlParamSort)?{?CListCtrl*pListCtrl=(CListCtrl*)lParamSort;?CStringstrItem1=pListCtrl->GetItemText(lParam1,0);?CStringstrItem2=pListCtrl->GetItemText(lParam2,0);returnstrcmp(strItem2,strItem1);?}voidsnip_CListCtrl_SortItems()?{?externCListCtrl*pmyListCtrl;pmyListCtrl->SortItems(MyCompareProc,(LPARAM)pmyListCtrl);?}Ifyoudon’twanttoallowtheuserstosortthelistbyclickingontheheader,,ifyoudowanttoall owsorting,,though,Step1:Addtwomembervariables?,.?intnSortedCol;?BOOLbSortAscending;Step2:Initializethemintheconstructor.?,thenthisvariableshouldreflectthat.?nSortedCol=-1;?bSortAscending=TRUE;?Step3:AddentryinmessagemaptohandleHDN_ITEMCLICK?ON_NOTIFY(HDN_ITEMCLICKA,0,OnHeaderClicked)?ON_NOTIFY(HDN_ITEMCLICKW,0,OnHeaderClicked)?Also,.Step4:WritetheOnHeaderClicked()function?Here’voidCMyListCtrl::OnHeaderClicked(NMHDR*pNMHDR,LRESULT*pResult)?{?HD_NOTIFY*phdn=(HD_NOTIFY*)pNMHDR;if(phdn->iButton==0)?{?LS)";ls",wnd);?if()==IDOK)?{?sExcelFile=();//要建立的Excel文件?CFileFindfinder;?BOOLbWorking=(sExcelFile);//寻找文件?if(bWorking)//如果已经存在文件,则删除?{?CFile::Remove((LPCTSTR)sExcelFile);?}?}?elsereturn;?TRY?{?//创建进行存取的字符串?("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREAT E_DB=\"%s\";DBQ=%s",sDriver,sExcelFile,sExcelFile);?//创建数据库(既Excel表格文件)?if(sSql,CDatabase::noOdbcDialog))?{?CHeaderCtrl*pHeader=();?//获得行,列的个数?intnColCount=pHeader->GetItemCount();?intnLineCount=();?intColOrderArray[100];?CStringca[100];?(ColOrderArray,nColCount);?//检索各列的信息,确定列标题的内容?for(inti=0;i<nColCount;i++)?{?LVCOLUMNlvc;?chartext[100];?=LVCF_TEXT|LVCF_SUBITEM;?=text;?=100;?(ColOrderArray[i],&lvc);?ca[i]=;?}?//创建表结构?CStringtempsql="(";?for(i=0;i<nColCount-1;i++)?{?tempsql+=ca[i];?tempsql+="TEXT,";?}?tempsql+=ca[nColCount-1];?tempsql+="TEXT)";?sSql="CREATETABLESheet1";?sSql+=tempsql;?(sSql);?//插入数据?intitem_count=();?tempsql="(";?for(i=0;i<nColCount-1;i++)?{?tempsql+=ca[i];?tempsql+=",";?}?tempsql+=ca[nColCount-1];?tempsql+=")";?for(intitemnum=0;itemnum<item_count;itemnum++){?sSql="";?sSql="INSERTINTOSheet1";?sSql+=tempsql;?sSql+="VALUES('";?for(i=0;i<nColCount-1;i++)?{?sSql+=(itemnum,i);?sSql+="','";?}?sSql+=(itemnum,nColCount-1);?sSql+="')";?(sSql);?}?}?//关闭数据库?();?AfxMessageBox("Excel文件写入成功!");?}?CATCH_ALL(e)?{?TRACE1("Excel驱动没有安装:%s",sDriver);?}?END_CATCH_ALL;?}。

相关主题