第14讲__完整电话薄_第1页
第14讲__完整电话薄_第2页
第14讲__完整电话薄_第3页
第14讲__完整电话薄_第4页
第14讲__完整电话薄_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 第14讲 完整电话薄 2 为了完善电话簿的功能,需要对例8-2进行改进:(1)在界面右侧添加列表视图控件,显示某一分组下所有人员的姓名和电话号码(2)在列表视图控件中添加右键菜单,以修改相应数据。3本讲主要内容1. 列表视图控件 2. 右键菜单41. 列表视图控件 列表视图控件区别于列表框控件,可以用来显示和管理一系列子项,每个子项可以包含一个包含在图像列表中的图标,列表视图控件允许以多种方式显示子项。 51. 列表视图控件【例【例8-3】 完整电话薄 该例能够在列表视图中显示人员的姓名和电话号码。 61. 列表视图控件操作步骤:在例8-2的基础上,进行如下操作。(1)在ResourceV

2、iew视图中,添加列表视图控件,ID修改为IDC_LIST,并将properties中Styles选项卡中View选项修改为Report,如图所示。 71. 列表视图控件(2)打开ClassWizard,在Member Variables选项卡中为IDC_LIST添加Control类型关联变量m_listPhone。 81. 列表视图控件(3)在OnInitDialog()函数添加如下代码:BOOL CPhoneDlg:OnInitDialog()m_treePhone.SetItemData(h3,(DWORD)pString);m_listPhone.InsertColumn(0,姓名姓名

3、,LVCFMT_LEFT,100);m_listPhone.InsertColumn(1,电话号码电话号码,LVCFMT_LEFT,120);m_listPhone.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);return TRUE; 当选择Report风格时,实际上列表视图控件就变为表格样式,因此,需要列表视图控件设置表头信息。函数声明为:int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth =

4、-1, int nSubItem = -1);其中参数含义为:nCol:要插入列的列号。 lpszcolumnHeading: 为列标题的字符串的地址。nFormat:指定列对齐方式的整数,缺省值是左对齐。它可以为下列值之一:LVCFMT_LEFT,LVCFMT_RIGHT或LVCFMT_CENTER。 nWidth:以像素为单位的列宽。缺省值为-1,表示没有设置列宽。 nSubItem:与列相关联的子项的索引。缺省值为-1,表示没有子项与列相关。 SetExtendedStyle()函数功能设置CListCtrl的扩展样式,其函数声明为:DWORD SetExtendedStyle(DWOR

5、D dwNewStyle );其中参数含义为:dwNewStyle:扩展样式,可包括:LVS_EX_GRIDLINES /绘制表格线 LVS_EX_SUBITEMIMAGES/子项目图标列表 LVS_EX_CHECKBOXES /带复选框 LVS_EX_TRACKSELECT /自动换行 LVS_EX_HEADERDRAGDROP/表头可以拖拽 LVS_EX_FULLROWSELECT /选择整行 LVS_EX_ONECLICKACTIVATE/单击激活 LVS_EX_TWOCLICKACTIVATE/双击激活 LVS_EX_FLATSB/扁平滚动条 91. 列表视图控件(4)打开ClassW

6、izard,在Message Maps选 项 卡 中 为 I D C _ T R E E 添 加TVN_SELCHANGED消息响应函数OnSelchangedTree(),该函数在树中被选中节点发生变化时调用。101. 列表视图控件(5)在OnSelchangedTree()函数中添加如下代码:void CPhoneDlg:OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;HTREEITEM selItem = m_treePhone.GetSel

