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;
}