www.pudn.com > PBMS.rar > PBMSView.cpp


//==================================================================// 
//						此项目飞狼工作室制作 
//项 目 名:	PBMS 
//项目描述:	这是为了方便图书管理的软件。    功能特点:多用户、信息保密、还书提醒、资料保存。 
//作   者:	龚勋 
//日  期:  2003-11-14 
//==================================================================// 
// PBMSView.cpp : implementation of the CPBMSView class 
// 
 
#include "stdafx.h" 
#include "PBMS.h" 
 
#include "PBMSDoc.h" 
#include "PBMSView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSView 
 
IMPLEMENT_DYNCREATE(CPBMSView, CListView) 
 
BEGIN_MESSAGE_MAP(CPBMSView, CListView) 
	//{{AFX_MSG_MAP(CPBMSView) 
	ON_MESSAGE(WM_SHOWRIGHTBAR, OnShowRightBar) 
	ON_WM_PAINT() 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CListView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CListView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSView construction/destruction 
 
CPBMSView::CPBMSView() 
{ 
	// TODO: add construction code here 
	//初始指向空 
	m_RightDlg = NULL; 
	m_curRightBarType = 0; 
} 
 
CPBMSView::~CPBMSView() 
{ 
	//释放资源 
	if (m_RightDlg != NULL) 
	{ 
		m_RightDlg->DestroyWindow();//关闭窗口 
		delete m_RightDlg;			//释放动态内存 
	} 
} 
 
BOOL CPBMSView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
	return CListView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSView drawing 
 
void CPBMSView::OnDraw(CDC* pDC) 
{ 
	CPBMSDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	CListCtrl& refCtrl = GetListCtrl(); 
	refCtrl.InsertItem(0, "Item!"); 
	// TODO: add draw code for native data here 
} 
 
void CPBMSView::OnInitialUpdate() 
{ 
	CListView::OnInitialUpdate(); 
	// TODO: You may populate your ListView with items by directly accessing 
	//  its list control through a call to GetListCtrl(). 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSView printing 
 
BOOL CPBMSView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CPBMSView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CPBMSView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSView diagnostics 
 
#ifdef _DEBUG 
void CPBMSView::AssertValid() const 
{ 
	CListView::AssertValid(); 
} 
 
void CPBMSView::Dump(CDumpContext& dc) const 
{ 
	CListView::Dump(dc); 
} 
 
CPBMSDoc* CPBMSView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPBMSDoc))); 
	return (CPBMSDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSView message handlers 
void CPBMSView::OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct) 
{ 
	//TODO: add code to react to the user changing the view style of your window 
} 
 
