ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:34.56KB ,
资源ID:4081484      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4081484.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(listcontrol控件.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

listcontrol控件.docx

1、listcontrol控件c+:listcontrol的用法ListControl列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格: LVS_ICON ,LVS_SMALLICON ,LVS_LIST, LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一

2、种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示 .。LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。 LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点 LVS_SINGLESEL 同时只能选中列表中一项首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用: CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL); 如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用: C

3、ImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL); int InsertItem( int nItem, LPCTSTR lpszItem ); 插入行nItem:指明插入位置lpszItem:为显示字符。除LVS_REPORT风格外其他三种风格都只需要直接调用InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubIte

4、m);插入列iCol:为列的位置,从零开始lpszColumnHeading:为显示的列名nFormat:为显示对齐方式nWidth:为显示宽度nSubItem:为分配给该列的列索引。 BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );设置每列的显示字符nItem:为行位置nSubItem:为列位置lpszText:为显示字符下面的代码演示了如何设置多列并插入数据: m_list.SetImageList(&m_listSmall,LVSIL_SMALL);/设置ImageListm_list.InsertColumn(0

5、,Col 1,LVCFMT_LEFT,300,0);/设置列m_list.InsertColumn(1,Col 2,LVCFMT_LEFT,300,1);m_list.InsertColumn(2,Col 3,LVCFMT_LEFT,300,2);m_list.InsertItem(0,Item 1_1);/插入行m_list.SetItemText(0,1,Item 1_2);/设置该行的不同列的显示字符m_list.SetItemText(0,2,Item 1_3)COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr ):用于得到/

6、设置显示的字符颜色。 COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr ):用于得到/设置显示的背景颜色。 void SetItemCount( int iCount ):用于得到添加进列表中项的数量。 BOOL DeleteItem(int nItem):用于删除某一项BOOL DeleteAllItems( ):将删除所有项。 BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent):用于设置背景位图。 CStrin

7、g GetItemText( int nItem, int nSubItem ):用于得到某项的显示字符。 列表控件的消息映射同样使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于列表控件可能取值和对应的数据结构为: LVN_BEGINLABELEDIT 在开

8、始某项编辑字符时发送,所用结构:NMLVDISPINFO LVN_ENDLABELEDIT 在结束某项编辑字符时发送,所用结构:NMLVDISPINFO LVN_GETDISPINFO 在需要得到某项信息时发送,(如得到某项的显示字符)所用结构:NMLVDISPINFO 关于ON_NOTIFY有很多内容,将在以后的内容中进行详细讲解。 关于动态提供结点所显示的字符:首先你在项时需要指明lpszItem参数为:LPSTR_TEXTCALLBACK。在控件显示该结点时会通过发送TVN_GETDISPINFO来取得所需要的字符,在处理该消息时先将参数pNMHDR转换为LPNMLVDISPINFO,然

9、后填充其中item.pszText。通过item中的iItem,iSubItem可以知道当前显示的为那一项。下面的代码演示了这种方法: char szOut83=No.1,No.2,No.3;/添加结点m_list.InsertItem(LPSTR_TEXTCALLBACK,.)m_list.InsertItem(LPSTR_TEXTCALLBACK,.)/处理消息void CParentWnd:OnGetDispInfoList(NMHDR* pNMHDR, LRESULT* pResult)LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;pLVDI-it

10、em.pszText=szOutpTVDI-item.iItem;/通过iItem得到需要显示的字符在数组中的位置*pResult = 0;关于编辑某项的显示字符:(在报表风格中只对第一列有效)首先需要设置列表控件的LVS_EDITLABELS风格,在开始编辑时该控件将会发送LVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送LVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为LPNMLVDISPINFO,然后通过其中的item.pszText得到编辑后的字符,并重置显示字符。如果编辑在中途中取消该变量为NULL

11、。下面的代码说明如何处理这些消息: /处理消息 LVN_BEGINLABELEDITvoid CParentWnd:OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;if(pLVDI-item.iItem=0);/判断是否取消该操作*pResult = 1;else*pResult = 0;/处理消息 LVN_BEGINLABELEDITvoid CParentWnd:OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)L

