药品信息管理系统
1 系统分析
1.1需求分析:
对药品信息管理主要需求就是对药品信息进行基本的管理,用户需要及时准确地掌握该诊所内现有的药品的基本信息(主要包括数量,单价,是否过期等)。同时,用户要求操作界面友好,操作简便,对数据库的操作安全可靠,药品从数据库中修改了,但还没结算时断电,要求数据库应该能恢复。
1.2功能分析:
系统需要实现的主要功能包括查询,删除,增加,修改四部分,各功能具体如下表所示
:
表1-1 系统的主要功能分析
2. 系统设计
2.1 绘制用例图设计系统功能
药品信息管理系统一共包含3钟用户角色,分别是医生,售药员,和管理员,权限依次提高,医生权限是可以查询库存药品信息,提供基本的用户管理功能(更改密码,更换用户), 例图如下
医生用例图
售药员的权限在医生的基础上,还具有药品管理的药品销售功能,用例图如下:
售药员用例图
管理员具有所有权限,包括查询药品,增加药品条目,出售药品,清理药库(包括清除数量为0的药品,清除过期药品等)及所有的用户管理功能,用例图如下:
管理员用例图
2.2 绘制系统流程图
本系统需要对用户身份进行验证,验证通过后再判断用户是属于医生,售药员或者是管理员中的哪一个角色,根据角色判断用户可以使用系统中的相应操作功能这里以管理员的身份为例 ,其流程图如下:
系统流程图
3. 数据库分析与设计
3.1 数据库概念设计
本系统一共设计规划出三个实体,分别是用户信息实体,药品信息实体,药品销售实体。
用户信息实体用于记录系统登录用户的信息,包括账号,密码,权限等相关信息其E-R 图如下:
图3-1 用户信息实体
药品信息实体是数据库的核心,记录了所存储的药品的基本信息,其E-R 图如下:
药品信息实体E-R 图
药品销售实体则记录了药品销售的相关信息,主要指药品的出售数量,出售总价等,其E-R 图如下:
药品销售实体E-R 图
3.2 数据库逻辑结构设计
根据设计好的各实体E-R 图创建数据库的逻辑结构,数据库各表的结构如下。 共3张表,分别是tb_medicine 和 tb_user,tb_saleTable. 表3-1 tb_medicine(药品基本信息表)
表3-2 tb_user(用户信息表
)
表3-3 tb_saleTable(药品销售表
)
3.3 数据库物理结构设计
3.4 系统类库设计
药品信息管理系统中的类库主要设计如下:
1. 药品管理类 CManageMecdic :用于对药库进行管理,主要包括药品入库,药品的出售,药库的清理,以及为实现这些函数而加的成员函数。
2. 药品查询类 CMedicSearch :其成员函数主要包括一般查询,查询库中数量为0的药品,查询过期药品等。
3. 用户管理类CUser :主要设立了为完成以下功能的成员函数,如新增用户,删除用户,查询用户信息,修改用户密码等。
4. 药品类CMedic :相当于一结构体,只是为了给系统提供一个数据类型,以对药品进行必要的管理,该类没有成员函数,该类一般作为CManageMedic 和CMedicSearch 类的一个成员变量。
5. 出售单类CSale :主要是给系统提供一个数据类型,以对药品出售进行有效的管理,该类也没有成员函数,该类作为CManageMedic 类的一个成员变量。 6. CMedicSet ,CUserSer ,CSaleSet 类:用于与数据库中的表相连,它们从CRecordSer 继承而来。
7. 一些对话框类:该系统许多地方都用到了对话框,这类对话框主要有CLlogInDlg ,CChangPasswordDlg ,CUserChangDlg,CStoreDlg ,CCleanUpDlg ,CSaleDlg 等
8. 系统本身提供的框架类:如CMainFrm ,CMedicAdminDoc ,CMedicAdminApp ,CMedicAdmicView 等。
3.5 公用模块设计
为了节省系统资源,实现代码重用,提高程序运行速度,可以将一些公用的数据信息放到模块中。本系统自定义了CManageMdedic ,CMedicSearch ,CSale ,CUser ,和CMedic 类模块,而且从CRecordSet 继承了CMedicSet ,CUserSet ,CSaleSer 类,连接数据库中对应的表。 a . 药品类 CMedic
该类主要用于记录药品信息表中的各字段,主要包含一些成员变量,无成员函数。 class CMedic {
public:
CMedic();
virtual ~CMedic(); public:
CString m_MedicineID; CString m_MedicineName;
CString m_MedicineClassification; CTime m_ProduceDate; CString m_Produceplace; int m_MedicineNumber; CString m_Description; float m_UnitPrice; int m_QeulityAssurancePeriod; int m_LowestNumber; int m_HighestNumber; CString m_ProduceCompany; };
b. 出售单类CSale
出售单类记录saleTable 数据表中的字段值,主要包含一些成员变量,无成员函数
class CSale {
public:
CSale();
virtual ~CSale();
public:
CString m_MedicineID; CString m_MedicineName; int m_MedicineNumber; float m_MedicinePrice; };
c .药品管理类CManageMedic
该类主要实现药品的操作功能,包括药品入库,药品出售,和药品处理等,其成员变量和成员函数的定义如下:
class CManageMedic {
public:
void DeleteOverdueMedic(); void DeleteAllZeroNumber(); CTime GetExpireTime(); float CheckOut(); BOOL Recover();
BOOL DeleteFromSaleTable(); BOOL ModifyFromSaleTable(); BOOL AddToSaleTable();
void SetSaleSet(CSaleSet* theSaleSet); void SetSale(CSale* theSale); void Import();
void SetMedicSet(CMedicSet* theMedicSet); void SetMedic(CMedic* theMedic); CManageMedic();
virtual ~CManageMedic();
protected:
CMedic* m_theMedic;
CMedicSet* m_theMedicSet; CSale* m_theSale;
CSaleSet* m_theSaleSet; };
d .药品查询类CMedicSearch
该类实现药品的各种查询功能,其成员变量和成员函数的定义如下。
class CMedicSearch
{
public:
void SearchOverdueMedic(); void SearchZeroNumber(); void SearchAll();
void Search(CString str,int flag);
void SetMedicSet(CMedicSet* theMedicSet); void SetListCtrl(CListCtrl* theListCtrl); CMedicSearch();
virtual ~CMedicSearch(); protected:
CMedicSet* m_theMedicSet; CListCtrl* m_theListCtrl; };
e .用户管理类CUser
该类实现用户的管理功能,包括用户登录,注册用户,查询用户,更换用户,修改密码,其成员变量和才成员函数的定义如下:
class CUser {
public:
void ModifyPassword(CUserSet* theSet); CString GetPassword(); CString GetAccount();
void SetPassword(CString password); CString GetType();
void SeekUserInfo(int typeRadio,CString str,CUserSet* theSet); void SetAccount(CString account);
void DeleteUser(CUser* user,CUserSet* userSet);
BOOL AddNewUser(CUser* newUser,CUserSet* theSet);
void SetAllMember(CString account,CString password,CString type,CString name);
BOOL LogIn(CUserSet*); CUser();
virtual ~CUser();
protected:
CString m_userAccount; CString m_userPassword; CString m_userName; CString m_userType; };
f .记录集类CMedicSet ,CUserSet ,CSaleSet
这3个类是以CRecordSet 类为基类创建的,分别连接数据库中的medicine 表,
user 表,saleTable 表,通过Visual C++6.0提供的类创建向导对话框,可以实现这3个类的创建。以CMedicSet 类为例,创建过程如下:
在Visual C++6.0中,执行“Insert ”→“New Class“菜单命令,弹出”New Class“对话框,在其中设置创建的类CMedicSet 和基类CRecordSet 如下图。
同理CUserSet 和CSaleSet 创建过程也是这样。
3.6 主界面设计
系统采用标准的单文档程序界面,并采用窗口分隔技术将客户窗口试图分隔为左右两部分,分别用于显示用户信息和药品信息。
药品信息视图类 CMedicListView
以CListView 类为基类,创建新的列表视图类CMedicListView ,通过列表的形式显示药品信息。在CMedicListView 类的OnCreate 函数中,创建列表项和表头,主要代码如下。
int CMedicListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
theListCtrl=&GetListCtrl();
ModifyStyle(0,LVS_REPORT);
ASSERT(GetStyle() & LVS_REPORT);
CString medicField[9]={"药品代码"," 药品名称"," 药品类别"," 库存数量"," 出产公司"," 产地"," 出产时间"," 保质期(月)"," 单价(元)"};
for(int i=0;i
{
theListCtrl->InsertColumn(i,medicField[i],LVCFMT_LEFT,70);
}
theListCtrl->InsertColumn(8,medicField[8],LVCFMT_LEFT,58);
return 0;
}
用户信息视图类CUserTreeView
以CTreeView 类为基类,创建新的树形视图类CUserTreeview ,以树的形式显示用户类别及各类别下注册的用户。在CUserTreeView 类的PreCreateWindows 函数中,设置树形控件的属性,主要代码如下:
BOOL CUserTreeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT; return CTreeView::PreCreateWindow(cs);
}
在CUserTreeView 类的OnInitialUpdate 函数中,设置医生,售药员,和管理员三个树的根目录,并读取数据库中用户表中的数据,将相应类别的用户代码添加的树到子目录中。
void CUserTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
m_theTreeCtrl=&GetTreeCtrl();
m_theImageList.Create(IDB_TREE_BITMAP,16,1,RGB(0,255,0));
m_theTreeCtrl->SetImageList(&m_theImageList,TVSIL_NORMAL); CString userTreeHeader[3]={"医生"," 售药员"," 管理员"};
HTREEITEM userItem[3];
for(int i=0;i
{
userItem[i]=m_theTreeCtrl->InsertItem(userTreeHeader[i],0,0,TVI_ROOT); m_theTreeCtrl->SetItemData(userItem[i],(DWORD)i);
}
CMedicAdminDoc* pDoc=(CMedicAdminDoc*)GetDocument();
CUserSet* userSet=&pDoc->theUserSet;
if(userSet->IsOpen())
{
userSet->Close();
}
userSet->Open();
CLogInDlg logInDlg;
logInDlg.DoModal();
CUser* theUser=&pDoc->theUser;
HTREEITEM thePoint;
for(i=0;i
{
userSet->m_strFilter="UserClassification='"+userTreeHeader[i]+"'"; userSet->Requery();
for(int j=0;;j++)
{
if(userSet->IsEOF())
{
break;
}
if(userSet->m_UserAccount==theUser->GetAccount())
{
HTREEITEM
userSpecifics=m_theTreeCtrl->InsertItem(userSet->m_UserAccount+"(当前用户)",2,2,userItem[i]);
m_theTreeCtrl->SetItemData(userSpecifics,(DWORD)j); thePoint=userSpecifics;
}
else
{
HTREEITEM
userSpecifics=m_theTreeCtrl->InsertItem(userSet->m_UserAccount,3,3,userItem[i]); m_theTreeCtrl->SetItemData(userSpecifics,(DWORD)j); }
userSet->MoveNext();
}
}
m_theTreeCtrl->Select(thePoint,TVGN_CARET);
}
实现视图窗口的分隔
窗口分隔采用静态分隔的方式。在主框架类CMainFrame 的OnCreateClient 函数中,通过CSplitterWnd 类将客户窗口分隔为左右两部分,并分别对应前面创建的两个视图类,主要代码如下:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
m_wndSplitter.CreateStatic(this,1,2);//分割窗口为两列
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CUserTreeView),CSize(130,600),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMedicListView),CSize(700,600),pContext);
return TRUE;
//return CFrameWnd::OnCreateClient(lpcs, pContext);
}
其中,m_wndSplitter在头文件中定义的CSplitterWnd 类对象如下
Protected :
CSplitterWnd m_wndSplitter;
3.7 登录模块设计
当程序启动时,在主界面窗口出现之前,首先弹出登录对口框,如下图,用户需要输入账号,密码等信息,只有通过验证的用户才能进入系统,否则系统自动退出。登录对口框对应的对话框类为ClogInDlg ,在CUserTreeView 类的OnInitialUpdate 函数中创建和调用,登录对话框确定按钮响应函数OnOK 的实现代码如下:
void CLogInDlg::OnOK()
{
// TODO: Add extra validation here
CMedicAdminDoc*
pDoc=(CMedicAdminDoc*)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();
UpdateData(TRUE);
pDoc->theUser.SetAllMember(m_userAccount,m_userPassword,m_userType,"");
CUserSet* theUserSet=&pDoc->theUserSet;
BOOL flag=pDoc->theUser.LogIn(theUserSet);
if(flag)
{
CDialog::OnOK();
}
else
{
AfxMessageBox("您无权进入该系统");
ExitProcess(1);
//CDialog::OnOK();
}
}
上述函数中的这行代码BOOL flag=pDoc->theUser.LogIn(theUserSet); 使用了CUser 类的LogIn 函数对用户的登录信息进行验证,实现代码如下:
BOOL CUser::LogIn(CUserSet* theSet)
{
theSet->m_strFilter="UserAccount='"+m_userAccount+"' and UserPassword='" +m_userPassword+"' and UserClassification='"+m_userType+"'"; theSet->Requery();
if(theSet->GetRecordCount())
{
return TRUE;
}
return FALSE;
}
药品信息管理系统
1 系统分析
1.1需求分析:
对药品信息管理主要需求就是对药品信息进行基本的管理,用户需要及时准确地掌握该诊所内现有的药品的基本信息(主要包括数量,单价,是否过期等)。同时,用户要求操作界面友好,操作简便,对数据库的操作安全可靠,药品从数据库中修改了,但还没结算时断电,要求数据库应该能恢复。
1.2功能分析:
系统需要实现的主要功能包括查询,删除,增加,修改四部分,各功能具体如下表所示
:
表1-1 系统的主要功能分析
2. 系统设计
2.1 绘制用例图设计系统功能
药品信息管理系统一共包含3钟用户角色,分别是医生,售药员,和管理员,权限依次提高,医生权限是可以查询库存药品信息,提供基本的用户管理功能(更改密码,更换用户), 例图如下
医生用例图
售药员的权限在医生的基础上,还具有药品管理的药品销售功能,用例图如下:
售药员用例图
管理员具有所有权限,包括查询药品,增加药品条目,出售药品,清理药库(包括清除数量为0的药品,清除过期药品等)及所有的用户管理功能,用例图如下:
管理员用例图
2.2 绘制系统流程图
本系统需要对用户身份进行验证,验证通过后再判断用户是属于医生,售药员或者是管理员中的哪一个角色,根据角色判断用户可以使用系统中的相应操作功能这里以管理员的身份为例 ,其流程图如下:
系统流程图
3. 数据库分析与设计
3.1 数据库概念设计
本系统一共设计规划出三个实体,分别是用户信息实体,药品信息实体,药品销售实体。
用户信息实体用于记录系统登录用户的信息,包括账号,密码,权限等相关信息其E-R 图如下:
图3-1 用户信息实体
药品信息实体是数据库的核心,记录了所存储的药品的基本信息,其E-R 图如下:
药品信息实体E-R 图
药品销售实体则记录了药品销售的相关信息,主要指药品的出售数量,出售总价等,其E-R 图如下:
药品销售实体E-R 图
3.2 数据库逻辑结构设计
根据设计好的各实体E-R 图创建数据库的逻辑结构,数据库各表的结构如下。 共3张表,分别是tb_medicine 和 tb_user,tb_saleTable. 表3-1 tb_medicine(药品基本信息表)
表3-2 tb_user(用户信息表
)
表3-3 tb_saleTable(药品销售表
)
3.3 数据库物理结构设计
3.4 系统类库设计
药品信息管理系统中的类库主要设计如下:
1. 药品管理类 CManageMecdic :用于对药库进行管理,主要包括药品入库,药品的出售,药库的清理,以及为实现这些函数而加的成员函数。
2. 药品查询类 CMedicSearch :其成员函数主要包括一般查询,查询库中数量为0的药品,查询过期药品等。
3. 用户管理类CUser :主要设立了为完成以下功能的成员函数,如新增用户,删除用户,查询用户信息,修改用户密码等。
4. 药品类CMedic :相当于一结构体,只是为了给系统提供一个数据类型,以对药品进行必要的管理,该类没有成员函数,该类一般作为CManageMedic 和CMedicSearch 类的一个成员变量。
5. 出售单类CSale :主要是给系统提供一个数据类型,以对药品出售进行有效的管理,该类也没有成员函数,该类作为CManageMedic 类的一个成员变量。 6. CMedicSet ,CUserSer ,CSaleSet 类:用于与数据库中的表相连,它们从CRecordSer 继承而来。
7. 一些对话框类:该系统许多地方都用到了对话框,这类对话框主要有CLlogInDlg ,CChangPasswordDlg ,CUserChangDlg,CStoreDlg ,CCleanUpDlg ,CSaleDlg 等
8. 系统本身提供的框架类:如CMainFrm ,CMedicAdminDoc ,CMedicAdminApp ,CMedicAdmicView 等。
3.5 公用模块设计
为了节省系统资源,实现代码重用,提高程序运行速度,可以将一些公用的数据信息放到模块中。本系统自定义了CManageMdedic ,CMedicSearch ,CSale ,CUser ,和CMedic 类模块,而且从CRecordSet 继承了CMedicSet ,CUserSet ,CSaleSer 类,连接数据库中对应的表。 a . 药品类 CMedic
该类主要用于记录药品信息表中的各字段,主要包含一些成员变量,无成员函数。 class CMedic {
public:
CMedic();
virtual ~CMedic(); public:
CString m_MedicineID; CString m_MedicineName;
CString m_MedicineClassification; CTime m_ProduceDate; CString m_Produceplace; int m_MedicineNumber; CString m_Description; float m_UnitPrice; int m_QeulityAssurancePeriod; int m_LowestNumber; int m_HighestNumber; CString m_ProduceCompany; };
b. 出售单类CSale
出售单类记录saleTable 数据表中的字段值,主要包含一些成员变量,无成员函数
class CSale {
public:
CSale();
virtual ~CSale();
public:
CString m_MedicineID; CString m_MedicineName; int m_MedicineNumber; float m_MedicinePrice; };
c .药品管理类CManageMedic
该类主要实现药品的操作功能,包括药品入库,药品出售,和药品处理等,其成员变量和成员函数的定义如下:
class CManageMedic {
public:
void DeleteOverdueMedic(); void DeleteAllZeroNumber(); CTime GetExpireTime(); float CheckOut(); BOOL Recover();
BOOL DeleteFromSaleTable(); BOOL ModifyFromSaleTable(); BOOL AddToSaleTable();
void SetSaleSet(CSaleSet* theSaleSet); void SetSale(CSale* theSale); void Import();
void SetMedicSet(CMedicSet* theMedicSet); void SetMedic(CMedic* theMedic); CManageMedic();
virtual ~CManageMedic();
protected:
CMedic* m_theMedic;
CMedicSet* m_theMedicSet; CSale* m_theSale;
CSaleSet* m_theSaleSet; };
d .药品查询类CMedicSearch
该类实现药品的各种查询功能,其成员变量和成员函数的定义如下。
class CMedicSearch
{
public:
void SearchOverdueMedic(); void SearchZeroNumber(); void SearchAll();
void Search(CString str,int flag);
void SetMedicSet(CMedicSet* theMedicSet); void SetListCtrl(CListCtrl* theListCtrl); CMedicSearch();
virtual ~CMedicSearch(); protected:
CMedicSet* m_theMedicSet; CListCtrl* m_theListCtrl; };
e .用户管理类CUser
该类实现用户的管理功能,包括用户登录,注册用户,查询用户,更换用户,修改密码,其成员变量和才成员函数的定义如下:
class CUser {
public:
void ModifyPassword(CUserSet* theSet); CString GetPassword(); CString GetAccount();
void SetPassword(CString password); CString GetType();
void SeekUserInfo(int typeRadio,CString str,CUserSet* theSet); void SetAccount(CString account);
void DeleteUser(CUser* user,CUserSet* userSet);
BOOL AddNewUser(CUser* newUser,CUserSet* theSet);
void SetAllMember(CString account,CString password,CString type,CString name);
BOOL LogIn(CUserSet*); CUser();
virtual ~CUser();
protected:
CString m_userAccount; CString m_userPassword; CString m_userName; CString m_userType; };
f .记录集类CMedicSet ,CUserSet ,CSaleSet
这3个类是以CRecordSet 类为基类创建的,分别连接数据库中的medicine 表,
user 表,saleTable 表,通过Visual C++6.0提供的类创建向导对话框,可以实现这3个类的创建。以CMedicSet 类为例,创建过程如下:
在Visual C++6.0中,执行“Insert ”→“New Class“菜单命令,弹出”New Class“对话框,在其中设置创建的类CMedicSet 和基类CRecordSet 如下图。
同理CUserSet 和CSaleSet 创建过程也是这样。
3.6 主界面设计
系统采用标准的单文档程序界面,并采用窗口分隔技术将客户窗口试图分隔为左右两部分,分别用于显示用户信息和药品信息。
药品信息视图类 CMedicListView
以CListView 类为基类,创建新的列表视图类CMedicListView ,通过列表的形式显示药品信息。在CMedicListView 类的OnCreate 函数中,创建列表项和表头,主要代码如下。
int CMedicListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
theListCtrl=&GetListCtrl();
ModifyStyle(0,LVS_REPORT);
ASSERT(GetStyle() & LVS_REPORT);
CString medicField[9]={"药品代码"," 药品名称"," 药品类别"," 库存数量"," 出产公司"," 产地"," 出产时间"," 保质期(月)"," 单价(元)"};
for(int i=0;i
{
theListCtrl->InsertColumn(i,medicField[i],LVCFMT_LEFT,70);
}
theListCtrl->InsertColumn(8,medicField[8],LVCFMT_LEFT,58);
return 0;
}
用户信息视图类CUserTreeView
以CTreeView 类为基类,创建新的树形视图类CUserTreeview ,以树的形式显示用户类别及各类别下注册的用户。在CUserTreeView 类的PreCreateWindows 函数中,设置树形控件的属性,主要代码如下:
BOOL CUserTreeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT; return CTreeView::PreCreateWindow(cs);
}
在CUserTreeView 类的OnInitialUpdate 函数中,设置医生,售药员,和管理员三个树的根目录,并读取数据库中用户表中的数据,将相应类别的用户代码添加的树到子目录中。
void CUserTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
m_theTreeCtrl=&GetTreeCtrl();
m_theImageList.Create(IDB_TREE_BITMAP,16,1,RGB(0,255,0));
m_theTreeCtrl->SetImageList(&m_theImageList,TVSIL_NORMAL); CString userTreeHeader[3]={"医生"," 售药员"," 管理员"};
HTREEITEM userItem[3];
for(int i=0;i
{
userItem[i]=m_theTreeCtrl->InsertItem(userTreeHeader[i],0,0,TVI_ROOT); m_theTreeCtrl->SetItemData(userItem[i],(DWORD)i);
}
CMedicAdminDoc* pDoc=(CMedicAdminDoc*)GetDocument();
CUserSet* userSet=&pDoc->theUserSet;
if(userSet->IsOpen())
{
userSet->Close();
}
userSet->Open();
CLogInDlg logInDlg;
logInDlg.DoModal();
CUser* theUser=&pDoc->theUser;
HTREEITEM thePoint;
for(i=0;i
{
userSet->m_strFilter="UserClassification='"+userTreeHeader[i]+"'"; userSet->Requery();
for(int j=0;;j++)
{
if(userSet->IsEOF())
{
break;
}
if(userSet->m_UserAccount==theUser->GetAccount())
{
HTREEITEM
userSpecifics=m_theTreeCtrl->InsertItem(userSet->m_UserAccount+"(当前用户)",2,2,userItem[i]);
m_theTreeCtrl->SetItemData(userSpecifics,(DWORD)j); thePoint=userSpecifics;
}
else
{
HTREEITEM
userSpecifics=m_theTreeCtrl->InsertItem(userSet->m_UserAccount,3,3,userItem[i]); m_theTreeCtrl->SetItemData(userSpecifics,(DWORD)j); }
userSet->MoveNext();
}
}
m_theTreeCtrl->Select(thePoint,TVGN_CARET);
}
实现视图窗口的分隔
窗口分隔采用静态分隔的方式。在主框架类CMainFrame 的OnCreateClient 函数中,通过CSplitterWnd 类将客户窗口分隔为左右两部分,并分别对应前面创建的两个视图类,主要代码如下:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
m_wndSplitter.CreateStatic(this,1,2);//分割窗口为两列
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CUserTreeView),CSize(130,600),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMedicListView),CSize(700,600),pContext);
return TRUE;
//return CFrameWnd::OnCreateClient(lpcs, pContext);
}
其中,m_wndSplitter在头文件中定义的CSplitterWnd 类对象如下
Protected :
CSplitterWnd m_wndSplitter;
3.7 登录模块设计
当程序启动时,在主界面窗口出现之前,首先弹出登录对口框,如下图,用户需要输入账号,密码等信息,只有通过验证的用户才能进入系统,否则系统自动退出。登录对口框对应的对话框类为ClogInDlg ,在CUserTreeView 类的OnInitialUpdate 函数中创建和调用,登录对话框确定按钮响应函数OnOK 的实现代码如下:
void CLogInDlg::OnOK()
{
// TODO: Add extra validation here
CMedicAdminDoc*
pDoc=(CMedicAdminDoc*)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();
UpdateData(TRUE);
pDoc->theUser.SetAllMember(m_userAccount,m_userPassword,m_userType,"");
CUserSet* theUserSet=&pDoc->theUserSet;
BOOL flag=pDoc->theUser.LogIn(theUserSet);
if(flag)
{
CDialog::OnOK();
}
else
{
AfxMessageBox("您无权进入该系统");
ExitProcess(1);
//CDialog::OnOK();
}
}
上述函数中的这行代码BOOL flag=pDoc->theUser.LogIn(theUserSet); 使用了CUser 类的LogIn 函数对用户的登录信息进行验证,实现代码如下:
BOOL CUser::LogIn(CUserSet* theSet)
{
theSet->m_strFilter="UserAccount='"+m_userAccount+"' and UserPassword='" +m_userPassword+"' and UserClassification='"+m_userType+"'"; theSet->Requery();
if(theSet->GetRecordCount())
{
return TRUE;
}
return FALSE;
}