7、ectedItem(); /获得树中选中节点if(selItem = m_treePhone.GetRootItem()/如果没有选中节点,返回return;DWORD m = m_treePhone.GetItemData(selItem); /获得选中节点关联数据if(m = NULL)/如果为空,是分组节点refreshList(selItem); /刷新列表视图中的数据*pResult = 0;函数GetSelectedItem()获得树控件中当前被选中的节点句柄 refreshList是自定义函数,其功能是在列表视图中显示树中某一分组节点下的所有人员信息 111. 列表视图控件voi

8、d CPhoneDlg:refreshList(HTREEITEM parent)m_listPhone.DeleteAllItems();/删除原有数据删除原有数据int index = 0; /遍历获得该分组节点下的所有子节点遍历获得该分组节点下的所有子节点HTREEITEM child = m_treePhone.GetChildItem(parent); while (child != NULL) DWORD n = m_treePhone.GetItemData(child);CString *pString = (CString*)n;/得到人员节点中的关联电话号码得到人员节点中的

9、关联电话号码/在列表视图中添加一项在列表视图中添加一项m_listPhone.InsertItem(index,m_treePhone.GetItemText(child);m_listPhone.SetItemText(index,1,*pString); /在列表视图中设置一子项在列表视图中设置一子项index+;child = m_treePhone.GetNextSiblingItem(child); /得到下一个兄弟节点得到下一个兄弟节点InsertItem()功能是在列表视图控件中插入一项,包括文件名称和图标,其中InsertItem的函数声明为:int InsertItem( i

10、nt nItem, LPCTSTR lpszItem, int nImage );nItem:插入项索引号。lpszItem:插入项的文本显示。nImage:图标索引。SetItemText()函数用于设置列表视图控件项或子项的文本,其函数声明如下:BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText);其中参数含义为:nItem:项的索引。nSubItem:子项的索引。lpszText:包含新项文本的字符串指针。121. 列表视图控件(6)为了使添加、删除人员后列表视图中数据与树中节点一致,需要修改OnAdd()和OnDelet

11、e()函数。 void CPhoneDlg:OnAdd() if(dlg.DoModal() = IDOK)/显示添加人员对话框,并单击确定按钮m_treePhone.SetItemData(item,(DWORD)pString); /设置关联数据refreshList(selItem);131. 列表视图控件void CPhoneDlg:OnDelete() if(AfxMessageBox = IDOK)HTREEITEM parent = m_treePhone.GetParentItem(selItem);CString *pString = (CString*)m; /删除关联数据

12、delete pString;m_treePhone.DeleteItem(selItem); /删除节点refreshList(parent);在OnDelete()函数中,选中节点不是分组节点,而是人员节点,因此需要首先获得其对应的分组节点,然后刷新列表视图。GetParentItem()不能写在DeleteItem()函数之后。 141. 列表视图控件(7)编译、链接、运行。152. 右键菜单 对于例8-3中的电话簿程序,能够实现添加、删除人员,但缺少修改数据功能。我们仍然可以仿照添加、删除方式,再添加一个“修改”按钮,但为了让案例更加丰富,本节将通过右键菜单方式来修改人员数据。 162

13、. 右键菜单操作步骤:在例8-3的基础上,进行如下操作。(1)在ResourceView视图中,单击菜单Insert|Resource命令,选择Menu,单击“New”按钮,结果下图所示 172. 右键菜单(2)双击虚线框,在Caption中录入“1”。(3)添加1个菜单项,如下图所示,其ID为ID_MODIFY。 182. 右键菜单(4)打开ClassWizard,在Message Maps选项卡中分别为ID_MODIFY添加COMMAND消息响应函数。 (5)打开ClassWizard在Message Maps选项卡中为IDC_LIST添加NM_RCLICK消息响应函数OnRclickLi

14、st(),在列表视图控件上右键单击会调用该函数。 192. 右键菜单(6)在OnRclickList()函数中添加如下代码:void CPhoneDlg:OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) CMenu m_menu;m_menu.LoadMenu(IDR_MENU1);/加载整条菜单 CMenu*pMenu=m_menu.GetSubMenu(0);/获得第一个菜单 POINT p; GetCursorPos(&p);/获得鼠标位置 pMenu-TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTT

15、ON, p.x, p.y,this); pMenu-DestroyMenu();/销毁菜单*pResult = 0;CMenu是MFC封装菜单资源的类 LoadMenu()函数加载菜单资源 获取第一个子菜单 获取鼠标当前坐标位置 TrackPopupMenu()函数的功能是指定位置显示快捷菜单,并跟踪菜单项的选择。函数声明为:BOOL TrackPopupMenu(UINT uFlags,int x,int y,int nReserved,HWND hWnd,CONST RECT* prcRect); 负责销毁菜单对象 202. 右键菜单BOOL TrackPopupMenu(UINT uFl

16、ags,int x,int y,int nReserved,HWND hWnd,CONST RECT* prcRect);其中参数含义为:uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:TPM_CENTERALIGN:函数将按参数x指定的坐标水平居中放置快捷菜单。TPM_LEFTALIGN:函数使快捷菜单的左边界与由参数X指定的坐标对齐。TPM_RIGHTALIGN:函数使快捷菜单的右边界与由参数X指定的坐标对齐。用下列标志位之一来确定函数如何垂直放置快捷菜单:TPM_BOTTOMALIGN:函数使快捷菜单的下边界与由参数y指定的坐标对齐。TPM_TOP

17、ALIGN:函数使快捷菜单的上边界与由参数y指定的坐标对齐。TPM_VCENTERALIGN:函数将按参数y指定的坐标垂直居中放置快捷菜单。用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择: TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。 TPM_RETURNCMD:若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。x:在屏幕坐标下,快捷菜单的水平位置。 y:在屏幕坐标下,快捷菜单的垂直位置。 NReserved:保留值,必须为零。 HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMM

18、AND消息。prcRect:未用。返回值:如果在参数uFlags里指定了TPM_RETURNCMD值,则返回值是用户选择的菜单项的标识符。如果用户未作选择就取消了菜单或发生了错误,则退回值是零。如果没在参数uFlags里指定TPM_RETURNCMD值,若函数调用成功,返回非零值,若函数调用失败,返回零。212. 右键菜单(7)完成菜单项响应函数OnModify()。在这个函数中,根据列表视图控件中的被选中项的数据弹出修改对话框,确认修改后将新数据更 新 到 列 表 视 图 与 树 节 点 中 。 在 编 写OnModify()函数之前需要先建立修改人员对话 框 , 参 照 添 加 人 员 对

19、 话 框 , 建 立IDD_MODIFY_DIALOG对话框,并为其添加类CModifyDlg,可参见例8-1的步骤8到步骤11。除此之外,修改对话框初始时应该显示待修改人员的信息,所以需要一个传递数据的函数SetValue,其定义如下,注意需要同时在ModifyDlg.h文件中添加声明。 222. 右键菜单void CModifyDlg:SetValue(CString name, CString number)m_strName = name;m_strNumber = number;232. 右键菜单OnModify()函数编写为: void CPhoneDlg:OnModify() /

20、查找列表视图中被选中项的标号int i;for(i=0; i= m_listPhone.GetItemCount()return;/得到被选中项的数据CString name = m_listPhone.GetItemText(i,0);CString number = m_listPhone.GetItemText(i,1);/声明对话框对象,并设置数据CModifyDlg dlg;dlg.SetValue(name,number);GetItemState()函数的功能是获得列表视图控件中某项的状态信息,其函数声明为:UINT GetItemState( int nItem, UINT nMask ) const;其中参数含义为:nItenm:项的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论