12、V_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;if(pLVDI-item.pszText=NULL);/判断是否已经取消取消编辑m_list.SetItemText(pLVDI-item.iItem,0,pLVDI-pszText);/重置显示字符*pResult = 0;上面讲述的方法所进行的消息映射必须在父窗口中进行(同样WM_NOTIFY的所有消息都需要在父窗口中处理)。 如何得到当前选中项位置:在列表控件中没有一个类似于ListBox中GetCurSel()的函数,但是可以通过调用GetNextItem( -1, LVNI_ALL | LVNI_SE

13、LECTED);得到选中项位置。 list control控件中的风格选项:m_list1.SetExtendedStyle( LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES );LVS_EX_FULLROWSELECT表示可以点中行中的任意一个列选中这一条记录LVS_EX_GRIDLINES表示列之间有分隔符号LVS_EX_CHECKBOXES 表示每一行第一列是checkboxLVCOLUMN:listviewcolumn设置表头lvColumn.mask = LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH

14、|LVCF_FMT; 设置表头风格lvColumn.fmt = LVCFMT_CENTER; 设置表头对齐方式lvColumn.iSubItem = i; 表头列序lvColumn.pszText = HeaderTxti; 表头名称lvColumn.cx = 90; 表头宽度m_list.InsertColumn(i,&lvColumn); 插入列list control本文全面介绍了如何编辑List Control里面的任何子项介绍内容有点多,译出来也没多大意思,大致就是说一个VC程序员会常常碰到List Control,List Control有很多方法可以显示数据,可List Cont

15、rol里默认的没有编辑功能,故在此智短文里,那个牛叉的人教你怎么实现这个功能。这篇文章是基于VC MFC滴,用别的功具的娃们当然也可以看看,呵呵,不多说,先实现图上ok exit两个按钮:void CMultipleColumnsDlg:OK() CDialog:EndDialog (0); / Add this linevoid CMultipleColumnsDlg:OnExit() CDialog:EndDialog (0); / Add this line接下来添加一个ListCtrl控件,记得把ListCtrl的style设置成Report,这个是为了实现我们要多行显示的功能然后增加

16、一个文本框Edit Box去掉它的Border style属性增加一个InsertItems() 成员函数,用来写入ListControl的显示内容void CMultipleColumnsDlg:InsertItems() HWND hWnd = :GetDlgItem(m_hWnd, IDC_LIST1); / Set the LVCOLUMN structure with the required / column information LVCOLUMN list; list.mask = LVCF_TEXT |LVCF_WIDTH| LVCF_FMT |LVCF_SUBITEM; l

17、ist.fmt = LVCFMT_LEFT; list.cx = 50; list.pszText = S.No; list.iSubItem = 0; /Inserts the column :SendMessage(hWnd,LVM_INSERTCOLUMN, (WPARAM)0,(WPARAM)&list); list.cx = 100; list.pszText = Name; list.iSubItem = 1; :SendMessage(hWnd ,LVM_INSERTCOLUMN, (WPARAM)1,(WPARAM)&list); list.cx = 100; list.psz

18、Text = Address; list.iSubItem = 2; :SendMessage(hWnd ,LVM_INSERTCOLUMN, (WPARAM)1,(WPARAM)&list); list.cx = 100; list.pszText = Country; list.iSubItem = 2; :SendMessage(hWnd ,LVM_INSERTCOLUMN, (WPARAM)1,(WPARAM)&list); / Inserts first Row with four columns 插入行 SetCell(hWnd,1,0,0); SetCell(hWnd,Prabh

19、akar,0,1); SetCell(hWnd,Hyderabad,0,2); SetCell(hWnd,India,0,3); / Inserts second Row with four columns . SetCell(hWnd,2,1,0); SetCell(hWnd,Uday,1,1); SetCell(hWnd,Chennai,1,2); SetCell(hWnd,India,1,3);自定义的SetCell( ) 函数,用来实现插入数据用的void CMultipleColumnsDlg:SetCell(HWND hWnd1, CString value, int nRow,

20、int nCol) TCHAR szString 256; wsprintf(szString,value ,0); /Fill the LVITEM structure with the /values given as parameters. LVITEM lvItem; lvItem.mask = LVIF_TEXT; lvItem.iItem = nRow; lvItem.pszText = szString; lvItem.iSubItem = nCol; if(nCol 0) /set the value of listItem :SendMessage(hWnd1,LVM_SET

21、ITEM, (WPARAM)0,(WPARAM)&lvItem); else /Insert the value into List ListView_InsertItem(hWnd1,&lvItem);/通过行和列得到项目里面的数据CString CMultipleColumnsDlg:GetItemText( HWND hWnd, int nItem, int nSubItem) const LVITEM lvi; memset(&lvi, 0, sizeof(LVITEM); lvi.iSubItem = nSubItem; CString str; int nLen = 128; in

22、t nRes; do nLen *= 2; lvi.cchTextMax = nLen; lvi.pszText = str.GetBufferSetLength(nLen); nRes = (int):SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); str.ReleaseBuffer(); return str;/为窗口类添加两个成员变量:int nItem, nSubItem;用Class wizard 添加 NM_CLICK 响应 ,当用户点击任何位置时,就会对应出现一个Edit Box,并可以修改数据vo

