1、- .XX理工大学 聋人工学院?C+语言课程设计?专业:网络工程年级:2015级一班XX:志冲 学号:成绩:完成日期: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组合框
2、模块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、的管理功能。3系统运行稳定、平安可靠。2.2需求分析信息技术的飞速开展给图书企业的管理带来了全新的变革.采用图书管理系统对图书企业的经营运作进展全程管理.不仅可以使企业摆脱以往人工管理产生的一系列问题,而且可以提高管理效率、降低管理本钱、增加经济效益。通过管理系统对图书企业的开展进展规划,可以收集大量关键可靠的数据。企业决策层分析这些数据,做出合理决策,及时调整,使之能够更好地遵循市场的销售规律,适应市场的变化,从而让企业能够在剧烈的行业竞争中占据一席之地。2.3 设计意义1有助于加深我们对C+程序设计这门课程的理解,我们在课堂上学的都是根底理论知识,对于如何用程序语言来描述所学知识还是有一定
4、难度。通过课程设计,我们可以真正理解其涵。2有利于我们逻辑思维的锻炼,程序设计能直接有效地训练学生的创新思维、培养分析问题、解决问题能力。即使是一个简单的程序,依然需要学生有条不理的构思。3有利于培养严谨认真的学习态度,在程序设计过程里,当我们输入程序代码的时候,如果不够认真或细心,那么可能就导致语法错误,从而无法得出运行结果。那么,这个我们反复调试,反复修改的过程,其实也是对我们认真严谨治学的一个锻炼。第三章 总体设计3.1 系统运行环境1.硬件环境PC机2.软件环境操作系统:Windows 10 开发工具:Visual studio 20103.2 系统构造图图书管理系统构造图如图3.1所
5、以。该系统包括:添加、修改、删除、查询、浏览等。图 3.1 系统的功能模块图3.3系统各模块的功能表3.2 主要类介绍类名派生自说明CtianjinAppCWinApp为初始化应用程序Window应用程序基类的派生类LoginCDialog用户登录对话框RegisterCDialog注册对话框CtianjinDlgCDialog主程序界面对话框staCStatic由于直接用CStatic创立的静态文本控件的样式是默认,但不是理想的效果,故再次继承CStatic,可以重新改变样式。buttonCButton由于直接用CButton创立的按钮控件的样式是默认,但不是理想的效果,故再次继承CButt
6、on,可以重新改变样式。ExploreCDialog浏览对话框boxCboBox由于直接用CboBox创立的组合框控件的样式是默认,但不是理想的效果,故再次继承CboBox,可以重新改变样式。enteringCDialog编辑对话框EditPriceCEdit由于直接用CEdit创立的编辑框的功能还不够,所以再次继承CEdit,可以多加功能-限制输入字符queryCDialog查询对话框SettingCDialog设置对话框AboutCDialog关于对话框表3.3 主要函数介绍源文件函数名称功能描述Explore.cppOnInitDialogOpenFileOnClickedButton1
7、OnClickedButton2ExchangeBook对对话框进展初始化处理翻开文件函数响应“升序按钮实现排序该图书信息响应“升序按钮实现排序该图书信息交换各对象的数据表3.4 主要函数介绍源文件函数名称功能描述CtianjinDlg.cppOnInitDialogOnPaintOnQueryDragIconOnTimerUpdateFileOnExitOnEnterOnAboutOnQueryOnSettingOnExplore对对话框进展初始化处理对对话框绘制局部应用窗口系统获取鼠标图标用于实现定时控制功能用于实现更新文件来计算收了几本书响应“退出按钮实现退出本程序响应“编辑按钮实现启动
8、编辑对话框响应“关于按钮实现启动关于对话框响应“查询按钮实现启动查询对话框响应“设置按钮实现启动设置对话框响应“浏览按钮实现启动浏览对话框表3.5 主要函数介绍源文件函数名称功能描述Entering.cppOnInitDialogOnCtlColor OnBnClickedOkCheckInputOnCloseOnLvnItemchangedList1OnBnClickedOk2OnBnClickedOk3OnLvnColumnclickList1OnNMClickList1OnBnClickedButton1对对话框进展初始化处理控件窗口函数 用于画出控件菜单处理添加记录信息检查输入的容是否
9、为空输入记录信息关闭该对话框某个项已经发生变化响应“删除按钮实现删除该图书信息响应“修改按钮实现修改该图书信息单击列,用于勾选全部当鼠标单击列表视图控件时产生响应“清空按钮实现修改该图书信息表3.6 主要函数介绍源文件函数名称功能描述query.cppOnInitDialogOnBnClickedRadio1OnBnClickedRadio2OnBnClickedRadio3OnBnClickedRadio4OnBnClickedRadio5OnBnClickedButton1QueryNumQueryNameQueryAuthorQueryPressQueryAnyOpenFileTipin
10、sertOnBnClickedButton2对对话框进展初始化处理响应“书号按钮实现选择该方式查询响应“书名按钮实现选择该方式查询响应“作者按钮实现选择该方式查询响应“按钮实现选择该方式查询响应“任何容按钮实现选择该方式查询关闭该对话框查询书号函数查询书名函数查询作者函数查询函数查询任何函数翻开文件提示用于告诉用户找到了多少本将已找到的几本书插入在显示上响应“查询按钮实现根据该方式查询3.4 对象数据构造每个对象记录着每本书的信息,为了保护数据平安,故把其的这些成员变量声明为private,就是说在类外的话,不能直接调用对象的成员变量名来赋值或者获取其值,这就到达了保护数据,但是在某个时候遇到
11、数据不对可能需要修改,这时就要加成员函数来修改或者获取,而且把成员函数声明为public,由于在类外需要正常调用,故声明为公开。其表如下。 表3.7 主要变量介绍变量名类型功能描述NameNumAuthorPressTimePriceCharCharCharCharCharDouble书名书号作者时间价格表3.8 主要函数介绍源文件函数名称功能描述book.cppSetNameSetNumSetAuthorSetPressSetTimeSetPriceGetNameGetNumGetAuthorGetPressGetTimeGetPrice设置当前对象的成员变量name的值设置当前对象的成员变
12、量num的值设置当前对象的成员变量Author的值设置当前对象的成员变量Press的值设置当前对象的成员变量Time的值设置当前对象的成员变量Price的值获取当前对象的成员变量name的值获取当前对象的成员变量Num的值获取当前对象的成员变量Author的值获取当前对象的成员变量Press的值获取当前对象的成员变量Time的值获取当前对象的成员变量Price的值第四章 详细设计4.1程序源代码4.1.1登陆模块Login.h#pragma once#includetianjinDlg.h#include afxwin.h/ Login 对话框class Login : public CDia
13、logDECLARE_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 passwo
14、rd;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.hIMPLEMENT_DYNAMIC(Login, CDialog)Login:Login(CWnd* pParent /*=NULL*/): CDialog(Login:IDD, pParent), user(_T(), password
15、(_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_B
16、UTTON1, &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.
17、bottom);/根据上面获得窗口的大小,来调整并且移动。GetPrivateProfileString(login,user,NULL,user.GetBuffer(20),20,./setting.ini);/从setting.ini配置文件中的login节名中获取该user键名的值并保存在user的值,如果找不到该键名,那么保存第三个参/数的值 即默认的值 表示未注册的账号,反之 找到了该值,表示已经注册了if(user!=NULL)/用于判断上面获得的值是否已经注册过 如注册过,那么执行if后边的语句regis.EnableWindow(0);/在该函数的参数赋值为0 表示制止指定的控
18、件承受鼠标和键盘的输入 由于该已经注册过的。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;/定义两个字符串类变
19、量 用于从配置文件的注册过的用户及密码的值保存在该变量的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&passw
20、ord=password1)/比照各值是否一致,满足此条件表示该用户名及密码都是正确,可以登陆,即执行if后边的语句this-ShowWindow(SW_HIDE);/把该对话框的显示方式为隐藏dlg.DoModal();/启动主窗口的对话框CDialog:OnOK();elsea+;/密码错误次数if(a3)/如超过3次的错误密码就执行if后边的语句CDialog:OnCancel();return;/调用关闭该对话框的函数 CString d;d.Format(用户名或者密码错误%d次 超过三次错误即将自动退出,a);MessageBox(d,登陆提示,MB_OK|MB_ICONWARNI
21、NG);/用于提示密码错误 以防止令人觉得这程序有问题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(
22、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#incl
23、ude 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*
24、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(!
25、user.IsEmpty()&!password.IsEmpty()&!password1.IsEmpty()/各变量的字符串是否为空,如都不为空,那么执行if后边的语句继续注册if(password=password1)/新密码与第二次新密码比照下,如相等,那么继续执行注册,反之不继续注册if(IDOK=MessageBox(确定要注册该账号吗?,注册提示,MB_OKCANCEL| MB_ICONQUESTION )/输出提示 是否要确定注册,如点击确认返回值为IDOKWritePrivateProfileString(login,user,user,./setting.ini);/向该se
26、tting.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窗口句柄的文本容为已注册。:Enab
27、leWindow(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#
28、include button.h#include sta.h#includeentering.h#includequery.h#includeSetting.h#includeExplore.h/ CtianjinDlg 对话框class CtianjinDlg : public CDialogEx/ 构造public:CtianjinDlg(CWnd* pParent = NULL);/ 标准构造函数/ 对话框数据enum IDD = IDD_TIANJIN_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX);/
29、 实现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;voi
30、d 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#includeAbout.h#ifde
31、f _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, st
32、at);BEGIN_MESSAGE_MAP(CtianjinDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()ON_MAND(1006, &CtianjinDlg:OnExit)ON_MAND(1001, &CtianjinDlg:OnEnter)ON_MAND(1003, &CtianjinDlg:OnQuery)ON_MAND(1004, &CtianjinDlg:OnSetting)ON_MAND(1005, &CtianjinDlg:OnAbout)ON_MAND(1002, &CtianjinDlg:OnExp
33、lore)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)
34、;toolimag.Create(70,50,ILC_COLOR|ILC_MASK,0,0);for(int i=0;i6;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=编辑,浏览,查询,设
35、置,关于,退出;for(int i=0;i6;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=
36、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;iRepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);return TRUE; / 除非将焦点设置到控件,否那么返回 TRUEvoid CtianjinDlg:OnPaint(
37、)if (IsIconic()elseCRect dialogrect;this-GetClientRect(dialogrect);CDC pic;CBitmap pic1;BITMAP info;pic1.LoadBitmapA(IDB_BITMAP7);pic1.GetBitmap(&info);CPaintDC dc(this);pic.CreatepatibleDC(&dc);pic.SelectObject(&pic1);dc.StretchBlt(0,0,dialogrect.right,dialogrect.bottom,&pic,0,0,info.bmWidth,info.b
38、mHeight,SRCCOPY);CDialogEx:OnPaint();HCURSOR CtianjinDlg:OnQueryDragIcon()return static_cast(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.botto
39、m-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:mo
40、deNoTruncate|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();v
41、oid 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 = ID
42、D_ENTERING ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持DECLARE_MESSAGE_MAP()public:CListCtrl listctrl;/列表框控件对象virtual BOOL OnInitDialog();/初始化函数afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);/控件窗口函数 用于画出控件CboBox year,mo,day;char *name,*num,*autho,*pr,*time,*price;afx_msg void OnBnClickedOk();