日历记事本 软件设计.docx
《日历记事本 软件设计.docx》由会员分享,可在线阅读,更多相关《日历记事本 软件设计.docx(42页珍藏版)》请在冰豆网上搜索。
![日历记事本 软件设计.docx](https://file1.bdocx.com/fileroot1/2023-2/23/5f529d6a-38bf-4f93-9ba4-907e07fdf9cf/5f529d6a-38bf-4f93-9ba4-907e07fdf9cf1.gif)
日历记事本软件设计
课程设计报告
(2013--2014年度第二学期)
名称:
软件设计与实践
题目:
日历记事本设计
院系:
计算机系
班级:
计科1103
学号:
************
*******
指导教师:
软件设计与实践教学组
设计周数:
2
成绩:
日期:
2014年7月11日
一、课程设计的目的与要求
1.目的:
通过综合性实验的设计,使学生综合训练自己的需求分析、系统设计、编程、测试等各种能力,积累软件开发的经验,提高学生进行软件开发所需具备的专业素质以及团队协作能力。
2.要求:
完成一个GUI界面的日历记事本的分析、设计、编程、测试工作。
二、设计正文
1.需求规格说明书
编写的日历记事本,拥有了现实日历很难很快查询实现的功能。
现在电脑使用用户越来越多,就不需要购买现实的日历,而通过这个小小的程序就可以帮助人们知道现在和未来的日期,还可以查询你想要的日期。
能够给用户带来更加简单和实用的感觉。
在查询日期时,可以对日期进行日志添加、删除和修改。
附带的记事本可以记下自己私有的事情。
方便性:
是一种虚拟的日历而不是现实的,查询日期的速度快,查询准确。
使用户能更快的知道自己想要的日期。
并对日期进行日志操作。
安全性:
尤于本软件属于公开的建议小工具软件,所以主界面并不需要设计密码验证功能,直截了当的界面希望能够满足用户的需求。
但当你记录你的私有事情时,可以有用简单的访问控制。
需要匹配秘密。
实用性:
不需要用户去购买其他现实日历,只需拥有这个小小的程序。
可以记录所需要记录的事情。
2.设计说明书
2.1日历记事本,就是用MFC做一个小小的程序,通过这个程序可以看到当前的日期,单击界面上相应的按钮时间和日期都会相应的变动,当然这种变动是准确的,这就是一个简单的日历查询,可以针对查询的日期进行日志的简单操作。
我们做的这个程序设计,我觉得主要是主框架界面的设计,很多代码都是用来设计界面的,设计界面时要考虑各种小按钮的设计,一个大范围窗体的总体设计,面板的设计等等。
逐渐把信息以及事件相应添加到我们要设计的界面里就可以了。
在功能设计方面设计阶段就比较简单了,只要在相应的按钮下,设计事件监听,以及设计相应的消息响应方法。
总之,做这个程序设计主要包括界面设计和功能设计两个方面。
2.2日历记事本的功能设计
1、包含的功能有:
年、月、日的显示和快速的查询。
2、点击界面按钮,查询日期和对应的年、月、日都会显示在界面框内。
3、点击相应的菜单可以对查询的日期进日志的添加,修改和保存。
4、程序设计了一个独立的记事本窗口,供用户记录自己想要记录的秘密事。
5、程序可以能自动根据你单击的按钮判断出相对应的时间和日期。
6、帮助部分:
用户手册和制作人信息。
三、课程设计
3.1总体设计
1>功能图
2>流程图
3.2E-R图
3.3数据库部分设计
UserMessage表
字段名
字段含义
数据类型
是否为空
是否主键
User_ID
ID
int
否
是
User_Name
账号
varchar(20)
否
否
User_PassWord
密码
varchar(20)
否
否
DailyMessage表
字段名
字段含义
数据类型
是否为空
是否主键
Daily_ID
日志ID
int
否
是
Date_ID
日期ID
int
否
否
User_ID
用户ID
int
否
否
Daily_Daily
日志
Text
否
否
Daily_Time
时间
varchar(10)
否
否
DateMessage表
字段名
字段含义
数据类型
是否为空
是否主键
Date_ID
日期ID
int
否
是
Date_Date
日期
Date
否
否
四、程序实现
界面:
选择日期显示普通日志:
打开私人日志:
增加日志:
删除界面:
修改界面:
退出部分:
代码实现:
主体部分乃CCalendarDlg:
//CalendarDlg.cpp:
实现文件
//
#include"stdafx.h"
#include"Calendar.h"
#include"CalendarDlg.h"
#include"afxdialogex.h"
#include"UserLogin.h"
#include"DailyMessage.h"
#include"AddMessage.h"
#include"ZhuCe.h"
#include"OutChioose.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
structRemindStruct
{
CStringRemindTime;
inthour;
intminute;
}*RemindData;
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
publicCDialogEx
{
public:
CAboutDlg();
//对话框数据
enum{IDD=IDD_ABOUTBOX};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msgvoidOnBnClickedOk();
};
CAboutDlg:
:
CAboutDlg():
CDialogEx(CAboutDlg:
:
IDD)
{
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialogEx:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx)
ON_BN_CLICKED(IDOK,&CAboutDlg:
:
OnBnClickedOk)
END_MESSAGE_MAP()
//CCalendarDlg对话框
CCalendarDlg:
:
CCalendarDlg(CWnd*pParent/*=NULL*/)
:
CDialogEx(CCalendarDlg:
:
IDD,pParent)
m_UserID(0)
{
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_Message=_T("");
}
voidCCalendarDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialogEx:
:
DoDataExchange(pDX);
DDX_Control(pDX,IDC_MONTHCALENDAR,m_CalendarCtrl);
DDX_Text(pDX,IDC_MESSAGE,m_Message);
DDX_Control(pDX,IDC_MESSAGE,m_EditCtrl);
}
BEGIN_MESSAGE_MAP(CCalendarDlg,CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_NOTIFY(MCN_SELECT,IDC_MONTHCALENDAR,&CCalendarDlg:
:
OnSelectMonthcalendar)
ON_BN_CLICKED(IDC_RECEIVE,&CCalendarDlg:
:
OnBnClickedReceive)
ON_BN_CLICKED(IDC_PRIVATEMES,&CCalendarDlg:
:
OnBnClickedPrivatemes)
ON_BN_CLICKED(IDC_DELETEMES,&CCalendarDlg:
:
OnBnClickedDeletemes)
ON_BN_CLICKED(IDC_CHANGEMES,&CCalendarDlg:
:
OnBnClickedChangemes)
ON_BN_CLICKED(IDC_ADDMES,&CCalendarDlg:
:
OnBnClickedAddmes)
ON_BN_CLICKED(IDC_OUTPRIVATEDAILY,&CCalendarDlg:
:
OnBnClickedOutprivatedaily)
ON_COMMAND(ID_32773,&CCalendarDlg:
:
OnShowDaily)
ON_COMMAND(ID_32774,&CCalendarDlg:
:
OnAddDaily)
ON_COMMAND(ID_32775,&CCalendarDlg:
:
OnChangeDaily)
ON_COMMAND(ID_32776,&CCalendarDlg:
:
OnDeleteDaily)
ON_COMMAND(ID_32778,&CCalendarDlg:
:
On32778)
ON_COMMAND(ID_32779,&CCalendarDlg:
:
On32779)
ON_COMMAND(ID_32781,&CCalendarDlg:
:
OnZhuCe)
ON_NOTIFY(MCN_SELCHANGE,IDC_MONTHCALENDAR,&CCalendarDlg:
:
OnMcnSelchangeMonthcalendar)
ON_WM_CLOSE()
ON_MESSAGE(WM_SHOWTASK,onShowTask)
ON_COMMAND(ID_32782,&CCalendarDlg:
:
OnAbout)
ON_STN_CLICKED(IDC_PICTURE,&CCalendarDlg:
:
OnStnClickedPicture)
END_MESSAGE_MAP()
//CCalendarDlg消息处理程序
BOOLCCalendarDlg:
:
OnInitDialog()
{
CDialogEx:
:
OnInitDialog();
//将“关于...”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
BOOLbNameValid;
CStringstrAboutMenu;
bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);//设置大图标
SetIcon(m_hIcon,FALSE);//设置小图标
//TODO:
在此添加额外的初始化代码
//初始化提醒功能
m_RemindNum=0;
m_RemindFlg=false;
m_EditCtrl.EnableWindow(false);
GetDlgItem(IDC_OUTPRIVATEDAILY)->EnableWindow(false);
//初始化用户若无则m_UserID为0
m_UserID=1;
GetDlgItem(IDC_USER)->SetWindowText("普通日志");
//初试化窗口,使其收缩
if(RectLarge.IsRectNull())//判断RectLarge是否为0
{
CRectRectSeparator;
GetWindowRect(&RectLarge);//获取窗口矩形大小
GetDlgItem(IDC_DIVIDE)->GetWindowRect(&RectSeparator);
RectSmall.top=RectLarge.top;
RectSmall.left=RectLarge.left;
RectSmall.right=RectSeparator.right;
RectSmall.bottom=RectSeparator.bottom;
}
SetWindowPos(NULL,0,0,RectSmall.Width(),RectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);//设置窗口收缩
//显示当前时间
CStringstrMsg;
CTimetime;
time=CTime:
:
GetCurrentTime();//获取当前选中的日期
strMsg.Format("%d:
%d:
%d",time.GetHour(),time.GetMinute(),time.GetSecond());
HWNDCurrentHwnd=GetDlgItem(IDC_CURRENTTIME)->GetSafeHwnd();
GetDlgItem(IDC_CURRENTTIME)->SetWindowText(strMsg);
//添加时钟
SetTimer(1,1000,NULL);
m_CalendarCtrl.SetColor(MCSC_TITLETEXT,RGB(255,0,0));
//数据库
m_pConnection.CreateInstance(_uuidof(Connection));
m_pRecordset.CreateInstance(_uuidof(Recordset));
try
{
m_pConnection->Open("Provider=SQLOLEDB;server=127.0.0.1;Uid=sa;Pwd=123;Database=CalendarDate",
"","",adModeUnknown);
}
catch(_com_error*e)
{
MessageBox(e->ErrorMessage());
}
returnTRUE;//除非将焦点设置到控件,否则返回TRUE
}
voidCCalendarDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx:
:
OnSysCommand(nID,lParam);
}
}
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
voidCCalendarDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast(dc.GetSafeHdc()),0);
//使图标在工作区矩形中居中
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//绘制图标
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialogEx:
:
OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSORCCalendarDlg:
:
OnQueryDragIcon()
{
returnstatic_cast(m_hIcon);
}
voidCCalendarDlg:
:
OnTimer(UINT_PTRnIDEvent)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
//显示当前时间
CStringstrMsg;
CTimetime;
time=CTime:
:
GetCurrentTime();
strMsg.Format("%d:
%d:
%d",time.GetHour(),time.GetMinute(),time.GetSecond());
GetDlgItem(IDC_CURRENTTIME)->SetWindowText(strMsg);
if(m_RemindFlg&&(time.GetHour()==RemindData[m_RemindNum].hour)
&&(time.GetMinute()==RemindData[m_RemindNum].minute))
{
this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
Shell_NotifyIcon(NIM_DELETE,&nid);//在托盘区添加图标
Shake();
ShowRemindMessage();
m_RemindFlg=false;
}
CDialogEx:
:
OnTimer(nIDEvent);
}
voidCCalendarDlg:
:
OnSelectMonthcalendar(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMSELCHANGEpSelChange=reinterpret_cast(pNMHDR);
//TODO:
在此添加控件通知处理程序代码
UpdateData();
m_Message="";
//设置窗口伸张
SetWindowPos(NULL,0,0,RectLarge.Width(),RectLarge.Height()-12,SWP_NOMOVE|SWP_NOMOVE);
CStringstrMsg,strUserID;
SYSTEMTIMEtime;
m_CalendarCtrl.GetCurSel(&time);//获取当前选中的日期
strMsg.Format("%d-%d-%d",time.wYear,time.wMonth,time.wDay);
//读取数据库
CStringselectstr=_T("");
selectstr.Format("select*fromDailyMessage,DateMessagewhereDailyMessage.Date_ID=DateMessage.Date_IDandDateMessage.Date_Date='%s'andDailyMessage.User_ID='%d'",strMsg,1);
try
{
m_pRecordset->Open((_variant_t)selectstr,m_pConnection.GetInterfacePtr(),
adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error*e)
{
MessageBox(e->ErrorMessage());
}
if(m_pRecordset->adoEOF)
{
//无日志
if(m_UserID!
=1)
{
m_pRecordset->Close();
selectstr.Format("select*fromDailyMessage,DateMessagewhereDailyMessage.Date_ID=DateMessage.Date_IDandDateMessage.Date_Date='%s'andDailyMessage.User_ID='%d'",strMsg,m_UserID);
try
{
m_pRecordset->Open((_variant_t)selectstr,m_pConnection.GetInterfacePtr(),
adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error*e)
{
MessageBox(e->ErrorMessage());
}
if(!
m_pRecordset->adoEOF)
{
//有日志
GetDlgItem(IDC_DELETEMES)->EnableWindow(TRUE);
GetDlgItem(IDC_CHANGEMES)->EnableWindow(TRUE);
CStringstrMessage;
m_pRecordset->MoveFirst();
while(!
m_pRecordset->adoEOF)
{
strMessage.Format("%s:
%s\r\n",(LPCSTR)(_bstr_t)m_pRecordset->GetCollect("Daily_Time"),
(LPCSTR)(_bstr_t)m_pRecordset->GetCollect("Daily_Daily"));
m_Message+=strMessage;
m_pRecordset->MoveNext();