/*=========================OnShowRightBar============================================ 
说明: 
	消息处理函数,处理WM_SHOWRIGHTBAR消息,消息主要来自Doc 
参数: 
	index = (int)wParam; 
	index = 1:显示用户信息面板 
	index = 2:显示所借书籍面板 
	index = 3:显示已还书籍面板 
	index = 4:显示图书馆信息面板 
	index = 5:显示系统信息及设置面板 
// 
	modal = (int)lParam; 
	modal = 0:正常显示,可写 
	modal = 1:不可以模式显示 
====================================================================================*/ 
void CPBMSView::OnShowRightBar(WPARAM wParam,LPARAM lParam) 
{ 
	int index = (int)wParam; 
	int modal = (int)lParam; 
	CUserDlg	*pUserDlg; 
	CBorrowDlg	*pBorrowDlg; 
	CReturnDlg	*pReturnDlg; 
	switch(index) 
	{ 
		case 1: 
			{ 
				if (m_curRightBarType != 1)//当前不是显示用户信息窗口,这样做是为了用户切换时避免闪烁 
				{ 
					m_curRightBarType = 1; 
					//释放资源 
					if (m_RightDlg != NULL) 
					{ 
						m_RightDlg->DestroyWindow();//关闭窗口 
						delete m_RightDlg;			//释放动态内存 
					}					 
					CRuntimeClass *pUser = RUNTIME_CLASS(CUserDlg); 
					//新建面板对象 
					m_RightDlg = (CUserDlg *)pUser->CreateObject(); 
					//数据:Doc-->用户面板类对象 
					DataExchange(1,false); 
					//创建面板窗口 
					m_RightDlg->Create(IDD_USER,this); 
					pUserDlg = (CUserDlg *)m_RightDlg; 
					//安全机制 
					if (modal == 0) 
					{ 
						pUserDlg->MyEnableCtrl(TRUE); 
					} 
					else 
					{ 
						pUserDlg->MyEnableCtrl(FALSE);	 
					} 
				}//end-if 
				else 
				{ 
					//数据:Doc-->用户面板类对象 
					DataExchange(1,false); 
					pUserDlg = (CUserDlg *)m_RightDlg; 
					//用户间切换 
					pUserDlg->ChangeCurUser(); 
					//安全机制 
					if (modal == 0) 
					{ 
						pUserDlg->MyEnableCtrl(TRUE); 
					} 
					else 
					{ 
						pUserDlg->MyEnableCtrl(FALSE);	 
					} 
				} 
				break; 
			} 
		case 2: 
			{ 
				m_curRightBarType = 2; 
				//释放资源 
				if (m_RightDlg != NULL) 
				{ 
					m_RightDlg->DestroyWindow();//关闭窗口 
					delete m_RightDlg;			//释放动态内存 
				}					 
				CRuntimeClass *pBorrow = RUNTIME_CLASS(CBorrowDlg); 
				m_RightDlg = (CBorrowDlg *)pBorrow->CreateObject(); 
				//数据:Doc-->用户面板类对象 
				DataExchange(2,false); 
				//创建面板窗口 
				m_RightDlg->Create(IDD_BOOK_BORROW,this); 
				//安全机制 
				pBorrowDlg = (CBorrowDlg *)m_RightDlg; 
				if (modal == 0) 
				{ 
					pBorrowDlg->MyEnableCtrl(TRUE); 
				} 
				else 
				{ 
					pBorrowDlg->MyEnableCtrl(FALSE);	 
				} 
				break; 
			} 
		case 3: 
			{ 
				m_curRightBarType = 3; 
				//释放资源 
				if (m_RightDlg != NULL) 
				{ 
					m_RightDlg->DestroyWindow();//关闭窗口 
					delete m_RightDlg;			//释放动态内存 
				}					 
				CRuntimeClass *pReturn = RUNTIME_CLASS(CReturnDlg); 
				m_RightDlg = (CReturnDlg *)pReturn->CreateObject(); 
				//数据:Doc-->用户面板类对象 
				DataExchange(3,false); 
				//创建面板窗口 
				m_RightDlg->Create(IDD_BOOK_RETURN,this); 
				//安全机制 
				pReturnDlg = (CReturnDlg *)m_RightDlg; 
				if (modal == 0) 
				{ 
					pReturnDlg->MyEnableCtrl(TRUE); 
				} 
				else 
				{ 
					pReturnDlg->MyEnableCtrl(FALSE);	 
				} 
				break; 
			} 
		case 4: 
			{ 
				m_curRightBarType = 4; 
				//释放资源 
				if (m_RightDlg != NULL) 
				{ 
					m_RightDlg->DestroyWindow();//关闭窗口 
					delete m_RightDlg;			//释放动态内存 
				}						 
				CRuntimeClass *pLib = RUNTIME_CLASS(CLibDlg); 
				m_RightDlg = (CLibDlg *)pLib->CreateObject(); 
				//数据:Doc-->用户面板类对象 
				DataExchange(4,false); 
				m_RightDlg->Create(IDD_LIB_INFO,this); 
				break; 
			} 
		case 5: 
			{ 
				if (m_curRightBarType != 5) 
				{ 
					m_curRightBarType = 5;					 
					//释放资源 
					if (m_RightDlg != NULL) 
					{ 
						m_RightDlg->DestroyWindow();//关闭窗口 
						delete m_RightDlg;			//释放动态内存 
					}								 
					CRuntimeClass *pSys = RUNTIME_CLASS(CSysDlg); 
					m_RightDlg = (CSysDlg *)pSys->CreateObject(); 
					m_RightDlg->Create(IDD_SYS_SET,this); 
				} 
				break; 
			} 
		default: 
			{ 
				AfxMessageBox("1-未明消息"); 
				break; 
			} 
	}//end-switch 
} 
 
