您好,欢迎访问三七文档
1第14讲完整电话薄2为了完善电话簿的功能,需要对例8-2进行改进:(1)在界面右侧添加列表视图控件,显示某一分组下所有人员的姓名和电话号码(2)在列表视图控件中添加右键菜单,以修改相应数据。3本讲主要内容1.列表视图控件2.右键菜单41.列表视图控件列表视图控件区别于列表框控件,可以用来显示和管理一系列子项,每个子项可以包含一个包含在图像列表中的图标,列表视图控件允许以多种方式显示子项。51.列表视图控件【例8-3】完整电话薄该例能够在列表视图中显示人员的姓名和电话号码。61.列表视图控件操作步骤:在例8-2的基础上,进行如下操作。(1)在ResourceView视图中,添加列表视图控件,ID修改为IDC_LIST,并将properties中Styles选项卡中View选项修改为Report,如图所示。71.列表视图控件(2)打开ClassWizard,在MemberVariables选项卡中为IDC_LIST添加Control类型关联变量m_listPhone。81.列表视图控件(3)在OnInitDialog()函数添加如下代码:BOOLCPhoneDlg::OnInitDialog(){……m_treePhone.SetItemData(h3,(DWORD)pString);m_listPhone.InsertColumn(0,姓名,LVCFMT_LEFT,100);m_listPhone.InsertColumn(1,电话号码,LVCFMT_LEFT,120);m_listPhone.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);returnTRUE;}当选择Report风格时,实际上列表视图控件就变为表格样式,因此,需要列表视图控件设置表头信息。函数声明为:intInsertColumn(intnCol,LPCTSTRlpszColumnHeading,intnFormat=LVCFMT_LEFT,intnWidth=-1,intnSubItem=-1);其中参数含义为:nCol:要插入列的列号。lpszcolumnHeading:为列标题的字符串的地址。nFormat:指定列对齐方式的整数,缺省值是左对齐。它可以为下列值之一:LVCFMT_LEFT,LVCFMT_RIGHT或LVCFMT_CENTER。nWidth:以像素为单位的列宽。缺省值为-1,表示没有设置列宽。nSubItem:与列相关联的子项的索引。缺省值为-1,表示没有子项与列相关。SetExtendedStyle()函数功能设置CListCtrl的扩展样式,其函数声明为:DWORDSetExtendedStyle(DWORDdwNewStyle);其中参数含义为: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)打开ClassWizard,在MessageMaps选项卡中为IDC_TREE添加TVN_SELCHANGED消息响应函数OnSelchangedTree(),该函数在树中被选中节点发生变化时调用。101.列表视图控件(5)在OnSelchangedTree()函数中添加如下代码:voidCPhoneDlg::OnSelchangedTree(NMHDR*pNMHDR,LRESULT*pResult){NM_TREEVIEW*pNMTreeView=(NM_TREEVIEW*)pNMHDR;HTREEITEMselItem=m_treePhone.GetSelectedItem();//获得树中选中节点if(selItem==m_treePhone.GetRootItem())//如果没有选中节点,返回return;DWORDm=m_treePhone.GetItemData(selItem);//获得选中节点关联数据if(m==NULL)//如果为空,是分组节点{refreshList(selItem);//刷新列表视图中的数据}*pResult=0;}函数GetSelectedItem()获得树控件中当前被选中的节点句柄refreshList是自定义函数,其功能是在列表视图中显示树中某一分组节点下的所有人员信息111.列表视图控件voidCPhoneDlg::refreshList(HTREEITEMparent){m_listPhone.DeleteAllItems();//删除原有数据intindex=0;//遍历获得该分组节点下的所有子节点HTREEITEMchild=m_treePhone.GetChildItem(parent);while(child!=NULL){DWORDn=m_treePhone.GetItemData(child);CString*pString=(CString*)n;//得到人员节点中的关联电话号码//在列表视图中添加一项m_listPhone.InsertItem(index,m_treePhone.GetItemText(child));m_listPhone.SetItemText(index,1,*pString);//在列表视图中设置一子项index++;child=m_treePhone.GetNextSiblingItem(child);//得到下一个兄弟节点}}InsertItem()功能是在列表视图控件中插入一项,包括文件名称和图标,其中InsertItem的函数声明为:intInsertItem(intnItem,LPCTSTRlpszItem,intnImage);nItem:插入项索引号。lpszItem:插入项的文本显示。nImage:图标索引。SetItemText()函数用于设置列表视图控件项或子项的文本,其函数声明如下:BOOLSetItemText(intnItem,intnSubItem,LPCTSTRlpszText);其中参数含义为:nItem:项的索引。nSubItem:子项的索引。lpszText:包含新项文本的字符串指针。121.列表视图控件(6)为了使添加、删除人员后列表视图中数据与树中节点一致,需要修改OnAdd()和OnDelete()函数。voidCPhoneDlg::OnAdd(){……if(dlg.DoModal()==IDOK)//显示添加人员对话框,并单击确定按钮{……m_treePhone.SetItemData(item,(DWORD)pString);//设置关联数据refreshList(selItem);}……}131.列表视图控件voidCPhoneDlg::OnDelete(){……if(AfxMessageBox……==IDOK){HTREEITEMparent=m_treePhone.GetParentItem(selItem);CString*pString=(CString*)m;//删除关联数据deletepString;m_treePhone.DeleteItem(selItem);//删除节点refreshList(parent);}……}在OnDelete()函数中,选中节点不是分组节点,而是人员节点,因此需要首先获得其对应的分组节点,然后刷新列表视图。GetParentItem()不能写在DeleteItem()函数之后。141.列表视图控件(7)编译、链接、运行。152.右键菜单对于例8-3中的电话簿程序,能够实现添加、删除人员,但缺少修改数据功能。我们仍然可以仿照添加、删除方式,再添加一个“修改”按钮,但为了让案例更加丰富,本节将通过右键菜单方式来修改人员数据。162.右键菜单操作步骤:在例8-3的基础上,进行如下操作。(1)在ResourceView视图中,单击菜单Insert|Resource命令,选择Menu,单击“New”按钮,结果下图所示172.右键菜单(2)双击虚线框,在Caption中录入“1”。(3)添加1个菜单项,如下图所示,其ID为ID_MODIFY。182.右键菜单(4)打开ClassWizard,在MessageMaps选项卡中分别为ID_MODIFY添加COMMAND消息响应函数。(5)打开ClassWizard在MessageMaps选项卡中为IDC_LIST添加NM_RCLICK消息响应函数OnRclickList(),在列表视图控件上右键单击会调用该函数。192.右键菜单(6)在OnRclickList()函数中添加如下代码:voidCPhoneDlg::OnRclickList(NMHDR*pNMHDR,LRESULT*pResult){CMenum_menu;m_menu.LoadMenu(IDR_MENU1);//加载整条菜单CMenu*pMenu=m_menu.GetSubMenu(0);//获得第一个菜单POINTp;GetCursorPos(&p);//获得鼠标位置pMenu-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,p.x,p.y,this);pMenu-DestroyMenu();//销毁菜单*pResult=0;}CMenu是MFC封装菜单资源的类LoadMenu()函数加载菜单资源获取第一个子菜单获取鼠标当前坐标位置TrackPopupMenu()函数的功能是指定位置显示快捷菜单,并跟踪菜单项的选择。函数声明为:BOOLTrackPopupMenu(UINTuFlags,intx,inty,intnReserved,HWNDhWnd,CONSTRECT*prcRect);负责销毁菜单对象202.右键菜单BOOLTrackPopupMenu(UINTuFlags,intx,inty,intnReserved,HWNDhWnd,CONSTRECT*prcRect);其中参数含义为:uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:TPM_CENTERALIGN:函数将按参数x指定的坐标水平居中放置快捷菜单。TPM_LEFTALIGN:函数使快捷菜单的左边界与由参数X指定的坐标对齐。TPM_RIGHTALIGN:函数使快捷菜单的右边界与由参数X指定的坐标对齐。用下列标志位之一来确定函数如何垂直放置快捷菜单:TPM_BOTTOMALIGN:函数使快捷菜单的下边界与由参数y指定的坐标对齐。TPM_TOPALIGN:函数使快捷菜单的上边界与由参数y指定的坐标对齐。TPM_VCENTERALIGN:函数将按参数y指定的坐标垂直居中放置快捷菜单。用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。TPM_RETURNCMD:若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。x:在屏幕坐标下,快捷菜单的水平位置。y:在屏幕坐标下,快捷菜单的垂直位置。NReserved:保留值,必须为零。HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMMAND消息。prcRect:未用。返回值:如果在参数uFlags里指定了TPM_RETURNCMD值,则返回值是用户选择的菜单项的标识符。如果用户未作选择就取消了菜单或发生了错误,则退回值是零。如果没在参数uFlags里指定TPM_RETURNC
本文标题:第14讲完整电话薄
链接地址:https://www.777doc.com/doc-3397381 .html