C++语言课程设计--MFC设计--图书管理系统.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC+语言课程设计-MFC设计-图书管理系统天津理工大学聋人工学院天津理工大学 聋人工学院C+语言课程设计专 业: 网络工程 年 级: 2015级一班 姓 名: 胡志冲 学 号: 成 绩: 完成日期: 20161220 -目 录第一章 简 介11.1 设计题目11.2 指导教师1第二章 图书管理系统设计意义22.1 设计内容概述22.2需求分析22.3 设计意义2第三章 总体设计33.1 系统运行环境33.2 系统结构图33.3 系统各模块的功能43.4 对象数据结构7第四章 详细设计84.1程序源代码84.1.1登陆模块84.1.2注册模块114.1.3主菜单模块134.1.4编辑模块174.1.5查询模块274.1.6浏览模块344.1.7设置模块394.1.8组合框模块414.1.9图书信息模块434.1.10 资源文件454.2系统测试554.2.1登陆对话框554.2.2编辑对话框584.2.3浏览对话框624.2.4查询对话框664.2.5设置对话框714.2.6退出734.2.7测试结束运行734.3问题分析73第五章 结 论80参考文献81第一章简 介1.1 设计题目图书管理系统1.2 指导教师第二章 图书管理系统设计意义2.1 设计内容概述本课程设计图书管理系统,必修要满足使用方便、操作灵活和数据安全等设计需求。本系统在设计时应满足以下几个目标:1采用人机对话的操作方式,界面设计美观友好,操作灵活、方便、快捷、准确数据保存安全可靠。2实现对图书信息的管理功能。3系统运行稳定、安全可靠。2.2需求分析信息技术的飞速发展给图书企业的管理带来了全新的变革.采用图书管理系统对图书企业的经营运作进行全程管理.不仅可以使企业摆脱以往人工管理产生的一系列问题,而且可以提高管理效率、降低管理成本、增加经济效益。通过管理系统对图书企业的发展进行规划,可以收集大量关键可靠的数据。企业决策层分析这些数据,做出合理决策,及时调整,使之能够更好地遵循市场的销售规律,适应市场的变化,从而让企业能够在激烈的行业竞争中占据一席之地。2.3 设计意义1有助于加深我们对C+程序设计这门课程的理解,我们在课堂上学的都是基础理论知识,对于如何用程序语言来描述所学知识还是有一定难度。通过课程设计,我们可以真正理解其内涵。 2有利于我们逻辑思维的锻炼,程序设计能直接有效地训练学生的创新思维、培养分析问题、解决问题能力。即使是一个简单的程序,依然需要学生有条不理的构思。 3有利于培养严谨认真的学习态度,在程序设计过程里,当我们输入程序代码的时候,如果不够认真或细心,那么可能就导致语法错误,从而无法得出运行结果。那么,这个我们反复调试,反复修改的过程,其实也是对我们认真严谨治学的一个锻炼。第三章 总体设计3.1 系统运行环境1.硬件环境PC机2.软件环境 操作系统:Windows 10 开发工具:Visual studio 20103.2 系统结构图图书管理系统结构图如图3.1所以。该系统包括:添加、修改、删除、查询、浏览等。 图 3.1 系统的功能模块图3.3 系统各模块的功能表3.2 主要类介绍类名派生自说明CtianjinAppCWinApp为初始化应用程序 Window应用程序基类的派生类LoginCDialog用户登录对话框RegisterCDialog注册对话框CtianjinDlgCDialog主程序界面对话框staCStatic由于直接用CStatic创建的静态文本控件的样式是默认,但不是理想的效果,故再次继承CStatic,可以重新改变样式。buttonCButton由于直接用CButton创建的按钮控件的样式是默认,但不是理想的效果,故再次继承CButton,可以重新改变样式。ExploreCDialog浏览对话框ComboxCComboBox由于直接用CComboBox创建的组合框控件的样式是默认,但不是理想的效果,故再次继承CComboBox,可以重新改变样式。enteringCDialog编辑对话框EditPriceCEdit由于直接用CEdit创建的编辑框的功能还不够,所以再次继承CEdit,可以多加功能-限制输入字符queryCDialog查询对话框SettingCDialog设置对话框AboutCDialog关于对话框表3.3 主要函数介绍源文件函数名称功能描述Explore.cppOnInitDialogOpenFileOnClickedButton1OnClickedButton2ExchangeBook对对话框进行初始化处理打开文件函数响应“升序”按钮实现排序该图书信息响应“升序”按钮实现排序该图书信息交换各对象的数据表3.4 主要函数介绍源文件函数名称功能描述CtianjinDlg.cppOnInitDialogOnPaintOnQueryDragIconOnTimerUpdateFileOnExitOnEnterOnAboutOnQueryOnSettingOnExplore对对话框进行初始化处理对对话框绘制部分应用窗口系统获取鼠标图标用于实现定时控制功能用于实现更新文件来计算收了几本书响应“退出”按钮实现退出本程序响应“编辑”按钮实现启动编辑对话框响应“关于”按钮实现启动关于对话框响应“查询”按钮实现启动查询对话框响应“设置”按钮实现启动设置对话框响应“浏览”按钮实现启动浏览对话框表3.5 主要函数介绍源文件函数名称功能描述Entering.cppOnInitDialogOnCtlColor OnBnClickedOkCheckInputOnCloseOnLvnItemchangedList1OnBnClickedOk2OnBnClickedOk3OnLvnColumnclickList1OnNMClickList1OnBnClickedButton1对对话框进行初始化处理控件窗口函数 用于画出控件菜单处理添加记录信息检查输入的内容是否为空输入记录信息关闭该对话框某个项已经发生变化响应“删除”按钮实现删除该图书信息响应“修改”按钮实现修改该图书信息单击列,用于勾选全部当鼠标单击列表视图控件时产生响应“清空”按钮实现修改该图书信息表3.6 主要函数介绍源文件函数名称功能描述query.cppOnInitDialogOnBnClickedRadio1OnBnClickedRadio2OnBnClickedRadio3OnBnClickedRadio4OnBnClickedRadio5OnBnClickedButton1QueryNumQueryNameQueryAuthorQueryPressQueryAnyOpenFileTipinsertOnBnClickedButton2对对话框进行初始化处理响应“书号”按钮实现选择该方式查询响应“书名”按钮实现选择该方式查询响应“作者”按钮实现选择该方式查询响应“出版社”按钮实现选择该方式查询响应“任何内容”按钮实现选择该方式查询关闭该对话框查询书号函数查询书名函数查询作者函数查询出版社函数查询任何函数打开文件提示用于告诉用户找到了多少本将已找到的几本书插入在显示上响应“查询”按钮实现根据该方式查询3.4 对象数据结构 每个对象记录着每本书的信息,为了保护数据安全,故把其的这些成员变量声明为private,就是说在类外的话,不能直接调用对象的成员变量名来赋值或者获取其值,这就达到了保护数据,但是在某个时候遇到数据不对可能需要修改,这时就要加成员函数来修改或者获取,而且把成员函数声明为public,由于在类外需要正常调用,故声明为公开。其表如下。 表3.7 主要变量介绍变量名类型功能描述NameNumAuthorPressTimePriceCharCharCharCharCharDouble书名书号作者出版社时间价格表3.8 主要函数介绍源文件函数名称功能描述book.cppSetNameSetNumSetAuthorSetPressSetTimeSetPriceGetNameGetNumGetAuthorGetPressGetTimeGetPrice设置当前对象的成员变量name的值设置当前对象的成员变量num的值设置当前对象的成员变量Author的值设置当前对象的成员变量Press的值设置当前对象的成员变量Time的值设置当前对象的成员变量Price的值获取当前对象的成员变量name的值获取当前对象的成员变量Num的值获取当前对象的成员变量Author的值获取当前对象的成员变量Press的值获取当前对象的成员变量Time的值获取当前对象的成员变量Price的值第四章 详细设计4.1程序源代码4.1.1登陆模块Login.h#pragma once#include"tianjinDlg.h"#include "afxwin.h"/ Login 对话框class Login : public CDialogDECLARE_DYNAMIC(Login)int a;public:Login(CWnd* pParent = NULL); / 标准构造函数virtual Login();/ 对话框数据enum IDD = IDD_LOGIN ;protected:virtual void DoDataExchange(CDataExchange* pDX);CtianjinDlg dlg;DECLARE_MESSAGE_MAP()public:virtual BOOL OnInitDialog();afx_msg void OnClose();CString user;CString password;afx_msg void OnBnClickedOk();CButton regis;afx_msg void OnBnClickedButton1();Login.cpp#include "stdafx.h"#include "tianjin.h"#include "Login.h"#include "afxdialogex.h"#include "Register.h"IMPLEMENT_DYNAMIC(Login, CDialog)Login:Login(CWnd* pParent /*=NULL*/): CDialog(Login:IDD, pParent), user(_T(""), password(_T("")Login:Login()void Login:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT3, user);DDX_Text(pDX, IDC_EDIT4, password);DDX_Control(pDX, IDC_BUTTON1, regis);BEGIN_MESSAGE_MAP(Login, CDialog)ON_WM_CLOSE()ON_BN_CLICKED(IDOK, &Login:OnBnClickedOk)ON_BN_CLICKED(IDC_BUTTON1, &Login:OnBnClickedButton1)END_MESSAGE_MAP()BOOL Login:OnInitDialog()CDialog:OnInitDialog();a=0;/初始化a的值为0 用于判断该值是否退出本程序 当输入密码错误,就使该a的值增加1CRect r;/矩形的类,数据成员是 矩形左上角的x的坐标,矩形左上角Y的坐标,矩形右下角x的坐标,矩形右下角Y的坐标CString user;this->GetClientRect(&r);/是获得窗口的当前的客户区,把各坐标值保存在r对象。this->MoveWindow(600,300,r.right,r.bottom);/根据上面获得窗口的大小,来调整并且移动。GetPrivateProfileString("login","user","NULL",user.GetBuffer(20),20,"./setting.ini");/从setting.ini配置文件中的login节名中获取该user键名的值并保存在user的值,如果找不到该键名,则保存第三个参/数的值 即默认的值 表示未注册的账号,反之 找到了该值,表示已经注册了if(user!="NULL")/用于判断上面获得的值是否已经注册过 如注册过,则执行if()后边的语句regis.EnableWindow(0);/在该函数的参数赋值为0 表示禁止指定的控件接受鼠标和键盘的输入 由于该已经注册过的。regis.SetWindowTextA("已注册");/指定该控件的内容设为 ”已注册"用于提示return TRUE;void Login:OnClose()CDialog:OnClose();void Login:OnBnClickedOk()this->UpdateData(1);/将各控件中的数据保存到相应的变量分别为”user“ ” password“if(!user.IsEmpty()&&!password.IsEmpty()/检查该各变量的值是否为空,如该值为空,就执行else后边的语句CString user1,password1;/定义两个字符串类变量 用于从配置文件的注册过的用户及密码的值保存在该变量的GetPrivateProfileString("login","user","NULL",user1.GetBuffer(20),20,"./setting.ini");/从本身程序的当前的setting.ini配置/文件中的login节名中获取该user键名的值并保存在user1的值,如果找不到该键名,则保存默认值为”NULL“GetPrivateProfileString("login","password","NULL",password1.GetBuffer(20),20,"./setting.ini");/如同上面的方法if(user=user1&&password=password1)/对比各值是否一致,满足此条件表示该用户名及密码都是正确,可以登陆,即执行if()后边的语句this->ShowWindow(SW_HIDE);/把该对话框的显示方式为隐藏dlg.DoModal();/启动主窗口的对话框CDialog:OnOK();elsea+;/密码错误次数if(a>3)/如超过3次的错误密码就执行if()后边的语句CDialog:OnCancel();return;/调用关闭该对话框的函数 CString d;d.Format("用户名或者密码错误%d次 超过三次错误即将自动退出",a);MessageBox(d,"登陆提示",MB_OK|MB_ICONWARNING);/用于提示密码错误 以避免令人觉得这程序有问题else MessageBox("用户名或者密码的字符串为空","登陆提示",MB_OK|MB_ICONWARNING);/当该值为空,则执行该语句 用于提示。void Login:OnBnClickedButton1()Register dialog;/定义注册对话框的对象变量dialog.DoModal();/启动 注册对话框;4.1.2注册模块Register.h#pragma once#include "afxwin.h"/ Register 对话框class Register : public CDialogDECLARE_DYNAMIC(Register)public:Register(CWnd* pParent = NULL); / 标准构造函数virtual Register();/ 对话框数据enum IDD = IDD_REGISTER ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持DECLARE_MESSAGE_MAP()public:afx_msg void OnBnClickedOk();CString user;CString password;CString password1;Register.cpp#include "stdafx.h"#include "tianjin.h"#include "Register.h"#include "afxdialogex.h"/ Register 对话框IMPLEMENT_DYNAMIC(Register, CDialog)Register:Register(CWnd* pParent /*=NULL*/): CDialog(Register:IDD, pParent), user(_T(""), password(_T(""), password1(_T("")Register:Register()void Register:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, user);DDX_Text(pDX, IDC_EDIT6, password);DDX_Text(pDX, IDC_EDIT3, password1);BEGIN_MESSAGE_MAP(Register, CDialog)ON_BN_CLICKED(IDOK, &Register:OnBnClickedOk)END_MESSAGE_MAP()void Register:OnBnClickedOk()this->UpdateData();/默认值是TRUE,即从控件传给变量if(!user.IsEmpty()&&!password.IsEmpty()&&!password1.IsEmpty()/各变量的字符串是否为空,如都不为空,则执行if()后边的语句继续注册if(password=password1)/新密码与第二次新密码对比下,如相等,则继续执行注册,反之不继续注册if(IDOK=MessageBox("确定要注册该账号吗?","注册提示",MB_OKCANCEL| MB_ICONQUESTION )/输出提示 是否要确定注册,如点击确认返回值为IDOKWritePrivateProfileString("login","user",user,"./setting.ini");/向该setting.ini配置文件中的login节名中设置该user键名的值为user的值WritePrivateProfileString("login","password",password,"./setting.ini");HWND button; /定义窗口句柄this->GetParent()->GetDlgItem(IDC_BUTTON1,&button);/获取当前窗口的父窗口句柄(登陆对话框),然后通过父窗口句柄获取指定参数ID为IDC_BUTTON1的子元素的句柄并绑定button窗口句柄:SetWindowTextA(button,"已注册");/改变指定button窗口句柄的文本内容为"已注册"。:EnableWindow(button,0);/第二个参数的值为0表示禁止指定的控件接受鼠标和键盘的输入MessageBox("已经成功注册该账号:"+user+"!","注册提示",MB_OK| MB_ICONASTERISK );/注册成功输出提示 CDialog:OnCancel(); else MessageBox("新密码与第二次新密码不一致 请注意输入正确!","密码提示",MB_OK|MB_ICONEXCLAMATION );else MessageBox("用户名或者密码的字符串为空","注册提示",MB_OK|MB_ICONWARNING);4.1.3主菜单模块tianjinDlg.h#pragma once#include "button.h"#include "sta.h"#include"entering.h"#include"query.h"#include"Setting.h"#include"Explore.h"/ CtianjinDlg 对话框class CtianjinDlg : public CDialogEx/ 构造public:CtianjinDlg(CWnd* pParent = NULL);/ 标准构造函数/ 对话框数据enum IDD = IDD_TIANJIN_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX);/ 实现protected:HICON m_hIcon;CToolBar toolbar;CStatusBar statusbar;CImageList toolimag;CImageList toolhotimag;button but2;int a;int b;virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:afx_msg void OnTimer(UINT_PTR nIDEvent);button but1;void UpdateFile();sta stat,stat1;afx_msg void OnExit();afx_msg void OnEnter();afx_msg void OnAbout();protected:public:afx_msg void OnQuery();afx_msg void OnSetting();afx_msg void OnExplore();tianjinDlg.cpp#include "stdafx.h"#include "tianjin.h"#include "tianjinDlg.h"#include "afxdialogex.h"#include"About.h"#ifdef _DEBUG#define new DEBUG_NEW#endifCtianjinDlg:CtianjinDlg(CWnd* pParent /*=NULL*/): CDialogEx(CtianjinDlg:IDD, pParent)m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);void CtianjinDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);DDX_Control(pDX, IDOK, but1);DDX_Control(pDX, TIC, stat);BEGIN_MESSAGE_MAP(CtianjinDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()ON_COMMAND(1006, &CtianjinDlg:OnExit)ON_COMMAND(1001, &CtianjinDlg:OnEnter)ON_COMMAND(1003, &CtianjinDlg:OnQuery)ON_COMMAND(1004, &CtianjinDlg:OnSetting)ON_COMMAND(1005, &CtianjinDlg:OnAbout)ON_COMMAND(1002, &CtianjinDlg:OnExplore)END_MESSAGE_MAP()BOOL CtianjinDlg:OnInitDialog()CDialogEx:OnInitDialog();CBitmap bit7;bit0.LoadBitmapA(IDB_BITMAP1);bit1.LoadBitmapA(IDB_BITMAP2);bit2.LoadBitmapA(IDB_BITMAP3);bit3.LoadBitmapA(IDB_BITMAP4);bit4.LoadBitmapA(IDB_BITMAP5);bit5.LoadBitmapA(IDB_BITMAP6);bit6.LoadBitmapA(IDB_BITMAP8);toolimag.Create(70,50,ILC_COLOR|ILC_MASK,0,0);for(int i=0;i<6;i+)toolimag.Add(&biti,ILC_MASK);toolhotimag.Create(58,60,ILC_COLOR|ILC_MASK,0,0);toolhotimag.Add(&bit6,ILC_COLOR16);toolbar.Create(this);UINT buttons6=1001,1002,1003,1004,1005,1006;toolbar.SetButtons(buttons,6);char buttontext7="编辑","浏览","查询","设置","关于","退出"for(int i=0;i<6;i+)toolbar.SetButtonText(i,buttontexti);toolbar.GetToolBarCtrl().SetImageList(&toolimag);toolbar.GetToolBarCtrl().SetHotImageList(&toolhotimag);toolbar.SetSizes(CSize(80,80),CSize(70,50);toolbar.GetToolBarCtrl().SetStyle(CCS_TOP|TBSTYLE_FLAT);statusbar.Create(this);UINT pens3=100,101,102;statusbar.SetIndicators(pens,3);statusbar.SetPaneText(0,"作者:胡志冲");UpdateFile();statusbar.SetPaneText(2,CTime:GetCurrentTime().Format("%Y:%m:%d:%H:%M:%S");for(int i=0;i<3;i+)statusbar.SetPaneInfo(i,pensi,SBPS_POPOUT,180);a=10;b=0;SetTimer(0,500,NULL);this->RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);return TRUE; / 除非将焦点设置到控件,否则返回 TRUEvoid CtianjinDlg:OnPaint()if (IsIconic()elseCRect dialogrect;this->GetClientRect(dialogrect);CDC pic;CBitmap pic1;BITMAP info;pic1.LoadBitmapA(IDB_BITMAP7);pic1.GetBitmap(&info);CPaintDC dc(this);pic.CreateCompatibleDC(&dc);pic.SelectObject(&pic1);dc.StretchBlt(0,0,dialogrect.right,dialogrect.bottom,&pic,0,0,info.bmWidth,info.bmHeight,SRCCOPY);CDialogEx:OnPaint();HCURSOR CtianjinDlg:OnQueryDragIcon()return static_cast<HCURSOR>(m_hIcon);void CtianjinDlg:OnTimer(UINT_PTR nIDEvent)CRect dialogrect;this->GetClientRect(dialogrect);statusbar.SetPaneText(2,CTime:GetCurrentTime().Format("%Y:%m:%d:%H:%M:%S");stat.MoveWindow(a,dialogrect.bottom-402,260,50);if(a>=dialogrect.right-270)b=1;else if(a<=50)b=0;if(b=0)a+=20;elsea-=20;CDialogEx:OnTimer(nIDEvent);void CtianjinDlg:OnExit()CDialogEx:OnCancel();void CtianjinDlg:OnEnter()entering enter;enter.DoModal();UpdateFile();void CtianjinDlg:UpdateFile()CFile file("data.txt",CFile:modeRead|CFile:modeNoTruncate|CFile:modeCreate);CString stat;stat.Format("已经收录%d本的书",file.GetLength()/95);file.Close();statusbar.SetPaneText(1, stat);void CtianjinDlg:OnQuery()query quer;quer.DoModal();void CtianjinDlg:OnSetting()Setting set;set.DoModal();void CtianjinDlg:OnExplore()Explore explore;explore.DoModal();void CtianjinDlg:OnAbout()About aboutdlg;aboutdlg.DoModal();4.1.4编辑模块Entering.h#pragma once#include "afxcmn.h"#include "afxwin.h"#include "editprice.h"/ entering 对话框class entering : public CDialogDECLARE_DYNAMIC(entering)public:entering(CWnd* pParent = NULL); / 标准构造函数virtual entering();/ 对话框数据enum IDD =