23、id CMultipleColumnsDlg:OnClickList( NMHDR* pNMHDR, LRESULT* pResult) Invalidate(); HWND hWnd1 = :GetDlgItem (m_hWnd,IDC_LIST1); LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR; RECT rect; /get the row number nItem = temp-iItem; /get the column number nSubItem = temp-iSubItem; if(nSubItem = 0 | nSu

24、bItem = -1 | nItem = -1) return ; /Retrieve the text of the selected subItem /from the list CString str = GetItemText(hWnd1,nItem , nSubItem); RECT rect1,rect2; / this macro is used to retrieve the Rectanle / of the selected SubItem ListView_GetSubItemRect(hWnd1,temp-iItem, temp-iSubItem,LVIR_BOUNDS

25、,&rect); /Get the Rectange of the listControl :GetWindowRect(temp-hdr.hwndFrom,&rect1); /Get the Rectange of the Dialog :GetWindowRect(m_hWnd,&rect2); int x=rect1.left-rect2.left; int y=rect1.top-rect2.top; if(nItem != -1) :SetWindowPos(:GetDlgItem(m_hWnd,IDC_EDIT1), HWND_TOP,rect.left+x,rect.top+4,

26、 rect.right-rect.left - 3, rect.bottom-rect.top -1,NULL); :ShowWindow(:GetDlgItem(m_hWnd,IDC_EDIT1),SW_SHOW); :SetFocus(:GetDlgItem(m_hWnd,IDC_EDIT1); /Draw a Rectangle around the SubItem :Rectangle(:GetDC(temp-hdr.hwndFrom), rect.left,rect.top-1,rect.right,rect.bottom); /Set the listItem text in th

27、e EditBox :SetWindowText(:GetDlgItem(m_hWnd,IDC_EDIT1),str); *pResult = 0;To handle the ENTER key we need to write the virtual function OnOk (响应ENTER键)afx_msg void OnOK();In MultipleColumnsDlg.cpp write the following code./ This function handles the ENTER keyvoid CMultipleColumnsDlg:OnOK() CWnd* pwn

28、dCtrl = GetFocus(); / get the control ID which is / presently having the focus int ctrl_ID = pwndCtrl-GetDlgCtrlID(); CString str; switch (ctrl_ID) /if the control is the EditBox case IDC_EDIT1: /get the text from the EditBox GetDlgItemText(IDC_EDIT1,str); /set the value in the listContorl with the

29、/specified Item & SubItem values SetCell(:GetDlgItem (m_hWnd,IDC_LIST1), str,nItem,nSubItem); :SendDlgItemMessage(m_hWnd,IDC_EDIT1, WM_KILLFOCUS,0,0); :ShowWindow(:GetDlgItem(m_hWnd,IDC_EDIT1), SW_HIDE); break; default: break; 最后一步在OnInitDialog 中设置List Control的样式 ListView_SetExtendedListViewStyle(:GetDlgItem (m_hWnd,IDC_LIST1),LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);InsertItems();:ShowWindow(:GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);来自: 评论(0) 您需要登录后才能进行评论,点此登录窗体顶端 窗体底端2010 Baidu 使用XX前必读 XX空间协议 联系我们

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1