1、:UpdateAllViews和Cview:OnUpdate的相互作用来实现的,而且为了避免传输的相互干涉,采用提示号来区分,即给1Hint变量赋予不同的值,程序代码会根据1Hint的值的不同执行不同的代码,并使数据显示出来。在实现保存功能时用到了简单数组集合类,并利用了CstringArray序列化的一个内部机制实现数据的保存。打开一个已经保存过的文件时通过1Hint值的判断来执行一个双循环,通过此双循环代码可以让一个由简单数组集合类定义的变量中的数据读取出来,并在列表视图中显示。为了实现一个列表项基本信息在左面的表单视图的控件中显示,需要视图和文档数据的交换,此程序以在Doc类中事先定义好
2、的变量为媒介,通过给这些变量赋值来实现数据在文档和视图之间的回传。四、设计的步骤及主要代码首先为此程序(工程名为TiMu1)创建一个表单视图,在用MFC AppWizard创建的第六步中选择CFormView作为文档应用程序视图类的基类。然后再添加一个CListView类的派生类,派生类名为CListCtrlView,此派生类将在切分窗口使用到。还有一点很重要,要使添加的派生类正确编译,那么必须在StdAfx.h头文件中有下列语句才能保证程序正确编译。#inciude”afxcview.h”为CmainFrame添加OnCreateClient消息映射和和一个CsplitterWnd形的变量,
3、变量名为m_wndSplitter,并在函数中添加如下代码:BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) ModifyStyle(0,WS_VSCROLL,0);/让窗口有水平,垂直滚动条ModifyStyle(0,WS_HSCROLL,0);CRect rect;GetWindowRect(&rect);m_wndSplitter.CreateStatic(this,1,2);/静态切分窗口 m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTi
4、Mu1View),CSize(0,0),pContext);/为相应的窗格指定一个视图类 m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CListCtrlView),CSize(0,0),pContext);m_wndSplitter.SetColumnInfo(0,rect.Width()/3,10);/设置窗格的宽度.m_wndSplitter.SetColumnInfo(1,rect.Width()/2,10);m_wndSplitter.RecalcLayout();/重新布局return TRUE;return CFrameWnd:OnCrea
5、teClient(lpcs, pContext);在表单视图中添加程序所需要的几个控件并在类向导中设置控件的关联变量,再为各个按钮控件(添加、删除、修改、浏览和查询)映射BN_CLICKED(单击)消息映射,取默认的函数名。各个函数中添加的代码如下:添加功能:void CTiMu1View:OnButtonAdd() UpdateData(); m_strName.TrimLeft(); m_strNo.TrimLeft(); if(m_strName.IsEmpty() MessageBox(必须要有姓名!); return; if(m_strNo.IsEmpty()必须要有学号! CTiM
6、u1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc-no=m_strNo;name=m_strName;age=m_strAge; if(m_bMale) pDoc-sex=男; else pDoc-女 /下面的代码传递一个“1”的消息 /以实现调用CListCtrlView函数中的OnUpdate函数 /并通过判断 lHint 的值为 1 来实现表单控件的数据 /在列表里显示UpdateAllViews(NULL,1,NULL); /下面的代码是在要添加的数据在右面的列表中显示后,使左面的控件恢复“空白”的状态,以方便用户的下一次添加数
7、据 m_strNo= m_strName= m_strAge= UpdateData(FALSE); 删除功能:OnButtonDel() /*下面的代码传递一个“2”的消息以实现调用CListCtrlView函数中的OnUpdate函数并通过判断 lHint 的值为 2 来实现在列表里删除一个列表项的信息*/UpdateAllViews(NULL,2,NULL);修改功能:OnButtonXiugai() /*下面的代码传递一个“3”的消息以实现调用CListCtrlView函数中的OnUpdate函数并通过判断 lHint 的值为 3 来实现在列表里修改一个列表项的信息并把修改后的信息覆盖
8、到原来的那个列表项上*/UpdateAllViews(NULL,3,NULL);查询功能:OnButtonChaxun() / TODO: Add your control notification handler code here /*下面的代码传递一个“4”的消息以实现调用CListCtrlView函数中的OnUpdate函数并通过判断 lHint 的值为 4 来实现在列表里查询一个列表项的信息并通过弹出一个对话框显示所要查询的一个学生信息*/UpdateAllViews(NULL,4,NULL);浏览功能:OnButtonLiulan() UpdateAllViews(NULL,5,N
9、ULL);说明:上面的代码传递一个“n”(n为int形变量并根据不同的函数取不同的值)的消息以实现调用CListCtrlView函数中的OnUpdate函数,并通过判断 lHint 的值来实现在列表里添加、删除、修改、浏览或查询一个列表项的信息。UpdateAllViews(NULL,n,NULL)函数所传递的1Hint的不同的值需要一个相应的函数用来接收和判断的值,并通过1Hint值的不同执行不同的代码,这样的函数需要在 ClistCtrlView类中映射OnUpdate消息来实现,函数的代码为:void CListCtrlView:OnUpdate(CView* pSender, LPAR
10、AM lHint, CObject* pHint) CListCtrl& m_ListCtrl=GetListCtrl(); m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);/*设置在单击列表项时,整行选择。下面的代码是利用1Hint的不同的值来建立数据的传输在视图中根据1Hint的值做出不同的动作,并在每个if语句中通过一个for循环使列表中的数据保存到一个简单数组集合类中,即保存到了在Doc类中定义的 CStringArray m_strContents对象中。在每次调用保存代码时,必须调用 pDoc-m_strContents.Remo
11、veAll(); 语句以使m_strContents对象中数据清零,防止在保存后,然后在打开时数据出现错误*/ /这句话在出现错误后,好久才想出来! if(lHint=1) CTiMu1Doc*pDoc=(CTiMu1Doc*)GetDocument(); ASSERT_VALID(pDoc); /m_ListCtrl.DeleteAllItems(); LVFINDINFO info; info.flags=LVFI_PARTIAL|LVFI_STRING; info.psz=pDoc-no; if(m_ListCtrl.FindItem(&info)!=-1) CString str; s
12、tr.Format(不能添加学号相同的学生信息!n学号为“%s”的学生基本信息已添加过!,pDoc-no); MessageBox(str,警告,MB_ICONSTOP|MB_OKCANCEL); return; m_ListCtrl.InsertItem(0, m_ListCtrl.SetItemText(0,0,pDoc- m_ListCtrl.SetItemText(0,1,pDoc-name); m_ListCtrl.SetItemText(0,2,pDoc-sex); m_ListCtrl.SetItemText(0,3,pDoc-age); CString str1=pDoc- CString str2; str2.Format(添加了学号为“%s”的学生信息!nt添加成功!nt,str1); MessageBox(str2,添加结果,MB_ICONWARNING|MB_OKCANCEL); int nCount=m_ListCtrl.GetItemCount();/*这句话的作用是使m_strContents对象中数据清零,防止在保存后,然后在打开时数据出现错误*/ for(int n=0;nm_strContents.GetSize();
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2