/*=========================DataExchange=============================================== 
说明: 
	实现数据从Doc到右面板对话框之间的流动,这里只是一个中转站。 
	本函数可以被子窗口调用,实现数据保存。 
参数: 
	whichBar = 1:	用户信息面板 
			   2:	借书面板 
			   3:	还书面板	 
			   4:	图书馆面板 
	save	 = true 保存到数据库 
			 = false从库中读取数据 
====================================================================================*/ 
void CPBMSView::DataExchange(int whichBar,bool save) 
{ 
	//测试 
	int			i; 
	BOOKINFO	bookinfo; 
	//获取文档对象 
	CPBMSDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	//各个面板指针,用来保存强行类型转化后的对象指针 
	CUserDlg	*pUserDlg; 
	CBorrowDlg	*pBorrowDlg; 
	CReturnDlg  *pReturnDlg; 
	CLibDlg		*pLibDlg; 
	// 
	CString	szSQL;	//用来构造查询语句 
	//*==============Doc与用户面板数据交换==============*// 
	switch(whichBar) 
	{ 
	case 1:	//用户信息 
		 { 
			pUserDlg = (CUserDlg *)m_RightDlg; 
			if(save)	//保存 
			{ 
				//将用户修改后的数据赋值给Doc变量,以便进行数据库保存 
				pDoc->m_curUserInfo = pUserDlg->m_UserInfo;	 
				//构造查询语句 
				szSQL.Format("select * from users \ 
						      where ID = %d", 
							  pDoc->m_curUserInfo.Id); 
				//调用Doc函数保存数据库 
				pDoc->MyUpdateData(szSQL,1); 
			} 
			else		//读取 
			{ 
				//注意:下面语句是结构体之间的数据交换,这种直接 
				//相互赋值的方法只能在VC环境下使用 
				//用户信息,用户信息是两个Tab页共用的,故 
				//存放在UserDlg对象内部 
				pUserDlg->m_UserInfo = pDoc->m_curUserInfo;				 
				//***下面数据是初始化列表而非用户数据***// 
				//文化程度列表 
				pUserDlg->m_UserInfoDlg.m_saKnowLevel.Copy(pDoc->m_saKnowLevel); 
				pUserDlg->m_UserInfoDlg.m_uaKnowLevID.Copy(pDoc->m_uaKnowLevID); 
				//证件名称列表 
				pUserDlg->m_UserInfoDlg.m_saIdentity.Copy(pDoc->m_saIdentity); 
				pUserDlg->m_UserInfoDlg.m_uaIdentyID.Copy(pDoc->m_uaIdentyID); 
				//***================================***//				 
			} 
			break; 
		 }//end-case1 
	case 2:	//所借书籍信息 
		 { 
			pBorrowDlg = (CBorrowDlg *)m_RightDlg; 
			if(save) 
			{ 
				pDoc->m_userBooks.Copy(pBorrowDlg->m_userBooks); 
				//构造查询语句 
				szSQL.Format("select * from books \ 
							  where UserID = %d \ 
							  and 已还 = false \ 
							  order by ID", 
							  pDoc->m_curUserInfo.Id ); 
				pDoc->MyUpdateData(szSQL,2); 
			} 
			else	//读取 
			{ 
				//面板信息与Doc信息交换 
				pBorrowDlg->m_userBooks.Copy(pDoc->m_userBooks); 
				pBorrowDlg->m_libsInfo.Copy(pDoc->m_libsInfo); 
				pBorrowDlg->m_curUserID = pDoc->m_curUserInfo.Id;//用户ID 
			} 
			break; 
		 }//end-case2 
	case 3:	//所还书籍信息 
		 { 
			pReturnDlg = (CReturnDlg *)m_RightDlg; 
			if(save) 
			{ 
				pDoc->m_userBooks.Copy(pReturnDlg->m_userBooks); 
				//构造查询语句 
				szSQL.Format("select * from books \ 
					          where UserID = %d \ 
							  and 已还 = true \ 
							  order by ID", 
							  pDoc->m_curUserInfo.Id ); 
				pDoc->MyUpdateData(szSQL,2);			 
			} 
			else	//读取 
			{ 
				//面板信息与Doc信息交换 
				pReturnDlg->m_userBooks.Copy(pDoc->m_userBooks); 
				for (i = 0; i < pReturnDlg->m_userBooks.GetSize(); i ++) 
				{ 
					bookinfo = pReturnDlg->m_userBooks.GetAt(i); 
				} 
			} 
			break; 
		 }//end-case3 
	case 4:	//图书馆信息 
		 { 
			pLibDlg = (CLibDlg *)m_RightDlg; 
			if(save)	//保存 
			{ 
				pDoc->m_curLibInfo = pLibDlg->m_curLibInfo; 
				//构造查询语句 
				szSQL.Format("select * from lib \ 
						      where ID = %d", 
							  pDoc->m_curLibInfo.id); 
				//调用Doc函数保存数据库 
				pDoc->MyUpdateData(szSQL,3); 
			} 
			else		//读取 
			{ 
				//将图书馆信息传给图书馆面板对象数据 
				pLibDlg->m_curLibInfo = pDoc->m_curLibInfo; 
			} 
			break; 
		 }//end-case4 
	default : 
		AfxMessageBox("15-数据交换出错!"); 
		return; 
	}//end-switch 
	//*=================================================*// 
} 
 
void CPBMSView::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	// TODO: Add your message handler code here 
	// Do not call CListView::OnPaint() for painting messages 
} 
 
/*=========================UserLogon================================================== 
说明: 
	用户登录时将用户ID保存到Doc中的m_LogonUserID变量中,被UserDlg对象 
	调用 
返回值说明: 
	0	:密码不对 
	1	:成功 
	2	:用户已经登录 
====================================================================================*/ 
int CPBMSView::UserLogon(CString szPass) 
{ 
	//获取文档对象 
	CPBMSDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	//查找该用户是否已经登录 
	for(int i = 0; i < pDoc->m_LogonUserID.GetSize(); i ++) 
	{ 
		if (pDoc->m_curUserInfo.Id == pDoc->m_LogonUserID.GetAt(i)) 
		{ 
			return 2; 
		} 
	} 
	// 
	if (pDoc->m_curUserInfo.pass == szPass) 
	{ 
		//将登录用户ID保存 
		pDoc->m_LogonUserID.Add(pDoc->m_curUserInfo.Id); 
		return 1; 
	} 
	return 0; 
}